feat(game): 添加连胜触发的奖池刷新功能

- 添加奖池刷新定时器和延迟配置
- 实现从游戏大厅初始化获取最新奖池数据
- 添加连胜计数达到阈值时的奖池刷新调度逻辑
- 在用户连胜状态更新时触发奖池刷新检查
- 添加错误处理和调试日志
- 确保定时器正确清理避免内存泄漏
This commit is contained in:
JiaJun
2026-07-15 15:42:15 +08:00
parent fe3b839297
commit fa40c23720

View File

@@ -221,6 +221,55 @@ function applyPeriodPayoutMessage(
useGameRoundStore.getState().playPreparedRevealAnimation(roundId || null)
}
let jackpotPoolRefreshTimerId: number | null = null
const JACKPOT_STREAK_TRIGGER_COUNT = 10
const JACKPOT_POOL_REFRESH_DELAY_MS = 2_000
async function refreshJackpotPoolFromLobbyInit() {
const authState = useAuthStore.getState()
if (authState.status !== 'authenticated' || !authState.accessToken) {
return
}
try {
const result = await getGameLobbyInit()
useGameSessionStore.getState().syncDashboard({
jackpotPool: result.snapshot.dashboard.jackpotPool,
updatedAt: result.snapshot.dashboard.updatedAt,
})
} catch (error) {
console.error(
'Failed to refresh jackpot pool after streak milestone',
error,
)
}
}
function scheduleJackpotPoolRefreshForStreak(
previousStreak: number,
nextStreak: number | undefined,
) {
if (
nextStreak !== JACKPOT_STREAK_TRIGGER_COUNT ||
previousStreak >= JACKPOT_STREAK_TRIGGER_COUNT ||
typeof window === 'undefined'
) {
return
}
if (jackpotPoolRefreshTimerId !== null) {
window.clearTimeout(jackpotPoolRefreshTimerId)
}
jackpotPoolRefreshTimerId = window.setTimeout(() => {
jackpotPoolRefreshTimerId = null
void refreshJackpotPoolFromLobbyInit()
}, JACKPOT_POOL_REFRESH_DELAY_MS)
}
function applyUserStreakMessage(message: GameSocketMessage) {
const streakData = extractUserStreakMessageData(message)
const currentUser = useAuthStore.getState().currentUser
@@ -229,6 +278,11 @@ function applyUserStreakMessage(message: GameSocketMessage) {
return
}
scheduleJackpotPoolRefreshForStreak(
currentUser.currentStreak ?? 0,
streakData.currentStreak,
)
useAuthStore.getState().setCurrentUser({
...currentUser,
currentStreak: streakData.currentStreak,
@@ -299,6 +353,11 @@ function applyBetWinMessage(message: GameSocketMessage) {
return
}
scheduleJackpotPoolRefreshForStreak(
currentUser.currentStreak ?? 0,
betWinData.current_streak,
)
useAuthStore.getState().setCurrentUser({
...currentUser,
coin: betWinData.balance_after ?? currentUser.coin,