import Link from "next/link"; import { formatRupiah } from "@/lib/utils"; type PayoutStatus = "HELD" | "RELEASED" | "PAID" | "CANCELLED"; interface EarningRow { id: string; amount: number; status: PayoutStatus; heldUntil: Date; releasedAt: Date | null; paidAt: Date | null; cancelledAt: Date | null; trip: { id: string; title: string; date: Date; endDate: Date | null }; booking: { id: string; amount: number; user: { id: string; name: string }; }; } interface EarningsSectionProps { payouts: EarningRow[]; } function formatDay(d: Date | null | string): string { if (!d) return "—"; return new Date(d).toLocaleDateString("id-ID", { day: "2-digit", month: "short", year: "numeric", }); } const STATUS_META: Record< PayoutStatus, { label: string; cls: string; hint: (row: EarningRow) => string } > = { HELD: { label: "Ditahan", cls: "bg-amber-50 text-amber-700 ring-amber-200", hint: (r) => `Cair setelah ${formatDay(r.heldUntil)}`, }, RELEASED: { label: "Siap transfer", cls: "bg-blue-50 text-blue-700 ring-blue-200", hint: (r) => r.releasedAt ? `Antri admin transfer sejak ${formatDay(r.releasedAt)}` : "Antri admin transfer", }, PAID: { label: "Diterima", cls: "bg-primary-50 text-primary-700 ring-primary-200", hint: (r) => r.paidAt ? `Ditransfer ${formatDay(r.paidAt)}` : "Sudah ditransfer admin", }, CANCELLED: { label: "Dibatalkan", cls: "bg-neutral-100 text-neutral-600 ring-neutral-200", hint: () => "Trip dibatalkan / di-refund — tidak ada payout", }, }; export function EarningsSection({ payouts }: EarningsSectionProps) { if (payouts.length === 0) return null; const totals = { held: 0, released: 0, paid: 0, }; for (const p of payouts) { if (p.status === "HELD") totals.held += p.amount; else if (p.status === "RELEASED") totals.released += p.amount; else if (p.status === "PAID") totals.paid += p.amount; } return (

Pendapatan dari peserta

Uang peserta ditahan oleh SeTrip (escrow) sampai trip selesai + 3 hari, lalu admin transfer ke rekening bank yang kamu daftarkan.

); } function Stat({ label, value, accent, }: { label: string; value: number; accent: "amber" | "blue" | "primary"; }) { const cls = { amber: "bg-amber-50 text-amber-900", blue: "bg-blue-50 text-blue-900", primary: "bg-primary-50 text-primary-900", }[accent]; return (

{label}

{formatRupiah(value)}

); }