"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { BookingStatusBadge, resolveDisplayStatus } from "./BookingStatusBadge"; import type { CustomerBooking } from "@/lib/booking/customerView"; import { formatBerlinDate, formatBerlinTime } from "@/lib/calendar/timezone"; import type { MeetingStatus } from "@/lib/meeting/status"; export function BookingCard({ booking, meetingStatus }: { booking: CustomerBooking; meetingStatus?: MeetingStatus | null }) { const router = useRouter(); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const offer = booking.offer; const event = booking.linkedEvent; const displayStatus = resolveDisplayStatus(booking.status, booking.endTime); 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"}

{formatBerlinDate(new Date(booking.date), { weekday: "long", day: "2-digit", month: "long", year: "numeric" })} · {formatBerlinTime(new Date(booking.startTime), { hour: "2-digit", minute: "2-digit" })} – {formatBerlinTime(new Date(booking.endTime), { hour: "2-digit", minute: "2-digit" })}

{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

{formatBerlinDate(new Date(booking.proposedAlternative.date!), { weekday: "long", day: "2-digit", month: "long", year: "numeric" })} · {formatBerlinTime(new Date(booking.proposedAlternative.startTime!), { hour: "2-digit", minute: "2-digit" })} –{" "} {formatBerlinTime(new Date(booking.proposedAlternative.endTime!), { hour: "2-digit", minute: "2-digit" })}

)} {booking.status === "confirmed" && (
{booking.appointmentType === "online" && event && meetingStatus !== "ended" && meetingStatus !== "scheduled" && ( Video-Call betreten )} {booking.appointmentType === "online" && event && meetingStatus === "scheduled" && (

Der Video-Call wird 10 Minuten vor Beginn freigeschaltet.

)} {booking.appointmentType === "online" && event && meetingStatus === "ended" && (

Dieser Video-Call ist bereits beendet.

)} {booking.appointmentType === "onsite" && (

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

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

{error}

)}
); }