{"id":465097,"date":"2024-09-26T13:13:14","date_gmt":"2024-09-26T13:13:14","guid":{"rendered":"https:\/\/webkul.com\/blog\/?p=465097"},"modified":"2024-10-24T06:01:35","modified_gmt":"2024-10-24T06:01:35","slug":"magento-2-cart-page-using-reactjs","status":"publish","type":"post","link":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/","title":{"rendered":"How to make Magento 2 cart page using ReactJS"},"content":{"rendered":"\n<p>Learn how to build a Magento 2 cart page using ReactJs in a&nbsp;<a href=\"https:\/\/webkul.com\/headless-commerce-development-services\/\" target=\"_blank\" rel=\"noreferrer noopener\">headless development environment<\/a>.<\/p>\n\n\n\n<p>1. <a href=\"#introduction\">Introduction<\/a><\/p>\n\n\n\n<p>2. <a href=\"#cart-set-up\">Setting Up Your Cart Page With ReactJs<\/a><\/p>\n\n\n\n<p>3. <a href=\"#cart-page-functions\">Creating Your Cart Page with ReactJs<\/a><\/p>\n\n\n\n<p>4. <a href=\"#cart-page-functions\">Creating Your Cart Page with ReactJs<\/a><\/p>\n\n\n\n<p>5. <a href=\"#conclusions\">Conclusion<\/a><\/p>\n\n\n\n<p>By leverage of <a href=\"https:\/\/webkul.com\/magento2-headless-development\/\" target=\"_blank\" rel=\"noreferrer noopener\">Magento 2 and headless<\/a> architecture, By integrating Magento 2 backend with React, allowing for a more flexible and dynamic user experience and the full potential of&nbsp;<a href=\"https:\/\/webkul.com\/blog\/what-is-headless-ecommerce\/\" target=\"_blank\" rel=\"noreferrer noopener\">headless commerce<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"introduction\">Introduction<\/h2>\n\n\n\n<p>Creating a cart page in React for your Magento 2 store can significantly influence whether a user decides to buy your product or move on.<\/p>\n\n\n\n<p>For product page setup you can check out our another blog on <a href=\"https:\/\/webkul.com\/blog\/magento2-product-page-using-reactjs\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>How To Create Magento 2 Product Page In Reactjs<\/strong><\/a>.<\/p>\n\n\n\n<p>This guide will take you through the process of building an efficient and user-friendly cart page, featuring code examples and detailed explanations.<\/p>\n\n\n\n<p>And, In this blog you are going to know about <a href=\"https:\/\/webkul.com\/magento-2-react-development-services\/\" target=\"_blank\" rel=\"noreferrer noopener\">Magento 2 React Development<\/a>.<\/p>\n\n\n\n<p>You\u2019ll gain valuable insights into&nbsp;<a href=\"https:\/\/webkul.com\/reactjs-development-services\/\" target=\"_blank\" rel=\"noreferrer noopener\">React.js development<\/a>&nbsp;along the way.<\/p>\n\n\n\n<p>You\u2019ll learn how to fetch data from Magento 2 GraphQL API, manage state, and design a responsive layout that enhances the overall shopping experience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cart-set-up\">Setting Up Your Cart Page with ReactJs<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">1.&nbsp;<strong>Create Your ReactJs Project:<\/strong><\/h4>\n\n\n\n<p>Open your terminal and run the following command to <a href=\"https:\/\/webkul.com\/blog\/create-react-app\/\">create a new React.Js<\/a> Project<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">npx create-react-app my-magento-store\ncd my-magento-store<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2. Navigate to root directory:<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\">cd my-magento-store<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3. Install Necessary Packages In Your&nbsp;<strong>ReactJs<\/strong>:<\/h4>\n\n\n\n<p>As, I created this with Tailwind, Eslint, React router dom, TypeScript so:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">\/\/ typescript and eslint\nnpm install -D typescript eslint\n\n\/\/ tailwind css\nnpm install -D tailwindcss postcss autoprefixer\nnpx tailwindcss init -p\n\n\/\/ react router\nnpm install react-router-dom<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cart-page-functions\">Creating Your Cart Page with ReactJs<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>1. Set Up GraphQL Queries:<\/strong><\/h4>\n\n\n\n<p>As we are using <a href=\"https:\/\/developer.adobe.com\/commerce\/webapi\/graphql\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Magento 2&nbsp;GraphQl<\/a>&nbsp;API. So lets, create a file for your GraphQL queries. This keeps your code organized.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">mkdir src\/components\/cart\ntouch src\/components\/cart\/queries.ts<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\">export const GET_CART = `\n    query ($cartId: String!) {\n  cart(cart_id: $cartId) {\n    id\n    total_quantity\n    applied_coupons {\n      code\n    }\n    items {\n      cartItemId: uid\n      quantity\n      product {\n        name\n        sku\n        stock_status\n        description {\n          html\n        }\n        url_key\n        name\n        thumbnail {\n          id: url\n          url\n          label\n        }\n      }\n\n      prices {\n        price {\n          currency\n          value\n        }\n        row_total {\n          currency\n          value\n        }\n        row_total_including_tax {\n          currency\n          value\n        }\n        total_item_discount {\n          currency\n          value\n        }\n        discounts {\n          label\n          amount {\n            currency\n            value\n          }\n        }\n      }\n    }\n    shipping_addresses {\n      country {\n        code\n        label\n      }\n      region {\n        code\n        region_id\n        label\n      }\n      available_shipping_methods {\n        amount {\n          currency\n          value\n        }\n        available\n        carrier_code\n        carrier_title\n        error_message\n        method_code\n        method_title\n      }\n      selected_shipping_method {\n        amount {\n          currency\n          value\n        }\n        carrier_title\n        carrier_code\n        method_code\n      }\n    }\n    prices {\n      applied_taxes {\n        amount {\n          currency\n          value\n        }\n        label\n      }\n      discounts {\n        amount {\n          currency\n          value\n        }\n        label\n      }\n      grand_total {\n        currency\n        value\n      }\n      subtotal_excluding_tax {\n        currency\n        value\n      }\n    }\n  }\n}\n`;\n\nexport const CREATE_EMPTY_CART_MUTATION = `\n  mutation {\n    createEmptyCart\n  }\n`;\n\nexport const UPDATE_CART_MUTATION = `\n      mutation UpdateCartItem($cartId: String!, $cartItems:&#091;CartItemUpdateInput]!) {\n        updateCartItems(input: { cart_id: $cartId, cart_items:$cartItems }) {\n          cart {\n            id\n            items {\n              id\n              quantity\n            }\n          }\n        }\n      }\n    `;\n\nexport const DELETE_CART_MUTATION = `\n    mutation DeleteCartItem($cartId: String!, $itemId: ID!) {\n      removeItemFromCart(input: { cart_id: $cartId, cart_item_uid: $itemId }) {\n        cart {\n          id\n          items {\n            id\n            quantity\n          }\n        }\n      }\n    }\n  `;\n\nexport const APPLY_COUPON_MUTATION = `\n        mutation ApplyCoupon($cartId: String!, $couponCode: String!) {\n          applyCouponToCart(input: { cart_id: $cartId, coupon_code: $couponCode }) {\n            cart {\n              id\n              applied_coupons {\n                code\n              }\n            }\n          }\n        }\n      `;\n\nexport const REMOVE_COUPON_MUTATION = `\n        mutation RemoveCoupon($cartId: String!) {\n          removeCouponFromCart(input: { cart_id: $cartId}) {\n            cart {\n              id\n              applied_coupons {\n                code\n              }\n            }\n          }\n        }\n      `;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2. Created a fetch handler in reactjs:<\/h4>\n\n\n\n<p>For reusability created a fetch handler function in file called FetchHandler.ts.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">\/\/ src\/component\/cart\/FetchHandler.ts\n\nexport interface GraphQLResponse&lt;T&gt; {\n  data: T;\n  errors?: Array&lt;{ message: string }&gt;;\n}\n\nexport const fetchGraphQL = &lt;T&gt;(query: string, variables: Record&lt;string, any&gt; = {}): Promise&lt;T&gt; =&gt; {\n  return fetch(YOUR_MAGENTO_ENDPOINT, {\n    method: &quot;POST&quot;,\n    headers: {\n      &quot;Content-Type&quot;: &quot;application\/json&quot;,\n    },\n    body: JSON.stringify({ query, variables }),\n  })\n    .then((response) =&gt; response.json())\n    .then((result: GraphQLResponse&lt;T&gt;) =&gt; {\n      if (result.errors) {\n        throw new Error(result.errors.map((err) =&gt; err.message).join(&quot;, &quot;));\n      }\n      return result.data;\n    });\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3. Some custom hooks to manage cart :<\/h4>\n\n\n\n<p>Here, I managed things by creating custom hooks according to their functionality in cart.ts<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">\/\/custom-hooks to manage cart functionalities\n\nimport { useEffect, useState } from &quot;react&quot;;\nimport { fetchGraphQL } from &quot;.\/FetchHandler&quot;;\nimport {\n  APPLY_COUPON_MUTATION,\n  CREATE_EMPTY_CART_MUTATION,\n  DELETE_CART_MUTATION,\n  GET_CART,\n  REMOVE_COUPON_MUTATION,\n  UPDATE_CART_MUTATION,\n} from &quot;.\/queries&quot;;\ninterface CreateCartResponse {\n  createEmptyCart: string;\n}\n\nexport default function useCheckoutQuoteFetch() {\n  const &#091;cartId, setCartId] = useState&lt;string | null&gt;(() =&gt; {\n    return localStorage.getItem(&quot;cartId&quot;) || null;\n  });\n  const savedItems = localStorage.getItem(&quot;cartItems&quot;);\n  const &#091;items, setItems] = useState&lt;any&gt;(() =&gt; {\n    return savedItems ? JSON.parse(savedItems) : &#091;];\n  });\n\n  const createCart = async () =&gt; {\n    fetchGraphQL&lt;CreateCartResponse&gt;(CREATE_EMPTY_CART_MUTATION)\n      .then((data) =&gt; {\n        if (data.createEmptyCart) {\n          localStorage.setItem(&quot;cartId&quot;, data.createEmptyCart);\n          setCartId(data.createEmptyCart);\n        }\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Error creating cart:&quot;, error.message);\n      });\n  };\n  useEffect(() =&gt; {\n    if (!cartId) {\n      createCart();\n    }\n  });\n\n  const getCart = async () =&gt; {\n    const variables = {\n      cartId: cartId,\n    };\n\n    fetchGraphQL&lt;{ cart: { id: string; items: Array&lt;{ id: string; quantity: number }&gt; } }&gt;(GET_CART, variables)\n      .then((response) =&gt; {\n        const cart = response?.cart;\n        console.log(cart);\n        if (cart) {\n          localStorage.setItem(&quot;cartItems&quot;, JSON.stringify(cart));\n          setItems(cart);\n        }\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Error adding item to cart:&quot;, error.message);\n      });\n  };\n  useEffect(() =&gt; {\n    getCart();\n  }, &#091;]);\n  useEffect(() =&gt; {\n    localStorage.setItem(&quot;cartItems&quot;, JSON.stringify(items));\n  }, &#091;items]);\n\n  return { cartId, items, getCart };\n}\nexport const useUpdateCartItem = () =&gt; {\n  const &#091;cartId, setCartId] = useState&lt;string | null&gt;(() =&gt; {\n    return localStorage.getItem(&quot;cartId&quot;) || null;\n  });\n\n  const updateCartItem = async (itemId: string, quantity: string) =&gt; {\n    const variables = {\n      cartId,\n      cartItems: &#091;{ cart_item_uid: itemId, quantity: quantity }],\n    };\n\n    return fetchGraphQL&lt;{ updateCartItem: { cart: any } }&gt;(UPDATE_CART_MUTATION, variables)\n      .then((data) =&gt; {\n        return data.updateCartItem.cart;\n      })\n      .catch((err) =&gt; {\n        console.error(&quot;Error updating cart item:&quot;, (err as Error).message);\n      });\n  };\n\n  return { cartId, setCartId, updateCartItem };\n};\n\nexport const useDeleteCartItem = () =&gt; {\n  const &#091;cartId, setCartId] = useState&lt;string | null&gt;(() =&gt; {\n    return localStorage.getItem(&quot;cartId&quot;) || null;\n  });\n  const { getCart } = useCheckoutQuoteFetch();\n\n  const deleteCartItem = (itemId: string) =&gt; {\n    const variables = {\n      cartId,\n      itemId,\n    };\n\n    return fetchGraphQL&lt;{ removeItemFromCart: { cart: any } }&gt;(DELETE_CART_MUTATION, variables)\n      .then((data) =&gt; {\n        getCart();\n        return data.removeItemFromCart.cart;\n      })\n      .catch((err) =&gt; {\n        console.error(&quot;Error deleting cart item:&quot;, (err as Error).message);\n      });\n  };\n\n  return { cartId, setCartId, deleteCartItem };\n};\n\nexport const useApplyCoupon = () =&gt; {\n  const &#091;cartId, setCartId] = useState&lt;string | null&gt;(() =&gt; {\n    return localStorage.getItem(&quot;cartId&quot;) || null;\n  });\n  const { getCart } = useCheckoutQuoteFetch();\n\n  const applyCoupon = (couponCode: string) =&gt; {\n    const variables = {\n      cartId,\n      couponCode,\n    };\n\n    return fetchGraphQL&lt;{ applyCouponToCart: { cart: any } }&gt;(APPLY_COUPON_MUTATION, variables)\n      .then((data) =&gt; {\n        getCart();\n        return data.applyCouponToCart.cart;\n      })\n      .catch((err) =&gt; {\n        console.error(&quot;Error applying coupon:&quot;, (err as Error).message);\n      });\n  };\n\n  return { cartId, setCartId, applyCoupon };\n};\nexport const useRemoveCoupon = () =&gt; {\n  const &#091;cartId, setCartId] = useState&lt;string | null&gt;(() =&gt; {\n    return localStorage.getItem(&quot;cartId&quot;) || null;\n  });\n  const { getCart } = useCheckoutQuoteFetch();\n\n  const removeCoupon = () =&gt; {\n\n    const variables = {\n      cartId,\n    };\n\n    return fetchGraphQL&lt;{ removeCouponFromCart: { cart: any } }&gt;(REMOVE_COUPON_MUTATION, variables)\n      .then((data) =&gt; {\n        getCart();\n        return data.removeCouponFromCart.cart;\n      })\n      .catch((err) =&gt; {\n        console.error(&quot;Error removing coupon:&quot;, (err as Error).message);\n      });\n  };\n\n  return { cartId, setCartId, removeCoupon };\n};<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"696\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1200x696.webp\" alt=\"desktop view of cart page react.js\" class=\"wp-image-465630\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1200x696.webp 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-300x174.webp 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-250x145.webp 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-768x446.webp 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1536x891.webp 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart.webp 1694w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center has-small-font-size\" style=\"line-height:.9\"><\/p>\n\n\n\n<div class=\"wp-block-columns wk-bg-radial-gradient is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large wk-video-mockup-frame\"><img decoding=\"async\" width=\"412\" height=\"732\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-2.webp\" alt=\"mobile view cart page reactjs\" class=\"wp-image-465905\" style=\"object-fit:cover\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-2.webp 412w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-2-169x300.webp 169w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-2-140x249.webp 140w\" sizes=\"(max-width: 412px) 100vw, 412px\" loading=\"lazy\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column wk-video-mockup-frame is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large wk-video-mockup-frame\"><img decoding=\"async\" width=\"412\" height=\"732\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-3.webp\" alt=\"mobile view cart page reactjs\" class=\"wp-image-465906\" style=\"object-fit:cover\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-3.webp 412w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-3-169x300.webp 169w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/mobilecart-2-edited-3-140x249.webp 140w\" sizes=\"(max-width: 412px) 100vw, 412px\" loading=\"lazy\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\">4. Cart Page UI Component :<\/h4>\n\n\n\n<p>In this component, I have successfully managed the shopping cart UI and its associated functionalities. <\/p>\n\n\n\n<p>It integrates various features to provide a seamless and comprehensive shopping cart experience for users.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">import React, { useEffect, useState } from &quot;react&quot;;\nimport UpdateCartForm from &quot;.\/CartUpdate&quot;;\nimport useCheckoutQuoteFetch, { useDeleteCartItem, useUpdateCartItem } from &quot;.\/cart&quot;;\nimport ApplyCoupon from &quot;.\/ApplyCoupon&quot;;\nexport const formatPrice = (value: number, currency: string) =&gt; {\n  return value?.toLocaleString(&quot;en-US&quot;, {\n    style: &quot;currency&quot;,\n    currency,\n  });\n};\nexport default function Cart() {\n  useCheckoutQuoteFetch();\n  const &#091;items, setItems] = useState(() =&gt; {\n    const cartQuote = localStorage.getItem(&quot;cartItems&quot;);\n    return JSON.parse(cartQuote || &quot;{}&quot;).items || &#091;];\n  });\n  const &#091;cartData, setCartData] = useState(() =&gt; {\n    const cartQuote = localStorage.getItem(&quot;cartItems&quot;);\n    return JSON.parse(cartQuote || &quot;{}&quot;);\n  });\n\n  useEffect(() =&gt; {\n    const handleStorageChange = () =&gt; {\n      const cartQuote = localStorage.getItem(&quot;cartItems&quot;);\n      const cartData = JSON.parse(cartQuote || &quot;{}&quot;) || &#091;];\n      setItems(cartData.items || &#091;]);\n      setCartData(cartData);\n    };\n\n    handleStorageChange();\n\n    window.addEventListener(&quot;storage&quot;, handleStorageChange);\n\n    return () =&gt; {\n      window.removeEventListener(&quot;storage&quot;, handleStorageChange);\n    };\n  });\n  const &#091;itemData, setItemData] = useState({ qty: &quot;&quot;, id: &quot;&quot; });\n  const { updateCartItem } = useUpdateCartItem();\n  const handleSubmit = async (event: React.FormEvent) =&gt; {\n    event.preventDefault();\n    updateCartItem(itemData.id, itemData.qty)\n      .then((updatedCart) =&gt; {\n        console.log(&quot;Updated cart:&quot;, updatedCart);\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Failed to update cart item:&quot;, error);\n      });\n  };\n  const { deleteCartItem } = useDeleteCartItem();\n\n  const handleDelete = (itemId: string) =&gt; {\n    deleteCartItem(itemId)\n      .then((deleteCartItem) =&gt; {\n        console.log(&quot;Updated cart after deletion:&quot;, deleteCartItem);\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Failed to delete cart item:&quot;, error);\n      });\n  };\n  const prices = cartData?.prices;\n  const selectedMethod = cartData?.shipping_addresses?.&#091;0]?.selected_shipping_method;\n  return (\n&lt;div className=&quot;container mx-auto&quot;&gt;\n      &lt;h1 className=&quot;px-4 mt-4 mb-10 text-5xl md:px-0 font-extralight&quot;&gt;Shopping Cart&lt;\/h1&gt;\n      &lt;div className=&quot;grid gap-16 md:grid-cols-12&quot;&gt;\n        &lt;div className=&quot;order-2 -mt-10 md:mt-0 md:col-span-8 md:order-1&quot;&gt;\n          &lt;form onSubmit={handleSubmit} className=&quot;divide-y&quot;&gt;\n            &lt;div className=&quot;hidden p-3 mt-6 text-sm font-medium md:flex columns-2&quot;&gt;\n              &lt;p className=&quot;w-full&quot;&gt;Item&lt;\/p&gt;\n              &lt;div className=&quot;flex items-center justify-between w-full&quot;&gt;\n                &lt;p className=&quot;ml-9 md:ml-0&quot;&gt;Price&lt;\/p&gt;\n                &lt;p className=&quot;ml-9 md:ml-0&quot;&gt;Qty&lt;\/p&gt;\n                &lt;p className=&quot;ml-9 md:ml-0&quot;&gt;Subtotal&lt;\/p&gt;\n              &lt;\/div&gt;\n            &lt;\/div&gt;\n            {items.map((item: any) =&gt; (\n              &lt;div key={item?.cartItemId} className=&quot;px-4 py-6 md:px-2&quot;&gt;\n                &lt;div className=&quot;md:columns-2&quot;&gt;\n                  &lt;div className=&quot;flex gap-4&quot;&gt;\n                    &lt;img\n                      src={item?.product?.thumbnail?.url}\n                      alt=&quot;&quot;\n                      className=&quot;object-cover object-center w-16 h-16 md:w-40 md:h-48&quot;\n                    \/&gt;\n                    &lt;h2 className=&quot;text-lg font-light md:text-xl&quot;&gt;{item?.product?.name}&lt;\/h2&gt;\n                  &lt;\/div&gt;\n                  &lt;div className=&quot;flex items-center justify-between w-full gap-4 text-lg font-medium max-w-72 md:max-w-full md:text-xl&quot;&gt;\n                    &lt;div className=&quot;flex flex-col gap-2&quot;&gt;\n                      &lt;p className=&quot;text-sm font-medium md:hidden&quot;&gt;Price&lt;\/p&gt;\n                      &lt;p&gt;{formatPrice(item?.prices?.price?.value, item?.prices?.price?.currency)}&lt;\/p&gt;\n                    &lt;\/div&gt;\n                    &lt;div className=&quot;flex flex-col gap-2&quot;&gt;\n                      &lt;p className=&quot;text-sm font-medium md:hidden&quot;&gt;Qty&lt;\/p&gt;\n                      &lt;UpdateCartForm itemId={item?.cartItemId} qty={item?.quantity} setItemData={setItemData} \/&gt;\n                    &lt;\/div&gt;{&quot; &quot;}\n                    &lt;div className=&quot;flex flex-col gap-2&quot;&gt;\n                      &lt;p className=&quot;text-sm font-medium md:hidden&quot;&gt;Subtotal&lt;\/p&gt;\n                      &lt;p&gt;{formatPrice(item?.prices?.row_total?.value, item?.prices?.row_total?.currency)}&lt;\/p&gt;\n                    &lt;\/div&gt;\n                  &lt;\/div&gt;\n                &lt;\/div&gt;{&quot; &quot;}\n                &lt;div className=&quot;flex items-center gap-4 ml-auto max-w-fit&quot;&gt;\n                  &lt;svg\n                    className=&quot;w-5 h-5 text-black&quot;\n                    fill=&quot;none&quot;\n                    strokeWidth={2}\n                    stroke=&quot;currentColor&quot;\n                    viewBox=&quot;0 0 24 24&quot;\n                    xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;\n                    aria-hidden=&quot;true&quot;\n                  &gt;\n                    &lt;path\n                      strokeLinecap=&quot;round&quot;\n                      strokeLinejoin=&quot;round&quot;\n                      d=&quot;m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Zm0 0L19.5 7.125&quot;\n                    \/&gt;\n                  &lt;\/svg&gt;\n                  &lt;button type=&quot;button&quot; className=&quot;bg-transparent&quot; onClick={() =&gt; handleDelete(item?.cartItemId)}&gt;\n                    &lt;svg\n                      className=&quot;w-5 h-5 text-black&quot;\n                      fill=&quot;none&quot;\n                      strokeWidth={3}\n                      stroke=&quot;currentColor&quot;\n                      viewBox=&quot;0 0 24 24&quot;\n                      xmlns=&quot;http:\/\/www.w3.org\/2000\/svg&quot;\n                      aria-hidden=&quot;true&quot;\n                    &gt;\n                      &lt;path\n                        strokeLinecap=&quot;round&quot;\n                        strokeLinejoin=&quot;round&quot;\n                        d=&quot;m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0&quot;\n                      \/&gt;\n                    &lt;\/svg&gt;\n                  &lt;\/button&gt;\n                &lt;\/div&gt;\n              &lt;\/div&gt;\n            ))}\n            &lt;div className=&quot;flex justify-center py-6 md:justify-end md:my-6 border-y border-y-slate-300 md:border-y-0&quot;&gt;\n              &lt;button type=&quot;submit&quot; className=&quot;px-4 py-2 text-sm border border-solid border-neutral-300 bg-neutral-200&quot;&gt;\n                Update Shopping Cart\n              &lt;\/button&gt;\n            &lt;\/div&gt;\n          &lt;\/form&gt;\n          &lt;div className=&quot;py-3 mb-10 md:py-0 border-y border-y-slate-300 md:border-y-0&quot;&gt;\n            &lt;ApplyCoupon \/&gt;\n          &lt;\/div&gt;\n        &lt;\/div&gt;\n        &lt;div className=&quot;order-1 w-full p-6 md:col-span-4 md:order-2 bg-neutral-100 max-h-fit&quot;&gt;\n          &lt;div className=&quot;flex flex-col divide-y divide-slate-300&quot;&gt;\n            &lt;p className=&quot;pb-4 text-2xl font-extralight&quot;&gt;Summary&lt;\/p&gt;\n            &lt;div className=&quot;flex flex-col gap-4 py-4 text-sm font-light&quot;&gt;\n              &lt;div className=&quot;flex items-center justify-between&quot;&gt;\n                &lt;p&gt;Subtotal&lt;\/p&gt;\n                &lt;p&gt;{formatPrice(prices?.subtotal_excluding_tax?.value, prices?.subtotal_excluding_tax?.currency)}&lt;\/p&gt;\n              &lt;\/div&gt;\n              {prices?.discounts.length &gt; 0 &amp;&amp; (\n                &lt;div className=&quot;flex items-center justify-between&quot;&gt;\n                  &lt;p&gt;Discount({cartData?.applied_coupons?.&#091;0]?.code || &quot;Free&quot;})&lt;\/p&gt;\n                  {prices?.discounts?.map((item: { amount: { value: number; currency: string } }, index: number) =&gt; (\n                    &lt;p key={index}&gt;{formatPrice(item?.amount?.value, item?.amount?.currency)}&lt;\/p&gt;\n                  ))}\n                &lt;\/div&gt;\n              )}\n              {selectedMethod &amp;&amp; (\n                &lt;div className=&quot;flex items-center justify-between&quot;&gt;\n                  &lt;p&gt;Shipping({selectedMethod?.carrier_title})&lt;\/p&gt;\n                  &lt;p&gt;{formatPrice(selectedMethod?.amount?.value, selectedMethod?.amount?.currency)}&lt;\/p&gt;\n                &lt;\/div&gt;\n              )}\n            &lt;\/div&gt;\n            &lt;div className=&quot;flex items-center justify-between py-4 font-medium&quot;&gt;\n              &lt;p&gt;Order Total&lt;\/p&gt;\n              &lt;p&gt;{formatPrice(prices?.grand_total?.value, prices?.grand_total?.currency)}&lt;\/p&gt;\n            &lt;\/div&gt;\n            &lt;div className=&quot;flex flex-col items-center w-full&quot;&gt;\n              &lt;button className=&quot;w-full px-8 py-4 my-6 font-medium text-white bg-sky-600 hover:bg-sky-700&quot;&gt;\n                Process To Checkout\n              &lt;\/button&gt;\n              &lt;p className=&quot;text-sm font-normal text-sky-500&quot;&gt;Check Out with Multiple Addresses&lt;\/p&gt;\n            &lt;\/div&gt;\n          &lt;\/div&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/div&gt;\n  );\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">5. Update Cart Item<\/h4>\n\n\n\n<p>In this component, I have effectively managed the functionalities related to update item quantity. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">import React, { useState } from &quot;react&quot;;\n\ninterface UpdateCartFormProps {\n  itemId: string;\n  setItemData: any;\n  qty: number;\n}\n\nconst UpdateCartForm: React.FC&lt;UpdateCartFormProps&gt; = ({ itemId, setItemData, qty }) =&gt; {\n  const &#091;quantity, setQuantity] = useState&lt;string&gt;(`${qty}` || &quot;1&quot;);\n  const changeHandler = (e: React.ChangeEvent&lt;HTMLInputElement&gt;) =&gt; {\n    setQuantity(e.target.value);\n    setItemData({ qty: e.target.value, id: itemId });\n  };\n  return (\n    &lt;&gt;\n      &lt;input\n        className=&quot;w-16 p-2 text-sm font-normal text-center border&quot;\n        defaultValue={qty}\n        type=&quot;text&quot;\n        value={quantity}\n        onChange={(e) =&gt; changeHandler(e)}\n        min=&quot;1&quot;\n        required\n      \/&gt;\n    &lt;\/&gt;\n  );\n};\n\nexport default UpdateCartForm;<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">6. Coupon Handler:<\/h4>\n\n\n\n<p>In this component, I have effectively managed the functionalities related to applying and removing discounts. <\/p>\n\n\n\n<p>This includes seamless integration of features that allow users to enter discount codes, view applied coupons, and easily toggle their application status, enhancing the overall shopping experience.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">import React, { useState } from &quot;react&quot;;\nimport { ChevronDownIcon } from &quot;..\/Header&quot;;\nimport { useApplyCoupon, useRemoveCoupon } from &quot;.\/cart&quot;;\n\nexport default function ApplyCoupon() {\n  const &#091;viewCoupun, setViewCoupon] = useState(false);\n  const { applyCoupon } = useApplyCoupon();\n  const cartQuote = localStorage.getItem(&quot;cartItems&quot;);\n  const cartData = JSON.parse(cartQuote || &quot;&quot;) || &#091;];\n  const &#091;code, setCode] = useState(cartData?.applied_coupons?.&#091;0]?.code || &quot;&quot;);\n  const handleSubmit = () =&gt; {\n    applyCoupon(code)\n      .then((coupon) =&gt; {\n        console.log(&quot;Updated cart after applying coupon:&quot;, coupon);\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Failed to apply coupon:&quot;, error);\n      });\n  };\n  const { removeCoupon } = useRemoveCoupon();\n  const handleRemove = () =&gt; {\n    removeCoupon()\n      .then((coupon) =&gt; {\n        setCode(&quot;&quot;);\n        console.log(&quot;Updated cart after removing coupon:&quot;, coupon);\n      })\n      .catch((error) =&gt; {\n        console.error(&quot;Failed to remove coupon:&quot;, error);\n      });\n  };\n  const appliedCoupon = cartData?.applied_coupons?.length &gt; 0 ? true : false;\n  return (\n    &lt;div className=&quot;px-4 md:px-0&quot;&gt;\n      &lt;p className=&quot;flex items-center justify-between gap-4 text-sm md:max-w-fit md:text-base text-sky-500&quot;&gt;\n        Apply Discount Code{&quot; &quot;}\n        &lt;ChevronDownIcon\n          onClick={() =&gt; setViewCoupon(!viewCoupun)}\n          className={`w-4 h-4 ${viewCoupun ? &quot;rotate-180&quot; : &quot;-rotate-0&quot;}`}\n        \/&gt;\n      &lt;\/p&gt;\n      {viewCoupun &amp;&amp; (\n        &lt;div className=&quot;flex items-center justify-between my-2 mb-6 border md:mb-0 border-slate-300 md:max-w-fit&quot;&gt;\n          &lt;input\n            type=&quot;text&quot;\n            className=&quot;px-3 max-w-44 focus:outline-0&quot;\n            value={code}\n            onChange={(e) =&gt; setCode(e.target.value)}\n          \/&gt;\n          &lt;button\n            type=&quot;button&quot;\n            className=&quot;px-3 py-1.5 text-sm bg-neutral-200&quot;\n            onClick={appliedCoupon ? handleRemove : handleSubmit}\n          &gt;\n            {appliedCoupon ? &quot;Cancel Coupon&quot; : &quot;Apply Coupon&quot;}\n          &lt;\/button&gt;\n        &lt;\/div&gt;\n      )}\n    &lt;\/div&gt;\n  );\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">7. Set Up Routes<\/h4>\n\n\n\n<p>Set your app.tsx in src according to your routing structure like this:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">import React from &quot;react&quot;;\nimport &quot;.\/App.css&quot;;\nimport { Route, Routes } from &quot;react-router-dom&quot;;\nimport Cart from &quot;.\/component\/Cart\/Cart&quot;;\nimport Header from &quot;.\/component\/Header&quot;;\n\nfunction App() {\n  return (\n    &lt;div&gt;\n      &lt;Header \/&gt;\n      &lt;Routes&gt;\n        &lt;Route path=&quot;\/cart&quot; Component={Cart} \/&gt;\n        {\/* Other routes *\/}\n      &lt;\/Routes&gt;\n    &lt;\/div&gt;\n  );\n}\n\nexport default App;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Run Your ReactJs Application:<\/strong><\/h2>\n\n\n\n<p>Finally, run your ReactJs app to see your cart page in action:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">npm start<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusions\">Conclusion<\/h2>\n\n\n\n<p>In this blog, we explored how to create a robust shopping cart page using React in conjunction with the Magento API. <\/p>\n\n\n\n<p>We covered essential functionalities, including managing cart items, applying and removing coupons, and dynamically updating the cart based on user interactions.<\/p>\n\n\n\n<p>Key takeaways include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>State Management<\/strong>: Leveraging React&#8217;s state hooks to manage cart data ensures a seamless user experience.<\/li>\n\n\n\n<li><strong>GraphQL Integration<\/strong>: Utilizing Magento 2 GraphQL API for fetching and updating cart information allows for efficient data handling and flexibility in managing cart operations.<\/li>\n\n\n\n<li><strong>User Interactions<\/strong>: Implementing custom hooks and components enhances the functionality of the shopping cart, allowing for features like item updates and coupon management.<\/li>\n\n\n\n<li><strong>Local Storage<\/strong>: Managing cart data in local storage enables persistence, ensuring users don&#8217;t lose their cart items upon page refresh.<\/li>\n<\/ul>\n\n\n\n<p>By following these principles and utilizing the components, developers can create an engaging and efficient shopping cart experience. <\/p>\n\n\n\n<p>That integrates smoothly with Magento 2 powerful e-commerce capabilities.<\/p>\n\n\n\n<p>With this foundation, you can further expand features, improve performance, and refine the user interface to meet specific business needs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to build a Magento 2 cart page using ReactJs in a&nbsp;headless development environment. 1. Introduction 2. Setting Up Your Cart Page With ReactJs 3. Creating Your Cart Page with ReactJs 4. Creating Your Cart Page with ReactJs 5. Conclusion By leverage of Magento 2 and headless architecture, By integrating Magento 2 backend with <a href=\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":496,"featured_media":465639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9121,6357],"tags":[14681,2064,2056,2070,7895,6360,13566,6359,14988,15632],"class_list":["post-465097","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-magento-2","category-react-js","tag-graphql-api","tag-javascript","tag-magento","tag-magento2","tag-react","tag-react-ecommerce","tag-react-hooks","tag-react-js","tag-react-js-2","tag-typescript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog<\/title>\n<meta name=\"description\" content=\"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog\" \/>\n<meta property=\"og:description\" content=\"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\" \/>\n<meta property=\"og:site_name\" content=\"Webkul Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webkul\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-26T13:13:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-24T06:01:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1694\" \/>\n\t<meta property=\"og:image:height\" content=\"983\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Arun Tiwari\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webkul\" \/>\n<meta name=\"twitter:site\" content=\"@webkul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Arun Tiwari\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\"},\"author\":{\"name\":\"Arun Tiwari\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/b3d968b3f55f433fda5b0d660dbea4aa\"},\"headline\":\"How to make Magento 2 cart page using ReactJS\",\"datePublished\":\"2024-09-26T13:13:14+00:00\",\"dateModified\":\"2024-10-24T06:01:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\"},\"wordCount\":615,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp\",\"keywords\":[\"GraphQl Api\",\"JavaScript\",\"magento\",\"Magento2\",\"react\",\"react ecommerce\",\"react hooks\",\"react js\",\"React.js\",\"TypeScript\"],\"articleSection\":[\"Magento 2\",\"react js\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\",\"url\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\",\"name\":\"ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp\",\"datePublished\":\"2024-09-26T13:13:14+00:00\",\"dateModified\":\"2024-10-24T06:01:35+00:00\",\"description\":\"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.\",\"breadcrumb\":{\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp\",\"width\":1694,\"height\":983},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webkul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to make Magento 2 cart page using ReactJS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webkul.com\/blog\/#website\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"name\":\"Webkul Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webkul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webkul.com\/blog\/#organization\",\"name\":\"WebKul Software Private Limited\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"width\":380,\"height\":380,\"caption\":\"WebKul Software Private Limited\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webkul\/\",\"https:\/\/x.com\/webkul\",\"https:\/\/www.instagram.com\/webkul\/\",\"https:\/\/www.linkedin.com\/company\/webkul\",\"https:\/\/www.youtube.com\/user\/webkul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/b3d968b3f55f433fda5b0d660dbea4aa\",\"name\":\"Arun Tiwari\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/07faf0906e0520912140e99abd63bf5620be60c11bb1220fe25dacda8a9f4896?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/07faf0906e0520912140e99abd63bf5620be60c11bb1220fe25dacda8a9f4896?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"caption\":\"Arun Tiwari\"},\"description\":\"Arun Tiwari, a skilled Software Engineer, specializes in making Magento Headless compatible extensions. With deep expertise in headless architecture, Arun crafts seamless, scalable solutions.\",\"url\":\"https:\/\/webkul.com\/blog\/author\/aruntiwari-mg565\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog","description":"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/","og_locale":"en_US","og_type":"article","og_title":"ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog","og_description":"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.","og_url":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/","og_site_name":"Webkul Blog","article_publisher":"https:\/\/www.facebook.com\/webkul\/","article_published_time":"2024-09-26T13:13:14+00:00","article_modified_time":"2024-10-24T06:01:35+00:00","og_image":[{"width":1694,"height":983,"url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp","type":"image\/webp"}],"author":"Arun Tiwari","twitter_card":"summary_large_image","twitter_creator":"@webkul","twitter_site":"@webkul","twitter_misc":{"Written by":"Arun Tiwari","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#article","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/"},"author":{"name":"Arun Tiwari","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/b3d968b3f55f433fda5b0d660dbea4aa"},"headline":"How to make Magento 2 cart page using ReactJS","datePublished":"2024-09-26T13:13:14+00:00","dateModified":"2024-10-24T06:01:35+00:00","mainEntityOfPage":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/"},"wordCount":615,"commentCount":0,"publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"image":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage"},"thumbnailUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp","keywords":["GraphQl Api","JavaScript","magento","Magento2","react","react ecommerce","react hooks","react js","React.js","TypeScript"],"articleSection":["Magento 2","react js"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/","url":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/","name":"ReactJs | How to make Magento 2 cart page using ReactJS - Webkul Blog","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage"},"image":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage"},"thumbnailUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp","datePublished":"2024-09-26T13:13:14+00:00","dateModified":"2024-10-24T06:01:35+00:00","description":"Learn how to create a Magento 2 cart page using ReactJS in this comprehensive guide. Discover how to manage cart items, apply coupons.","breadcrumb":{"@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#primaryimage","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2024\/09\/desktopcart-1.webp","width":1694,"height":983},{"@type":"BreadcrumbList","@id":"https:\/\/webkul.com\/blog\/magento-2-cart-page-using-reactjs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webkul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to make Magento 2 cart page using ReactJS"}]},{"@type":"WebSite","@id":"https:\/\/webkul.com\/blog\/#website","url":"https:\/\/webkul.com\/blog\/","name":"Webkul Blog","description":"","publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webkul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webkul.com\/blog\/#organization","name":"WebKul Software Private Limited","url":"https:\/\/webkul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","width":380,"height":380,"caption":"WebKul Software Private Limited"},"image":{"@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webkul\/","https:\/\/x.com\/webkul","https:\/\/www.instagram.com\/webkul\/","https:\/\/www.linkedin.com\/company\/webkul","https:\/\/www.youtube.com\/user\/webkul\/"]},{"@type":"Person","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/b3d968b3f55f433fda5b0d660dbea4aa","name":"Arun Tiwari","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/07faf0906e0520912140e99abd63bf5620be60c11bb1220fe25dacda8a9f4896?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/07faf0906e0520912140e99abd63bf5620be60c11bb1220fe25dacda8a9f4896?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","caption":"Arun Tiwari"},"description":"Arun Tiwari, a skilled Software Engineer, specializes in making Magento Headless compatible extensions. With deep expertise in headless architecture, Arun crafts seamless, scalable solutions.","url":"https:\/\/webkul.com\/blog\/author\/aruntiwari-mg565\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/465097","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/users\/496"}],"replies":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/comments?post=465097"}],"version-history":[{"count":30,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/465097\/revisions"}],"predecessor-version":[{"id":471037,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/465097\/revisions\/471037"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media\/465639"}],"wp:attachment":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media?parent=465097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/categories?post=465097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/tags?post=465097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}