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
This commit is contained in:
2025-11-03 23:41:12 +00:00
parent 662557c933
commit 308eafac62
3 changed files with 12 additions and 1 deletions
+1
View File
@@ -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;
+6 -1
View File
@@ -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);
+5
View File
@@ -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,