feat(game): 添加游戏历史记录实时同步功能

- 实现了游戏历史记录的实时推送和展示功能
- 添加了总奖池金额显示在历史记录界面中
- 新增 PeriodPayoutHistoryEntry 和 PeriodPayoutEventData 类型定义
- 在游戏状态管理中添加了待处理赔付历史记录状态
- 实现了 WebSocket 消息解析器来处理赔付数据
- 添加了移动端和桌面端历史记录组件的实时数据展示
- 集成了注册邀请码查询参数功能并优化了注册表单逻辑
- 重构了历史记录视图模型以支持实时数据流处理
This commit is contained in:
JiaJun
2026-06-12 11:51:32 +08:00
parent 5768632313
commit 800e737470
11 changed files with 267 additions and 43 deletions

View File

@@ -6,6 +6,7 @@ import type {
JackpotHitEventDataDto,
JackpotHitItemDto,
PeriodEventData,
PeriodPayoutEventData,
UserStreakMessageData,
WalletChangedData,
} from '@/type'
@@ -187,6 +188,58 @@ export function extractPeriodEventData(
}
}
function toNumberArray(value: unknown) {
if (!Array.isArray(value)) {
return []
}
return value
.map((item) => toOptionalNumber(item))
.filter(
(item): item is number =>
typeof item === 'number' && Number.isInteger(item),
)
}
function toStringArray(value: unknown) {
if (!Array.isArray(value)) {
return []
}
return value
.map((item) => toOptionalString(item))
.filter((item): item is string => typeof item === 'string')
}
export function extractPeriodPayoutData(
message: GameSocketMessage,
): PeriodPayoutEventData | null {
const period = extractPeriodEventData(message)
if (!period) {
return null
}
const data = getNestedRecord(message, 'data')
const source = data ?? (message as Record<string, unknown>)
const root = message as Record<string, unknown>
return {
...period,
betAmount: toOptionalString(source.bet_amount) ?? null,
betFlowerNames: toStringArray(source.bet_flower_names),
betNumbers: toNumberArray(source.bet_numbers),
payoutRemainingSeconds:
toOptionalNumber(source.payout_remaining_seconds) ?? null,
payoutSeconds: toOptionalNumber(source.payout_seconds) ?? null,
payoutUntil: toOptionalNumber(source.payout_until) ?? null,
resultFlowerName: toOptionalString(source.result_flower_name) ?? null,
serverTime:
toOptionalNumber(source.server_time ?? root.server_time) ?? null,
winAmount: toOptionalString(source.win_amount) ?? null,
}
}
export function extractWalletChangedData(
message: GameSocketMessage,
): WalletChangedData | null {