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 (
Uang peserta ditahan oleh SeTrip (escrow) sampai trip selesai + 3 hari,
lalu admin transfer ke rekening bank yang kamu daftarkan.
{p.booking.user.name} · trip {formatDay(p.trip.date)}
{meta.hint(p)}
Pendapatan dari peserta
{payouts.map((p) => {
const meta = STATUS_META[p.status];
return (
{label}
{formatRupiah(value)}