"use client"; import { Shield } from "lucide-react"; import { useCallback, useMemo, useState } from "react"; import { useExportLabels } from "@/hooks/use-export-labels"; import { useTranslation } from "react-i18next"; import { useAsyncEffect } from "@/hooks/use-async-effect"; import { useTranslationRef } from "@/hooks/use-translation-ref"; import { getAdminDraws } from "@/api/admin-draws"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; import { AdminNoResourceState, AdminTableNoResourceRow } from "@/components/admin/admin-no-resource-state"; import { AdminRowActionsMenu } from "@/components/admin/admin-row-actions-menu"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { AdminLoadingState, AdminLoadingInline, AdminTableLoadingRow } from "@/components/admin/admin-loading-state"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { DrawStatusBadge } from "@/modules/draws/draw-status-badge"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { LotteryApiBizError } from "@/types/api/errors"; import type { AdminDrawListData, AdminDrawListItem } from "@/types/api/admin-draws"; const DRAW_STATUS_OPTIONS: { value: string; label: string }[] = [ { value: "pending", label: "statusOptions.pending" }, { value: "open", label: "statusOptions.open" }, { value: "closing", label: "statusOptions.closing" }, { value: "closed", label: "statusOptions.closed" }, { value: "drawing", label: "statusOptions.drawing" }, { value: "review", label: "statusOptions.review" }, { value: "cooldown", label: "statusOptions.cooldown" }, { value: "settling", label: "statusOptions.settling" }, { value: "settled", label: "statusOptions.settled" }, { value: "cancelled", label: "statusOptions.cancelled" }, ]; export function RiskIndexConsole() { const { t } = useTranslation(["risk", "common"]); const tRef = useTranslationRef(["risk", "common"]); const exportLabels = useExportLabels("riskIndex"); const formatDt = useAdminDateTimeFormatter(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); const [drawNoInput, setDrawNoInput] = useState(""); const [drawNoQuery, setDrawNoQuery] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const riskStatusTriggerLabel = useMemo(() => { if (statusFilter === "") { return t("all"); } const key = DRAW_STATUS_OPTIONS.find((o) => o.value === statusFilter)?.label; return key ? t(key) : statusFilter; }, [statusFilter, t]); const load = useCallback(async () => { setLoading(true); setError(null); try { const d = await getAdminDraws({ page, per_page: perPage, ...(drawNoQuery.trim() !== "" ? { draw_no: drawNoQuery.trim() } : {}), ...(statusFilter !== "" ? { status: statusFilter } : {}), }); setData(d); } catch (e) { const msg = e instanceof LotteryApiBizError ? e.message : tRef.current("loadDrawListFailed"); setError(msg); setData(null); } finally { setLoading(false); } }, [page, perPage, drawNoQuery, statusFilter]); useAsyncEffect(() => { void load(); }, [page, perPage, drawNoQuery, statusFilter]); function applySearch(): void { setDrawNoQuery(drawNoInput.trim()); setPage(1); } const total = data?.meta.total ?? 0; const lastPage = Math.max(1, data?.meta.last_page ?? 1); return ( {t("center")}
setDrawNoInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { applySearch(); } }} />
{error ?

{error}

: null}
{t("drawNo")} {t("status")} {t("closeTime")} {t("table.actions", { ns: "common" })} {loading && (data?.items.length ?? 0) === 0 ? ( ) : (data?.items ?? []).length === 0 ? ( ) : ( (data?.items ?? []).map((row: AdminDrawListItem) => ( {row.draw_no} {row.close_time ? formatDt(row.close_time) : "—"} )) )}
{ setPerPage(n); setPage(1); }} onPageChange={setPage} />
); }