"use client"; import Link from "next/link"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { getAdminRiskPoolDetail } from "@/api/admin-risk"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { buttonVariants } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { formatAdminMinorUnits } from "@/lib/money"; import { cn } from "@/lib/utils"; import { LotteryApiBizError } from "@/types/api/errors"; import type { AdminRiskPoolDetailLogRow, AdminRiskPoolShowData } from "@/types/api/admin-risk"; export function RiskPoolDetailConsole({ drawId, number4d, }: { drawId: number; number4d: string; }) { const { t } = useTranslation(["risk", "common"]); const formatDt = useAdminDateTimeFormatter(); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(20); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const load = useCallback(async () => { setLoading(true); setError(null); try { const d = await getAdminRiskPoolDetail(drawId, number4d, { page, per_page: perPage }); setData(d); } catch (e) { const msg = e instanceof LotteryApiBizError ? e.message : t("loadDetailFailed"); setError(msg); setData(null); } finally { setLoading(false); } }, [drawId, number4d, page, perPage, t]); useEffect(() => { queueMicrotask(() => { void load(); }); }, [load]); if (error && !data) { return ( {t("detailTitle")}

{error}

{t("backToList")}
); } if (loading && !data) { return

{t("states.loading", { ns: "common" })}

; } if (!data) { return null; } const { pool, logs } = data; return (
← {t("backToAllPools")}
{t("numberTitle", { number: pool.normalized_number })}

{t("drawMeta", { drawNo: data.draw_no })}

{t("totalCap")}

{formatAdminMinorUnits(pool.total_cap_amount)}

{t("lockedWorstCase")}

{formatAdminMinorUnits(pool.locked_amount)}

{t("remainingSellable")}

{formatAdminMinorUnits(pool.remaining_amount)}

{t("isSoldOut")}

{pool.is_sold_out ? t("yes") : t("no")}

{t("usageRatio")}{" "} {pool.usage_ratio != null ? `${(pool.usage_ratio * 100).toFixed(2)}%` : "—"}

{t("occupationLogs")}
{t("time")} {t("action")} {t("amount")} {t("source")} {t("ticketNo")} {t("playCode")} {logs.items.map((row: AdminRiskPoolDetailLogRow) => ( {row.created_at ? formatDt(row.created_at) : "—"} {row.action_type} {formatAdminMinorUnits(row.amount)} {row.source_reason ?? "—"} {row.ticket_no ?? "—"} {row.play_code ?? "—"} ))}
{ setPerPage(n); setPage(1); }} onPageChange={setPage} />
); }