Initial commit: Van's DIY & Bastelbedarf Astro shop
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
// Rein clientseitiger Warenkorb (Phase 1, kein Backend). Speichert im localStorage.
|
||||
// TODO Phase 2: durch echten Cloudflare-Worker-Warenkorb/Checkout ersetzen.
|
||||
|
||||
export interface CartItem {
|
||||
slug: string;
|
||||
name: string;
|
||||
preis: number;
|
||||
menge: number;
|
||||
}
|
||||
|
||||
const KEY = "vandiy_cart_v1";
|
||||
|
||||
export function getCart(): CartItem[] {
|
||||
if (typeof localStorage === "undefined") return [];
|
||||
try {
|
||||
return JSON.parse(localStorage.getItem(KEY) || "[]");
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export function saveCart(items: CartItem[]) {
|
||||
localStorage.setItem(KEY, JSON.stringify(items));
|
||||
window.dispatchEvent(new CustomEvent("cart:changed", { detail: items }));
|
||||
}
|
||||
|
||||
export function addToCart(item: Omit<CartItem, "menge">, menge = 1) {
|
||||
const cart = getCart();
|
||||
const existing = cart.find((i) => i.slug === item.slug);
|
||||
if (existing) {
|
||||
existing.menge += menge;
|
||||
} else {
|
||||
cart.push({ ...item, menge });
|
||||
}
|
||||
saveCart(cart);
|
||||
}
|
||||
|
||||
export function updateQuantity(slug: string, menge: number) {
|
||||
let cart = getCart();
|
||||
if (menge <= 0) {
|
||||
cart = cart.filter((i) => i.slug !== slug);
|
||||
} else {
|
||||
const item = cart.find((i) => i.slug === slug);
|
||||
if (item) item.menge = menge;
|
||||
}
|
||||
saveCart(cart);
|
||||
}
|
||||
|
||||
export function removeFromCart(slug: string) {
|
||||
saveCart(getCart().filter((i) => i.slug !== slug));
|
||||
}
|
||||
|
||||
export function cartCount(): number {
|
||||
return getCart().reduce((sum, i) => sum + i.menge, 0);
|
||||
}
|
||||
|
||||
export function cartTotal(): number {
|
||||
return getCart().reduce((sum, i) => sum + i.menge * i.preis, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user