"use client"; import Link from "next/link"; import { BriefcaseBusiness, CheckCircle2, Clock3, RefreshCw, XIcon } from "lucide-react"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { getDrawResults } from "@/api/draw"; import { getTicketDrawMyMatch, getTicketItems } from "@/api/ticket-items"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { PlayerPanel } from "@/components/layout/player-panel"; import { useCurrencyCatalog } from "@/hooks/use-currency-catalog"; import { formatMinorAsCurrency } from "@/lib/money"; import { formatPlayerInstant } from "@/lib/player-datetime"; import { playLabel } from "@/lib/play-labels"; import { useActivePlayerCurrency } from "@/hooks/use-active-player-currency"; import type { DrawResultListItem } from "@/types/api/draw-results"; import type { TicketDrawMyMatchPayload, TicketItemListRow } from "@/types/api/ticket-items"; type WinningCheckResult = { draw: DrawResultListItem; match: TicketDrawMyMatchPayload; tickets: TicketItemListRow[]; }; export function CheckWinningScreen() { const { t } = useTranslation("player"); useCurrencyCatalog(); const [ticketNo, setTicketNo] = useState(""); const [latestDraw, setLatestDraw] = useState(null); const [recent, setRecent] = useState([]); const [result, setResult] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { queueMicrotask(() => { void (async () => { try { const res = await getDrawResults({ page: 1, size: 1 }); setLatestDraw(res.items[0] ?? null); } catch { setLatestDraw(null); } })(); }); }, []); const normalizedTicketNo = ticketNo.trim(); const runCheck = useCallback(async () => { if (!latestDraw || normalizedTicketNo === "") { return; } setLoading(true); setError(null); try { const [match, tickets] = await Promise.all([ getTicketDrawMyMatch(latestDraw.draw_no), getTicketItems({ draw_no: latestDraw.draw_no, number: normalizedTicketNo, per_page: 10, page: 1, }), ]); const next = { draw: latestDraw, match, tickets: tickets.items, }; setResult(next); setRecent((current) => [normalizedTicketNo, ...current.filter((x) => x !== normalizedTicketNo)].slice(0, 5)); } catch { setError(t("results.check.loadFailed")); } finally { setLoading(false); } }, [latestDraw, normalizedTicketNo, t]); return (

{t("results.check.enterTicket")}

{t("results.check.description")}

{latestDraw ? (

{t("results.check.latestDraw", { drawNo: latestDraw.draw_no })}

) : null} {error ?

{error}

: null}

{t("results.check.recent")}

{recent.length > 0 ? ( ) : null}
{recent.length === 0 ? (

{t("results.check.noRecent")}

) : ( recent.map((row) => ( )) )}
{ if (!open) setResult(null); }} onCheckAnother={() => { setResult(null); setTicketNo(""); }} />
); } function WinningResultDialog({ open, data, query, onOpenChange, onCheckAnother, }: { open: boolean; data: WinningCheckResult | null; query: string; onOpenChange: (open: boolean) => void; onCheckAnother: () => void; }) { const { t } = useTranslation("player"); const totalWin = (data?.match.total_win_minor ?? 0) + (data?.match.total_jackpot_win_minor ?? 0); const isWon = totalWin > 0 || (data?.match.winning_ticket_count ?? 0) > 0; const firstTicket = useMemo(() => data?.tickets[0] ?? null, [data]); const { activeCurrency } = useActivePlayerCurrency(); const currency = firstTicket?.currency_code ?? activeCurrency; if (!data) return null; return (
{isWon ? t("results.check.winTitle") : t("results.check.noWinTitle")} {t("results.check.ticketNumber")}
{query}

{t("results.check.match")}

{firstTicket ? playLabel(firstTicket.play_code, t) : isWon ? t("orders.hit") : "—"}

{t("results.check.amount")}

{formatMinorAsCurrency(totalWin, currency)}

{t("results.check.drawInfo")}

{t("results.check.issueNo")}

{data.draw.draw_no}

{t("results.businessDate")}

{data.draw.business_date}

{t("results.drawTime", { time: "" }).replace(":", "").trim()}

{formatPlayerInstant(data.draw.draw_time_iso ?? data.draw.draw_time ?? null)}

); }