From 308eafac62fcf6f232b16e34a8d8bcb1177e77ff Mon Sep 17 00:00:00 2001 From: Andre Padez Date: Mon, 3 Nov 2025 23:41:12 +0000 Subject: [PATCH] fix: preserve gameStatus when switching game modes - Stop passing gameMode as dependency to useGameStatus initialization - Create useGameStatus once with default 'letters' mode - Add setGameMode method to update mode via ref without recreating hook - Update gameMode via effect in useGame when it changes - Fixes issue where switching to letters mode and starting game would reset to waiting --- src/types.ts | 1 + src/useGame/useGame.ts | 7 ++++++- src/useGameStatus/useGameStatus.ts | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/types.ts b/src/types.ts index b613788..be14807 100755 --- a/src/types.ts +++ b/src/types.ts @@ -107,6 +107,7 @@ export type GameStatusManager = { updatePlayerX: (x: number) => void; handleTypedLetter: (letter: string) => void; setGameLoopCallback: (callback: (deltaTime: number, letters: FallingLetter[]) => void) => void; + setGameMode: (mode: GameMode) => void; addCorrect: () => void; addMissed: () => void; addDeath: () => void; diff --git a/src/useGame/useGame.ts b/src/useGame/useGame.ts index 0cd9809..25cd9e9 100755 --- a/src/useGame/useGame.ts +++ b/src/useGame/useGame.ts @@ -14,7 +14,7 @@ export function useGame( const boardManager = useBoard(); const cursorManager = useCursor(); - const gameStatusManager = useGameStatus(undefined, gameMode); + const gameStatusManager = useGameStatus(); // Wrap renderBoard to include player position const renderBoardWrapped = (letters: any = []) => { @@ -35,6 +35,11 @@ export function useGame( renderBoardWrapped(letters); }; + // Update gameMode when it changes (without recreating gameStatus state) + useEffect(() => { + gameStatusManager.setGameMode(gameMode); + }, [gameMode, gameStatusManager]); + // Set the game loop callback useEffect(() => { gameStatusManager.setGameLoopCallback(handleGameLoopTick); diff --git a/src/useGameStatus/useGameStatus.ts b/src/useGameStatus/useGameStatus.ts index 4224adc..ce13522 100755 --- a/src/useGameStatus/useGameStatus.ts +++ b/src/useGameStatus/useGameStatus.ts @@ -165,6 +165,10 @@ export function useGameStatus(onGameLoopTick?: (deltaTime: number, letters: Fall onGameLoopTickRef.current = callback; }, []); + const setGameMode = useCallback((mode: GameMode) => { + gameModeRef.current = mode; + }, []); + const addCorrect = useCallback(() => { setScore(prev => prev + 1); setCorrect(prev => prev + 1); @@ -189,6 +193,7 @@ export function useGameStatus(onGameLoopTick?: (deltaTime: number, letters: Fall shipExplosionTime, updatePlayerX, setGameLoopCallback, + setGameMode, addCorrect, addMissed, addDeath,