<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ichchapuron-Limited</title>
    <description>The latest articles on DEV Community by Ichchapuron-Limited (@ichchapuronlimited).</description>
    <link>https://dev.to/ichchapuronlimited</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1212705%2F586ce8ef-e5df-4f05-80c6-c1c83778dc19.png</url>
      <title>DEV Community: Ichchapuron-Limited</title>
      <link>https://dev.to/ichchapuronlimited</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ichchapuronlimited"/>
    <language>en</language>
    <item>
      <title>Building a Next.js 14 E-Commerce Cart with Persistent State Using Zustand</title>
      <dc:creator>Ichchapuron-Limited</dc:creator>
      <pubDate>Sat, 18 Nov 2023 04:43:47 +0000</pubDate>
      <link>https://dev.to/ichchapuronlimited/building-a-nextjs-14-e-commerce-cart-with-persistent-state-using-zustand-o6g</link>
      <guid>https://dev.to/ichchapuronlimited/building-a-nextjs-14-e-commerce-cart-with-persistent-state-using-zustand-o6g</guid>
      <description>&lt;p&gt;import { create } from 'zustand'&lt;br&gt;
import { persist } from "zustand/middleware";&lt;/p&gt;

&lt;p&gt;const useCartStore = create(persist((set, get) =&amp;gt; ({&lt;br&gt;
  cartItems: [],&lt;br&gt;
  cartTotalQuantity: 0,&lt;br&gt;
  cartTotalAmount: 0,&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ADD TO CART&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;addToCart: (payload) =&amp;gt; {&lt;br&gt;
    const cart = get().cartItems&lt;br&gt;
    const cartItem = cart.find(item =&amp;gt; item._id === payload._id)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (cartItem) {
  const updatedCart = cart.map(item =&amp;gt;
    item._id === payload._id ? { ...item, cartQuantity: (item.cartQuantity) + 1 } : item
  )
  set(state =&amp;gt; ({
    cartItems: updatedCart,
    cartTotalQuantity: state.cartTotalQuantity + 1,
    cartTotalAmount: state.cartTotalAmount + payload.price,
  }))
} else {
  const updatedCart = [...cart, { ...payload, cartQuantity: 1 }]

  set(state =&amp;gt; ({
    cartItems: updatedCart,
    cartTotalQuantity: state.cartTotalQuantity + 1,
    cartTotalAmount: state.cartTotalAmount + payload.price,
  }))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;&lt;code&gt;REMOVE FROM CART&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;removeFromCart: (payload) =&amp;gt; {&lt;br&gt;
    const cart = get().cartItems;&lt;br&gt;
    const updatedCart = cart.filter((item) =&amp;gt; item._id !== payload._id);&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set((state) =&amp;gt; ({
  ...state,
  cartItems: updatedCart,
  cartTotalQuantity: state.cartTotalQuantity - 1,
  cartTotalAmount: state.cartTotalAmount - (payload.price * payload.cartQuantity),
}));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DECREMENT CART&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;decreaseCart: (payload) =&amp;gt; {&lt;br&gt;
    const cart = get().cartItems;&lt;br&gt;
    let updatedCart = [...cart];&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const itemIndex = updatedCart.findIndex((item) =&amp;gt; item._id === payload._id);
if (updatedCart[itemIndex].cartQuantity &amp;gt; 1) {
  updatedCart[itemIndex].cartQuantity -= 1;
} else {
  updatedCart = updatedCart.filter((item) =&amp;gt; item._id !== payload._id);
}

set((state) =&amp;gt; ({
  cartItems: updatedCart,
  cartTotalQuantity: state.cartTotalQuantity - 1,
  cartTotalAmount: state.cartTotalAmount - payload.price,
}));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;&lt;code&gt;INCREMENT CART&lt;/code&gt;&lt;br&gt;
  incrementCart: (payload) =&amp;gt; {&lt;br&gt;
    const cart = get().cartItems;&lt;br&gt;
    let updatedCart = [...cart];&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const productIndex = updatedCart.findIndex((item) =&amp;gt; item._id === payload._id);
if (productIndex &amp;gt;= 0) {
  updatedCart[productIndex] = {
    ...updatedCart[productIndex],
    cartQuantity: updatedCart[productIndex].cartQuantity + 1,
  };
} else {
  updatedCart = [...updatedCart, { ...payload, cartQuantity: 1 }];
}

set((state) =&amp;gt; ({
  ...state,
  cartItems: updatedCart,
}));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;},&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CLEAR CART&lt;/code&gt;&lt;br&gt;
  clearCart: () =&amp;gt; {&lt;br&gt;
    set({&lt;br&gt;
      cartItems: [],&lt;br&gt;
      cartTotalQuantity: 0,&lt;br&gt;
      cartTotalAmount: 0,&lt;br&gt;
    });&lt;br&gt;
  },&lt;br&gt;
}),&lt;br&gt;
  {&lt;br&gt;
    name: 'cart'&lt;br&gt;
  }&lt;br&gt;
));&lt;/p&gt;

&lt;p&gt;export default useCartStore;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
