Latest updarte

This commit is contained in:
hubaceks
2026-05-18 23:04:50 +02:00
parent 889c84c553
commit 7d63addc7e
59 changed files with 10991 additions and 246 deletions

76
src/lib/cart.ts Normal file
View File

@@ -0,0 +1,76 @@
import { cookies } from "next/headers";
import { db } from "@/lib/db";
export const CART_COOKIE = "bistrousky_cart";
export interface CartItem {
variantId: string;
quantity: number;
}
// ── Čtení / zápis cookie ──────────────────────────────────────────────────
export async function getCartItems(): Promise<CartItem[]> {
const store = await cookies();
const raw = store.get(CART_COOKIE)?.value;
if (!raw) return [];
try {
return JSON.parse(raw) as CartItem[];
} catch {
return [];
}
}
export async function setCartItems(items: CartItem[]) {
const store = await cookies();
store.set(CART_COOKIE, JSON.stringify(items), {
httpOnly: true,
sameSite: "lax",
path: "/",
maxAge: 60 * 60 * 24 * 30, // 30 dní
});
}
// ── Košík s daty z DB ─────────────────────────────────────────────────────
export interface CartItemFull {
variantId: string;
quantity: number;
variant: {
id: string;
name: string;
price: number;
stock: number;
product: {
id: string;
name: string;
slug: string;
image: string | null;
};
};
}
export async function getCart(): Promise<CartItemFull[]> {
const items = await getCartItems();
if (items.length === 0) return [];
const variantIds = items.map((i) => i.variantId);
const variants = await db.productVariant.findMany({
where: { id: { in: variantIds } },
include: {
product: { select: { id: true, name: true, slug: true, image: true } },
},
});
return items
.map((item) => {
const variant = variants.find((v) => v.id === item.variantId);
if (!variant) return null;
return { variantId: item.variantId, quantity: item.quantity, variant };
})
.filter(Boolean) as CartItemFull[];
}
export function cartTotal(items: CartItemFull[]): number {
return items.reduce((sum, item) => sum + item.variant.price * item.quantity, 0);
}