feat: 优化大厅期号倒计时并改用服务端时间同步
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user