import { redirect } from "next/navigation"; import { getServerSession } from "next-auth"; import { authOptions } from "@/lib/auth"; import { isAdminEmail, listAdminEmails } from "@/lib/admin"; import { refundRepo } from "@/server/repositories/refund.repo"; import { CreateRefundForm } from "@/features/refund/components/create-refund-form"; import { AdminFilterBar } from "@/features/admin/components/admin-filter-bar"; import { RefundReviewCard, type RefundCardData, } from "@/features/refund/components/refund-review-card"; type Tab = "PENDING" | "APPROVED" | "REJECTED" | "SUCCEEDED" | "FAILED"; const TABS: { key: Tab; label: string }[] = [ { key: "PENDING", label: "Pending" }, { key: "APPROVED", label: "Disetujui" }, { key: "SUCCEEDED", label: "Selesai" }, { key: "REJECTED", label: "Ditolak" }, { key: "FAILED", label: "Gagal" }, ]; const REASON_OPTIONS = [ { value: "USER_CANCELLATION", label: "User cancel" }, { value: "ORGANIZER_CANCELLED", label: "Organizer cancel" }, { value: "TRIP_ISSUE", label: "Trip issue" }, { value: "ADMIN_ADJUSTMENT", label: "Admin adjustment" }, { value: "DISPUTE_RESOLVED", label: "Dispute resolved" }, ] as const; type ReasonValue = (typeof REASON_OPTIONS)[number]["value"]; interface PageProps { searchParams: Promise<{ tab?: string; dateFrom?: string; dateTo?: string; reviewer?: string; reason?: string; }>; } function parseDate(value: string | undefined): Date | undefined { if (!value) return undefined; const d = new Date(value); return Number.isNaN(d.getTime()) ? undefined : d; } export default async function AdminRefundsPage({ searchParams }: PageProps) { const session = await getServerSession(authOptions); if (!session?.user) redirect("/login?callbackUrl=/admin/refunds"); if (!isAdminEmail(session.user.email)) { return (
Halaman ini hanya untuk admin SeTrip.
Tinjau laporan refund dari peserta dan organizer. Setiap refund harus melalui approval admin sebelum dieksekusi.
Tidak ada refund yang cocok dengan filter ini.