"use client"; import { use, useEffect, useState } from "react"; import Link from "next/link"; import Shell from "../../components/shell"; import LogoImg from "../../components/logo-img"; import { formatEuro } from "@/lib/vouchers"; import { getVoucherStatus } from "@/lib/voucher-status"; type Voucher = { id: number; name: string; anbieter: string; wertCents: number; restCents: number; ablaufdatum: string | null; codeText: string | null; kategorie: string | null; notiz: string | null; status: string; createdBy?: string | null; providerDomain?: string | null; logoUrl?: string | null; contacts?: { contact: { id: number; name: string; email: string | null; telegramChatId: string | null } }[]; }; function Row({ label, children }: { label: string; children: React.ReactNode }) { return (
{label}
{children}
); } export default function VoucherDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const [v, setV] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); useEffect(() => { fetch(`/api/vouchers/${id}`) .then((r) => (r.ok ? r.json() : Promise.reject(new Error("not found")))) .then((d) => setV(d)) .catch(() => setError("Gutschein nicht gefunden")) .finally(() => setLoading(false)); }, [id]); async function redeem() { const res = await fetch(`/api/vouchers/${id}`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ action: "redeem" }), }); if (res.ok) setV(await res.json()); } if (loading) return (
); if (error || !v) return (

{error}

Zurück zur Liste
); const status = getVoucherStatus({ status: v.status, ablaufdatum: v.ablaufdatum ? new Date(v.ablaufdatum) : null, }); return ( ← Zurück

{v.name}

{v.anbieter} {formatEuro(v.wertCents)} {formatEuro(v.restCents)} {status === "aktiv" ? "Aktiv" : status === "abgelaufen" ? "Abgelaufen" : "Eingelöst"} {v.createdBy ? v.createdBy : "Nicht erfasst"} {v.ablaufdatum && ( {new Date(v.ablaufdatum).toLocaleDateString("de-DE")} )} {v.codeText && {v.codeText}} {v.kategorie && {v.kategorie}} {v.notiz && {v.notiz}} {v.contacts && v.contacts.length > 0 && ( {v.contacts.map((c) => c.contact.name).join(", ")} )}
{v.status !== "eingeloest" && ( )}
); }