diff --git a/src/hooks/use-game-realtime-sync.ts b/src/hooks/use-game-realtime-sync.ts index 5fe620b..074bc5f 100644 --- a/src/hooks/use-game-realtime-sync.ts +++ b/src/hooks/use-game-realtime-sync.ts @@ -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,