feat: 优化大厅期号倒计时并改用服务端时间同步

This commit is contained in:
2026-05-16 10:32:05 +08:00
parent d5415888e6
commit 9a1dea59de
4 changed files with 43 additions and 14 deletions

View File

@@ -5,12 +5,13 @@ import { useCallback, useEffect, useState } from "react";
import { getDrawCurrent } from "@/api/draw";
import { getLotteryEcho } from "@/lib/lottery-echo";
import { useNetworkConnectionStore } from "@/stores/network-connection-store";
import type { DrawCurrentPayload } from "@/types/api/draw-current";
import type { DrawCurrentPayload, DrawCurrentResponse } from "@/types/api/draw-current";
/** 大厅共享的当期快照(由 {@link useHallDrawLive} 产出,供期号条与下注表共用)。 */
export type HallDrawLiveSnapshot = {
raw: DrawCurrentPayload | null | undefined;
display: DrawCurrentPayload | null | undefined;
serverNowMs: number;
error: string | null;
reload: () => Promise<void>;
isBettable: boolean;
@@ -48,6 +49,7 @@ function applySnapshotDrift(
*/
export function useHallDrawLive(): HallDrawLiveSnapshot {
const [raw, setRaw] = useState<DrawCurrentPayload | null | undefined>(undefined);
const [serverNowMs, setServerNowMs] = useState(() => Date.now());
const [emittedAtMs, setEmittedAtMs] = useState(() => Date.now());
const [nowMs, setNowMs] = useState(() => Date.now());
const [error, setError] = useState<string | null>(null);
@@ -72,17 +74,22 @@ export function useHallDrawLive(): HallDrawLiveSnapshot {
setEmittedAtMs(evt.emitted_at_ms ?? Date.now());
}, []);
const updateFromResponse = useCallback((resp: DrawCurrentResponse) => {
setServerNowMs(resp.server_now_ms);
setRaw(resp.data);
setEmittedAtMs(resp.server_now_ms);
}, []);
const load = useCallback(async () => {
try {
setError(null);
const d = await getDrawCurrent();
setRaw(d);
setEmittedAtMs(Date.now());
updateFromResponse(d);
} catch {
setError("draw.loadFailedRefresh");
setRaw(undefined);
}
}, []);
}, [updateFromResponse]);
// 初始加载
useEffect(() => {
@@ -228,5 +235,5 @@ export function useHallDrawLive(): HallDrawLiveSnapshot {
const isBettable = display != null && display.status === "open";
return { raw, display, error, reload: load, isBettable };
return { raw, display, serverNowMs, error, reload: load, isBettable };
}