각각의 product card에는 장바구니 버튼이 있는데, 이 버튼을 누르게 되면 해당 상품이 전역 + 로컬스토리지에 있는 zustand persist에 담기게 된다. 그게 바로 use-cart
커스텀 훅
import { create } from 'zustand';
import { toast } from 'react-hot-toast';
import { persist, createJSONStorage } from 'zustand/middleware';
import { Product } from '@/types';
import { AlertTriangle } from 'lucide-react';
interface CartStore {
items: Product[];
addItem: (data: Product) => void;
removeItem: (id: string) => void;
removeAll: () => void;
}
const useCart = create(
persist<CartStore>(
(set, get) => ({
items: [],
addItem: (data: Product) => {
const currentItems = get().items;
const existingItem = currentItems.find((item) => item.id === data.id);
if (existingItem) {
return toast('Item already in cart.');
}
set({ items: [...get().items, data] });
toast.success('Item added to cart.');
},
removeItem: (id: string) => {
set({ items: [...get().items.filter((item) => item.id !== id)] });
toast.success('Item removed from cart.');
},
removeAll: () => set({ items: [] }),
}),
{
name: 'cart-storage',
storage: createJSONStorage(() => localStorage),
}
)
);
export default useCart;
product-card 컴포넌트에서 장바구니 버튼을 누를시, card.addItem(누른해당프로덕트
)를 넘긴다.
const onAddCart: MouseEventHandler<HTMLButtonElement> = (event) => {
event.stopPropagation();
// data가 해당 누른 프로덕트
cart.addItem(data);
};
우측 상단의 장바구니 버튼을 누르면 장바 구니 패이지로 이동한다. (장바구니 페이지 새로 생성)
CartItem
이라는 컴포넌트
Summary
라는 컴포넌트⭐️⭐️⭐️⭐️⭐️ Summary 컴포넌트에서 checkout
했을때의 함수가 중요하다. ⭐️⭐️⭐️⭐️⭐️