"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { BookingStatusBadge, resolveDisplayStatus } from "./BookingStatusBadge"; import type { BookingRequest, Event, Offer } from "@/payload-types"; function fmtDate(iso: string) { return new Date(iso).toLocaleDateString("de-DE", { weekday: "long", day: "2-digit", month: "long", year: "numeric" }); } function fmtTime(iso: string) { return new Date(iso).toLocaleTimeString("de-DE", { hour: "2-digit", minute: "2-digit" }); } export function BookingCard({ booking }: { booking: BookingRequest }) { const router = useRouter(); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const offer = typeof booking.offer === "object" ? (booking.offer as Offer) : null; const event = typeof booking.linkedEvent === "object" ? (booking.linkedEvent as Event) : null; const displayStatus = resolveDisplayStatus(booking.status, booking.date); const hasAlternative = booking.status === "pending" && Boolean(booking.proposedAlternative?.date); async function callAction(path: string) { setBusy(true); setError(null); try { const res = await fetch(path, { method: "POST", credentials: "include" }); const data = await res.json().catch(() => ({})); if (!res.ok) { setError(data.error || "Aktion fehlgeschlagen."); setBusy(false); return; } router.refresh(); } catch { setError("Verbindung fehlgeschlagen."); setBusy(false); } } return (

{offer?.title ?? "Termin"}

{fmtDate(booking.date)} · {fmtTime(booking.startTime)} – {fmtTime(booking.endTime)}

{booking.status === "pending" && !hasAlternative && (

Der Termin ist noch nicht verbindlich. Du erhältst eine E-Mail, sobald Anna den Termin bestätigt.

)} {hasAlternative && booking.proposedAlternative && (

Alternativer Termin

{fmtDate(booking.proposedAlternative.date!)} · {fmtTime(booking.proposedAlternative.startTime!)} –{" "} {fmtTime(booking.proposedAlternative.endTime!)}

)} {booking.status === "confirmed" && (
{booking.appointmentType === "online" && event && ( Video-Call betreten )} {booking.appointmentType === "onsite" && (

Vor Ort — Details siehe Bestätigungs-E-Mail.

)}
)} {(booking.status === "pending" || booking.status === "confirmed") && displayStatus !== "past" && !hasAlternative && ( )} {error && (

{error}

)}
); }