"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 (
);
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" && (
)}
);
}