"use client"; import { Wallet } from "lucide-react"; import Image from "next/image"; import { useEffect, useRef } from "react"; import { useTranslation } from "react-i18next"; import { useSWRConfig } from "swr"; import { getWalletBalance } from "@/api/wallet"; import { PlayerMoneyDisplay } from "@/components/player-money-display"; import { Skeleton } from "@/components/ui/skeleton"; import { TransferInDialog, TransferOutDialog, } from "@/features/wallet/wallet-transfer-dialogs"; import { useActivePlayerCurrency } from "@/hooks/use-active-player-currency"; import { useApiQuery } from "@/hooks/use-api-query"; import { formatMinorAsCurrency } from "@/lib/money"; import { isCreditFundingPlayer } from "@/lib/player-funding-mode"; import { PLAYER_CURRENCY_CHANGE_EVENT } from "@/lib/player-currency-preference"; import { cn } from "@/lib/utils"; import { useNetworkConnectionStore } from "@/stores/network-connection-store"; const BALANCE_KEY = (currency: string) => ["wallet/balance", currency]; export function HallWalletStrip() { const mode = useNetworkConnectionStore((s) => s.mode); const { t } = useTranslation("player"); const { activeCurrency } = useActivePlayerCurrency(); const { mutate } = useSWRConfig(); const degradedWalletPollRef = useRef(null); const currency = activeCurrency; const isDegraded = mode === "polling" || mode === "offline"; const { data: balance, isLoading: loading } = useApiQuery( BALANCE_KEY(currency), () => getWalletBalance({ currency }), { // 降级模式下 60 秒自动刷新,SWR 内置定时器代替手动 setInterval refreshInterval: isDegraded ? 60_000 : undefined, }, ); // 全局事件触发刷新(下注后、币种切换等场景) useEffect(() => { const onRefresh = () => void mutate(BALANCE_KEY(currency)); window.addEventListener("lottery-wallet-refresh", onRefresh); window.addEventListener(PLAYER_CURRENCY_CHANGE_EVENT, onRefresh); return () => { window.removeEventListener("lottery-wallet-refresh", onRefresh); window.removeEventListener(PLAYER_CURRENCY_CHANGE_EVENT, onRefresh); }; }, [mutate, currency]); // 非降级模式时清理遗留计时器(refreshInterval 已由 SWR 管理) useEffect(() => { if (!isDegraded && degradedWalletPollRef.current !== null) { window.clearInterval(degradedWalletPollRef.current); degradedWalletPollRef.current = null; } }, [isDegraded]); const availableMinor = Number(balance?.available_balance ?? balance?.balance ?? 0); const isCreditPlayer = isCreditFundingPlayer(balance); const balanceMinor = Number(balance?.balance ?? 0); const headlineMinor = isCreditPlayer ? availableMinor : balanceMinor; const transferInLotteryMinor = isCreditPlayer ? availableMinor : balanceMinor; const mainMinor = balance?.main_balance === null || balance?.main_balance === undefined ? null : Number(balance.main_balance); return (

{isCreditPlayer ? t("wallet.creditAvailable", { defaultValue: "可用信用" }) : t("wallet.balance")}

{loading ? ( ) : ( )} {isCreditPlayer && !loading && balance ? (

{t("wallet.creditSummary", { defaultValue: "授信 {{limit}} · 已用 {{used}}", limit: formatMinorAsCurrency(balance.credit_limit ?? 0, currency), used: formatMinorAsCurrency(balance.used_credit ?? 0, currency), })}

) : null}
{isCreditPlayer ? null : (
{ await mutate(BALANCE_KEY(currency)); }} /> { await mutate(BALANCE_KEY(currency)); }} />
)}
); }