"use client"; import Link from "next/link"; import { useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAsyncEffect } from "@/hooks/use-async-effect"; import { useTranslationRef } from "@/hooks/use-translation-ref"; 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 { AdminLoadingState, AdminLoadingInline, AdminTableLoadingRow } from "@/components/admin/admin-loading-state"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useAdminCurrencyCatalog } from "@/hooks/use-admin-currency-catalog"; import { useAdminPlayCodeLabel } from "@/hooks/use-admin-play-type-catalog"; import { useExportLabels } from "@/hooks/use-export-labels"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { riskActionTypeLabel, riskSourceReasonLabel } from "@/modules/risk/risk-display"; 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 tRef = useTranslationRef(["risk", "common"]); const exportLabels = useExportLabels("riskPoolDetail", { number: number4d }); useAdminCurrencyCatalog(); const playCodeLabel = useAdminPlayCodeLabel(); const formatDt = useAdminDateTimeFormatter(); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); 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 : tRef.current("loadDetailFailed"); setError(msg); setData(null); } finally { setLoading(false); } }, [drawId, number4d, page, perPage]); useAsyncEffect(() => { void load(); }, [drawId, number4d, page, perPage]); if (error && !data) { return ( {t("detailTitle")}

{error}

{t("backToList")}
); } if (loading && !data) { return ; } if (!data) { return null; } const { pool, logs } = data; const currencyCode = data.currency_code ?? "NPR"; return (
← {t("backToAllPools")}
{t("numberTitle", { number: pool.normalized_number })}

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

{t("totalCap")}

{formatAdminMinorUnits(pool.total_cap_amount, currencyCode)}

{t("lockedWorstCase")}

{formatAdminMinorUnits(pool.locked_amount, currencyCode)}

{t("remainingSellable")}

{formatAdminMinorUnits(pool.remaining_amount, currencyCode)}

{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) : "—"} {riskActionTypeLabel(row.action_type, t)} {formatAdminMinorUnits(row.amount, currencyCode)} {riskSourceReasonLabel(row.source_reason, t)} {row.ticket_no ?? "—"} {playCodeLabel(row.play_code)} ))}
{ setPerPage(n); setPage(1); }} onPageChange={setPage} />
); }