"use client"; import { create } from "zustand"; import { persist, createJSONStorage } from "zustand/middleware"; export interface CartLine { productSku: string; productName: string; collection: string; variantSku: string; colorName: string; swatchColor: string; price: number; heroImage: string; quantity: number; } interface CartState { lines: CartLine[]; isOpen: boolean; add: (line: Omit, quantity?: number) => void; remove: (variantSku: string) => void; setQuantity: (variantSku: string, quantity: number) => void; open: () => void; close: () => void; toggle: () => void; clear: () => void; totalCount: () => number; totalPrice: () => number; } export const useCartStore = create()( persist( (set, get) => ({ lines: [], isOpen: false, add: (line, quantity = 1) => set((state) => { const existing = state.lines.find( (l) => l.variantSku === line.variantSku, ); if (existing) { return { lines: state.lines.map((l) => l.variantSku === line.variantSku ? { ...l, quantity: l.quantity + quantity } : l, ), isOpen: true, }; } return { lines: [...state.lines, { ...line, quantity }], isOpen: true, }; }), remove: (variantSku) => set((state) => ({ lines: state.lines.filter((l) => l.variantSku !== variantSku), })), setQuantity: (variantSku, quantity) => set((state) => ({ lines: state.lines .map((l) => l.variantSku === variantSku ? { ...l, quantity: Math.max(0, quantity) } : l, ) .filter((l) => l.quantity > 0), })), open: () => set({ isOpen: true }), close: () => set({ isOpen: false }), toggle: () => set((state) => ({ isOpen: !state.isOpen })), clear: () => set({ lines: [] }), totalCount: () => get().lines.reduce((sum, l) => sum + l.quantity, 0), totalPrice: () => get().lines.reduce((sum, l) => sum + l.price * l.quantity, 0), }), { name: "vilmax-cart", storage: createJSONStorage(() => localStorage), // Persistujemy tylko lines, NIE isOpen (drawer ma być zamknięty po reload) partialize: (state) => ({ lines: state.lines }), }, ), );