feat: implement Phase 30 - useGameStatus hook
Extract game status logic into dedicated hook following vim-maze pattern: New Module Structure: - src/useGameStatus/types.ts: GameStatus and GameStatusManager types - src/useGameStatus/useGameStatus.ts: Hook implementation - src/useGameStatus/index.ts: Public exports Hook Implementation: - State machine with 5 states (waiting/started/paused/game-over/game-won) - Methods: startGame, togglePause, quitGame, setGameStatus - Clean state transitions with useState - Simpler than vim-maze (no intermediate 'has-key' state) Updated Core Files: - src/useGame.ts: Use useGameStatus() instead of inline useState - Compose gameStatusManager into GameManager - Cleaner separation of concerns - src/types.ts: Import and re-export GameStatus types - GameManager extends GameStatusManager (intersection type) - Single source of truth for status types - src/index.ts: Export useGameStatus hook publicly Benefits: - Reusable state machine - Easier to test in isolation - Follows unified API architecture - Matches vim-maze patterns State Transitions: waiting → startGame() → started ↔ togglePause() ↔ paused started → (win/lose) → game-won/game-over * → quitGame() → waiting Phase 30 complete. Next: Phase 40 (useCursor composition).
This commit is contained in:
+3
-7
@@ -1,8 +1,9 @@
|
||||
import type { RefObject } from 'react';
|
||||
import type { GameStatus, GameStatusManager } from './useGameStatus/types';
|
||||
|
||||
export type Difficulty = 'easy' | 'medium' | 'hard';
|
||||
|
||||
export type GameStatus = 'waiting' | 'started' | 'paused' | 'game-over' | 'game-won';
|
||||
export type { GameStatus, GameStatusManager };
|
||||
|
||||
export type GameOptions = {
|
||||
difficulty?: Difficulty;
|
||||
@@ -13,11 +14,6 @@ export type KeyLogEntry = { key: string; timestamp: number };
|
||||
export type GameManager = {
|
||||
containerRef: RefObject<HTMLDivElement | null>;
|
||||
renderBoard: () => void;
|
||||
gameStatus: GameStatus;
|
||||
setGameStatus: (status: GameStatus) => void;
|
||||
startGame: () => void;
|
||||
togglePause: (pause?: boolean) => void;
|
||||
quitGame: () => void;
|
||||
cursor: any;
|
||||
scoreManager: {
|
||||
timeValue: number;
|
||||
@@ -27,4 +23,4 @@ export type GameManager = {
|
||||
keyLog: KeyLogEntry[];
|
||||
clearKeyLog: () => void;
|
||||
getKeyLog: () => KeyLogEntry[];
|
||||
};
|
||||
} & GameStatusManager;
|
||||
|
||||
Reference in New Issue
Block a user