"use client"; import { create } from "zustand"; import { persist } from "zustand/middleware"; export interface CartItem { productId: string; slug: string; name: string; weightGrams: number; priceCents: number; image: string | null; quantity: number; } interface CartState { items: CartItem[]; isOpen: boolean; // Client-only: waehrend des Server-Renders und des allerersten Client- // Renders (bevor persist localStorage gelesen hat) ist dies immer false, // damit UI, die auf "items.length === 0" verzweigt (Checkout/Warenkorb), // nicht kurz einen falschen "leerer Warenkorb"-Zustand zeigt, bevor die // echten, aus localStorage wiederhergestellten Positionen ankommen. hasHydrated: boolean; setHasHydrated: (hasHydrated: boolean) => void; openCart: () => void; closeCart: () => void; addItem: (item: Omit, quantity?: number) => void; removeItem: (productId: string) => void; setQuantity: (productId: string, quantity: number) => void; clear: () => void; } export const useCartStore = create()( persist( (set) => ({ items: [], isOpen: false, hasHydrated: false, setHasHydrated: (hasHydrated) => set({ hasHydrated }), openCart: () => set({ isOpen: true }), closeCart: () => set({ isOpen: false }), addItem: (item, quantity = 1) => set((state) => { const existing = state.items.find((i) => i.productId === item.productId); if (existing) { return { items: state.items.map((i) => i.productId === item.productId ? { ...i, quantity: i.quantity + quantity } : i ), isOpen: true, }; } return { items: [...state.items, { ...item, quantity }], isOpen: true }; }), removeItem: (productId) => set((state) => ({ items: state.items.filter((i) => i.productId !== productId), })), setQuantity: (productId, quantity) => set((state) => ({ items: state.items .map((i) => (i.productId === productId ? { ...i, quantity } : i)) .filter((i) => i.quantity > 0), })), clear: () => set({ items: [] }), }), { name: "wabenhain-cart", // Nur die Artikel persistieren — "isOpen" ist ein rein transienter // UI-Zustand und darf nach einem Seiten-Reload nicht wiederhergestellt // werden (sonst poppt das Cart-Drawer nach jedem Reload erneut auf). partialize: (state) => ({ items: state.items }), onRehydrateStorage: () => (state) => { state?.setHasHydrated(true); }, } ) ); export function cartTotalCents(items: CartItem[]): number { return items.reduce((sum, item) => sum + item.priceCents * item.quantity, 0); } export function cartItemCount(items: CartItem[]): number { return items.reduce((sum, item) => sum + item.quantity, 0); }