87 lines
2.0 KiB
TypeScript
87 lines
2.0 KiB
TypeScript
import { create } from "zustand";
|
|
import { persist } from "zustand/middleware";
|
|
|
|
export interface CartItem {
|
|
id: number;
|
|
name: string;
|
|
price: string;
|
|
quantity: number;
|
|
image: string;
|
|
sku: string;
|
|
}
|
|
|
|
interface CartStore {
|
|
items: CartItem[];
|
|
isOpen: boolean;
|
|
addItem: (item: CartItem) => void;
|
|
removeItem: (id: number) => void;
|
|
updateQuantity: (id: number, quantity: number) => void;
|
|
toggleCart: () => void;
|
|
openCart: () => void;
|
|
closeCart: () => void;
|
|
clearCart: () => void;
|
|
getTotal: () => number;
|
|
getItemCount: () => number;
|
|
}
|
|
|
|
export const useCartStore = create<CartStore>()(
|
|
persist(
|
|
(set, get) => ({
|
|
items: [],
|
|
isOpen: false,
|
|
|
|
addItem: (item) => {
|
|
const items = get().items;
|
|
const existingItem = items.find((i) => i.id === item.id);
|
|
|
|
if (existingItem) {
|
|
set({
|
|
items: items.map((i) =>
|
|
i.id === item.id
|
|
? { ...i, quantity: i.quantity + item.quantity }
|
|
: i
|
|
),
|
|
});
|
|
} else {
|
|
set({ items: [...items, item] });
|
|
}
|
|
set({ isOpen: true });
|
|
},
|
|
|
|
removeItem: (id) => {
|
|
set({ items: get().items.filter((i) => i.id !== id) });
|
|
},
|
|
|
|
updateQuantity: (id, quantity) => {
|
|
if (quantity <= 0) {
|
|
set({ items: get().items.filter((i) => i.id !== id) });
|
|
} else {
|
|
set({
|
|
items: get().items.map((i) =>
|
|
i.id === id ? { ...i, quantity } : i
|
|
),
|
|
});
|
|
}
|
|
},
|
|
|
|
toggleCart: () => set({ isOpen: !get().isOpen }),
|
|
openCart: () => set({ isOpen: true }),
|
|
closeCart: () => set({ isOpen: false }),
|
|
clearCart: () => set({ items: [] }),
|
|
|
|
getTotal: () => {
|
|
return get().items.reduce((total, item) => {
|
|
return total + parseFloat(item.price) * item.quantity;
|
|
}, 0);
|
|
},
|
|
|
|
getItemCount: () => {
|
|
return get().items.reduce((count, item) => count + item.quantity, 0);
|
|
},
|
|
}),
|
|
{
|
|
name: "manoonoils-cart",
|
|
}
|
|
)
|
|
);
|