DEV Community

Ichchapuron-Limited
Ichchapuron-Limited

Posted on

Building a Next.js 14 E-Commerce Cart with Persistent State Using Zustand

import { create } from 'zustand'
import { persist } from "zustand/middleware";

const useCartStore = create(persist((set, get) => ({
cartItems: [],
cartTotalQuantity: 0,
cartTotalAmount: 0,

ADD TO CART

addToCart: (payload) => {
const cart = get().cartItems
const cartItem = cart.find(item => item._id === payload._id)

if (cartItem) {
  const updatedCart = cart.map(item =>
    item._id === payload._id ? { ...item, cartQuantity: (item.cartQuantity) + 1 } : item
  )
  set(state => ({
    cartItems: updatedCart,
    cartTotalQuantity: state.cartTotalQuantity + 1,
    cartTotalAmount: state.cartTotalAmount + payload.price,
  }))
} else {
  const updatedCart = [...cart, { ...payload, cartQuantity: 1 }]

  set(state => ({
    cartItems: updatedCart,
    cartTotalQuantity: state.cartTotalQuantity + 1,
    cartTotalAmount: state.cartTotalAmount + payload.price,
  }))
}
Enter fullscreen mode Exit fullscreen mode

},

REMOVE FROM CART

removeFromCart: (payload) => {
const cart = get().cartItems;
const updatedCart = cart.filter((item) => item._id !== payload._id);

set((state) => ({
  ...state,
  cartItems: updatedCart,
  cartTotalQuantity: state.cartTotalQuantity - 1,
  cartTotalAmount: state.cartTotalAmount - (payload.price * payload.cartQuantity),
}));
Enter fullscreen mode Exit fullscreen mode

},

DECREMENT CART

decreaseCart: (payload) => {
const cart = get().cartItems;
let updatedCart = [...cart];

const itemIndex = updatedCart.findIndex((item) => item._id === payload._id);
if (updatedCart[itemIndex].cartQuantity > 1) {
  updatedCart[itemIndex].cartQuantity -= 1;
} else {
  updatedCart = updatedCart.filter((item) => item._id !== payload._id);
}

set((state) => ({
  cartItems: updatedCart,
  cartTotalQuantity: state.cartTotalQuantity - 1,
  cartTotalAmount: state.cartTotalAmount - payload.price,
}));
Enter fullscreen mode Exit fullscreen mode

},

INCREMENT CART
incrementCart: (payload) => {
const cart = get().cartItems;
let updatedCart = [...cart];

const productIndex = updatedCart.findIndex((item) => item._id === payload._id);
if (productIndex >= 0) {
  updatedCart[productIndex] = {
    ...updatedCart[productIndex],
    cartQuantity: updatedCart[productIndex].cartQuantity + 1,
  };
} else {
  updatedCart = [...updatedCart, { ...payload, cartQuantity: 1 }];
}

set((state) => ({
  ...state,
  cartItems: updatedCart,
}));
Enter fullscreen mode Exit fullscreen mode

},

CLEAR CART
clearCart: () => {
set({
cartItems: [],
cartTotalQuantity: 0,
cartTotalAmount: 0,
});
},
}),
{
name: 'cart'
}
));

export default useCartStore;

Top comments (0)