Initial commit: Van's DIY & Bastelbedarf Astro shop

This commit is contained in:
qcigano
2026-08-02 13:22:55 +02:00
commit 2e340f7a8a
92 changed files with 11022 additions and 0 deletions
+59
View File
@@ -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);
}