@sudobility/sudojo_lib 0.0.83 → 0.0.85
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/authProviders.js.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useBoardEntry.js.map +1 -1
- package/dist/hooks/useDailyGame.js.map +1 -1
- package/dist/hooks/useGame.js.map +1 -1
- package/dist/hooks/useGamePersistence.js.map +1 -1
- package/dist/hooks/useGamePlay.d.ts +2 -2
- package/dist/hooks/useGamePlay.d.ts.map +1 -1
- package/dist/hooks/useGamePlay.js +3 -2
- package/dist/hooks/useGamePlay.js.map +1 -1
- package/dist/hooks/useGameSession.d.ts.map +1 -1
- package/dist/hooks/useGameSession.js +20 -9
- package/dist/hooks/useGameSession.js.map +1 -1
- package/dist/hooks/useGameTeaching.js.map +1 -1
- package/dist/hooks/useGameTimer.js.map +1 -1
- package/dist/hooks/useHint.js.map +1 -1
- package/dist/hooks/useLearning.js.map +1 -1
- package/dist/hooks/useLevelGame.js.map +1 -1
- package/dist/hooks/useLevels.js.map +1 -1
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/dist/hooks/useSudoku.js.map +1 -1
- package/dist/hooks/useTechniques.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stores/gamePlayStore.d.ts +1 -1
- package/dist/stores/gamePlayStore.d.ts.map +1 -1
- package/dist/stores/gamePlayStore.js +18 -2
- package/dist/stores/gamePlayStore.js.map +1 -1
- package/dist/test/setup.js.map +1 -1
- package/dist/types/currentGame.d.ts +6 -0
- package/dist/types/currentGame.d.ts.map +1 -1
- package/dist/types/currentGame.js.map +1 -1
- package/dist/types/display.js.map +1 -1
- package/dist/types/game.js.map +1 -1
- package/dist/types/gamePersistence.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/progress.js.map +1 -1
- package/dist/types/settings.js.map +1 -1
- package/dist/types/subscription.js.map +1 -1
- package/dist/types/sudoku.js.map +1 -1
- package/dist/utils/board.js.map +1 -1
- package/dist/utils/digitDisplay.js.map +1 -1
- package/dist/utils/hintExplanation.js.map +1 -1
- package/dist/utils/i18nKeys.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/localizedHint.js.map +1 -1
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/subscription.js.map +1 -1
- package/dist/utils/sudokuPresenter.js.map +1 -1
- package/dist/utils/sudokuScrambler.js.map +1 -1
- package/dist/utils/technique.js.map +1 -1
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/validation.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authProviders.js","sourceRoot":"","sources":["../../src/config/authProviders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,qDAAqD;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAwB;IACzD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,IAAI;CACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"authProviders.js","sourceRoot":"","sources":["../../src/config/authProviders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,qDAAqD;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAwB;IACzD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,IAAI;CACtB,CAAC","sourcesContent":["/**\n * Shared auth provider configuration\n *\n * Single source of truth for which authentication providers are enabled\n * across all Sudojo apps (web and mobile).\n */\n\n/** Available authentication provider types */\nexport type AuthProviderType = 'google' | 'apple' | 'email';\n\n/** Configuration for enabled auth providers */\nexport interface AuthProvidersConfig {\n /** Which providers to enable */\n providers: AuthProviderType[];\n /** Enable anonymous sign-in fallback */\n enableAnonymous?: boolean;\n}\n\n/** Default auth providers config used by all apps */\nexport const DEFAULT_AUTH_PROVIDERS: AuthProvidersConfig = {\n providers: ['google', 'email'],\n enableAnonymous: true,\n};\n"]}
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC","sourcesContent":["export type { AuthProviderType, AuthProvidersConfig } from './authProviders';\nexport { DEFAULT_AUTH_PROVIDERS } from './authProviders';\n"]}
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQlD,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQ9D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ7D,sBAAsB;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,wCAAwC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMvE,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,2CAA2C;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQlD,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQ9D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ7D,sBAAsB;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,wCAAwC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMvE,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,2CAA2C;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n * Hook exports for Sudojo library\n */\n\n// Levels hooks\nexport { useLevel, useLevels } from './useLevels';\nexport type {\n UseLevelOptions,\n UseLevelResult,\n UseLevelsOptions,\n UseLevelsResult,\n} from './useLevels';\n\n// Techniques hooks\nexport { useTechnique, useTechniques } from './useTechniques';\nexport type {\n UseTechniqueOptions,\n UseTechniqueResult,\n UseTechniquesOptions,\n UseTechniquesResult,\n} from './useTechniques';\n\n// Learning hooks\nexport { useLearning, useLearningItem } from './useLearning';\nexport type {\n UseLearningItemOptions,\n UseLearningItemResult,\n UseLearningOptions,\n UseLearningResult,\n} from './useLearning';\n\n// Game hooks (legacy)\nexport { useGame } from './useGame';\nexport type { UseGameOptions, UseGameResult } from './useGame';\n\n// Teaching hooks\nexport { useGameTeaching } from './useGameTeaching';\nexport type {\n UseGameTeachingOptions,\n UseGameTeachingResult,\n} from './useGameTeaching';\n\n// Sudoku hooks (ported from renderable)\nexport { useSudoku } from './useSudoku';\nexport type { UseSudokuOptions, UseSudokuResult } from './useSudoku';\n\n// Game fetching hooks (with auth/subscription handling)\nexport { useLevelGame } from './useLevelGame';\nexport type {\n UseLevelGameOptions,\n UseLevelGameResult,\n GameFetchStatus,\n} from './useLevelGame';\n\nexport { useDailyGame } from './useDailyGame';\nexport type { UseDailyGameOptions, UseDailyGameResult } from './useDailyGame';\n\n// Game timer hook\nexport { useGameTimer } from './useGameTimer';\nexport type { UseGameTimerOptions, UseGameTimerResult } from './useGameTimer';\n\n// Game persistence hooks\nexport { useGamePersistence, useAutoSave } from './useGamePersistence';\nexport type {\n UseGamePersistenceOptions,\n UseGamePersistenceResult,\n} from './useGamePersistence';\n\n// Local storage hook\nexport { useLocalStorage } from './useLocalStorage';\n\n// Hint hook\nexport { useHint } from './useHint';\nexport type {\n UseHintOptions,\n UseHintResult,\n HintBoardData,\n HintReceivedData,\n HintAccessError,\n} from './useHint';\n\n// Game play hook (current game management)\nexport { useGamePlay } from './useGamePlay';\nexport type { UseGamePlayOptions, UseGamePlayResult } from './useGamePlay';\n\n// Board entry hook\nexport { useBoardEntry } from './useBoardEntry';\nexport type {\n UseBoardEntryOptions,\n UseBoardEntryReturn,\n ValidatedPuzzle,\n} from './useBoardEntry';\n\n// Game session hook\nexport { useGameSession } from './useGameSession';\nexport type {\n UseGameSessionOptions,\n GameSessionResult,\n GameFinishResult,\n} from './useGameSession';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBoardEntry.js","sourceRoot":"","sources":["../../src/hooks/useBoardEntry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useBoardEntry.js","sourceRoot":"","sources":["../../src/hooks/useBoardEntry.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for managing Sudoku board entry mode state\n * Allows users to enter given clues for a custom puzzle\n */\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { SudokuCell } from '../types';\nimport { useSolverValidate } from '@sudobility/sudojo_client';\nimport type { NetworkClient } from '@sudobility/types';\n\nexport interface ValidatedPuzzle {\n puzzle: string;\n solution: string;\n}\n\nexport interface UseBoardEntryOptions {\n networkClient: NetworkClient;\n baseUrl: string;\n token: string;\n}\n\nexport interface UseBoardEntryReturn {\n /** 81 cells with given values only */\n cells: SudokuCell[];\n /** Currently selected cell index */\n selectedIndex: number | null;\n /** Whether validation is in progress */\n isValidating: boolean;\n /** Validation error message key */\n validationError: string | null;\n /** Validated puzzle data (puzzle + solution) */\n validatedPuzzle: ValidatedPuzzle | null;\n /** Select a cell by index */\n selectCell: (index: number) => void;\n /** Set a given value at the selected cell */\n setGiven: (value: number) => void;\n /** Erase the selected cell */\n erase: () => void;\n /** Get the puzzle as an 81-character string */\n getPuzzleString: () => string;\n /** Trigger validation */\n validate: () => void;\n /** Reset to empty board */\n reset: () => void;\n /** Number of clues entered */\n clueCount: number;\n /** Set cells from an 81-character puzzle string */\n setCellsFromPuzzle: (puzzle: string) => void;\n}\n\n/**\n * Create an empty 81-cell board for entry mode\n */\nfunction createEmptyBoard(): SudokuCell[] {\n return Array.from({ length: 81 }, (_, index) => ({\n index,\n solution: null,\n given: null,\n input: null,\n pencilmarks: null,\n }));\n}\n\n/**\n * Convert cells to 81-character puzzle string\n * '0' for empty, '1'-'9' for given values\n */\nfunction cellsToPuzzleString(cells: SudokuCell[]): string {\n return cells.map(cell => cell.given?.toString() ?? '0').join('');\n}\n\n/**\n * Count the number of non-empty cells (clues)\n */\nfunction countClues(cells: SudokuCell[]): number {\n return cells.filter(cell => cell.given !== null).length;\n}\n\n/**\n * Create a board from an 81-character puzzle string\n * '0' or '.' for empty, '1'-'9' for given values\n */\nfunction puzzleStringToCells(puzzle: string): SudokuCell[] {\n if (puzzle.length !== 81) {\n return createEmptyBoard();\n }\n\n return Array.from({ length: 81 }, (_, index) => {\n const char = puzzle.charAt(index);\n const value = parseInt(char, 10);\n const given = value >= 1 && value <= 9 ? value : null;\n\n return {\n index,\n solution: null,\n given,\n input: null,\n pencilmarks: null,\n };\n });\n}\n\nexport function useBoardEntry({\n networkClient,\n baseUrl,\n token,\n}: UseBoardEntryOptions): UseBoardEntryReturn {\n const [cells, setCells] = useState<SudokuCell[]>(createEmptyBoard);\n const [selectedIndex, setSelectedIndex] = useState<number | null>(null);\n const [validationError, setValidationError] = useState<string | null>(null);\n const [validatedPuzzle, setValidatedPuzzle] =\n useState<ValidatedPuzzle | null>(null);\n const [shouldValidate, setShouldValidate] = useState(false);\n\n // Compute puzzle string for validation\n const puzzleString = useMemo(() => cellsToPuzzleString(cells), [cells]);\n const clueCount = useMemo(() => countClues(cells), [cells]);\n\n // Use the solver validate hook\n const { data: validateData, isLoading: isValidating } = useSolverValidate(\n networkClient,\n baseUrl,\n token,\n { original: puzzleString },\n {\n enabled: shouldValidate && clueCount >= 17,\n retry: false,\n }\n );\n\n // Track whether we've already processed this validation result\n const processedDataRef = useRef<typeof validateData | null>(null);\n\n // Handle validation result\n useEffect(() => {\n if (!shouldValidate || isValidating) return;\n if (!validateData) return;\n // Avoid re-processing the same result\n if (processedDataRef.current === validateData) return;\n processedDataRef.current = validateData;\n\n // ValidateData has board.solution\n const solution = validateData.data?.board?.solution;\n if (validateData.success && solution) {\n setValidatedPuzzle({\n puzzle: puzzleString,\n solution,\n });\n setValidationError(null);\n } else if (validateData.error) {\n // Validation failed with specific error\n const errorMsg = validateData.error.toLowerCase();\n if (errorMsg.includes('multiple') || errorMsg.includes('not unique')) {\n setValidationError('enter.errors.multipleSolutions');\n } else if (\n errorMsg.includes('cannot solve') ||\n errorMsg.includes('no solution')\n ) {\n setValidationError('enter.errors.noSolution');\n } else {\n setValidationError('enter.errors.validationFailed');\n }\n setValidatedPuzzle(null);\n } else {\n // Unexpected response - success but no solution\n console.error('Unexpected validation response:', validateData);\n setValidationError('enter.errors.validationFailed');\n setValidatedPuzzle(null);\n }\n setShouldValidate(false);\n }, [validateData, shouldValidate, isValidating, puzzleString]);\n\n // Select a cell\n const selectCell = useCallback((index: number) => {\n if (index >= 0 && index < 81) {\n setSelectedIndex(index);\n }\n }, []);\n\n // Set a given value at the selected cell\n const setGiven = useCallback(\n (value: number) => {\n if (selectedIndex === null || value < 1 || value > 9) return;\n\n setCells(prevCells => {\n const newCells = [...prevCells];\n const existing = newCells[selectedIndex];\n if (existing) {\n newCells[selectedIndex] = { ...existing, given: value };\n }\n return newCells;\n });\n\n // Clear validation state when board changes\n setValidationError(null);\n setValidatedPuzzle(null);\n },\n [selectedIndex]\n );\n\n // Erase the selected cell\n const erase = useCallback(() => {\n if (selectedIndex === null) return;\n\n setCells(prevCells => {\n const newCells = [...prevCells];\n const existing = newCells[selectedIndex];\n if (existing) {\n newCells[selectedIndex] = { ...existing, given: null };\n }\n return newCells;\n });\n\n // Clear validation state when board changes\n setValidationError(null);\n setValidatedPuzzle(null);\n }, [selectedIndex]);\n\n // Get puzzle string\n const getPuzzleString = useCallback(() => {\n return puzzleString;\n }, [puzzleString]);\n\n // Trigger validation\n const validate = useCallback(() => {\n // Check minimum clues\n if (clueCount < 17) {\n setValidationError('enter.errors.notEnoughClues');\n return;\n }\n\n // Clear previous state and trigger validation\n setValidationError(null);\n setValidatedPuzzle(null);\n setShouldValidate(true);\n }, [clueCount]);\n\n // Reset to empty board\n const reset = useCallback(() => {\n setCells(createEmptyBoard());\n setSelectedIndex(null);\n setValidationError(null);\n setValidatedPuzzle(null);\n setShouldValidate(false);\n }, []);\n\n // Set cells from puzzle string\n const setCellsFromPuzzle = useCallback((puzzle: string) => {\n setCells(puzzleStringToCells(puzzle));\n setSelectedIndex(null);\n setValidationError(null);\n setValidatedPuzzle(null);\n setShouldValidate(false);\n }, []);\n\n return {\n cells,\n selectedIndex,\n isValidating,\n validationError,\n validatedPuzzle,\n selectCell,\n setGiven,\n erase,\n getPuzzleString,\n validate,\n reset,\n clueCount,\n setCellsFromPuzzle,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDailyGame.js","sourceRoot":"","sources":["../../src/hooks/useDailyGame.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useDailyGame.js","sourceRoot":"","sources":["../../src/hooks/useDailyGame.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for fetching and managing today's daily puzzle\n * Handles auth and subscription status with automatic refresh\n */\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { Daily } from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\nimport { useSudojoTodayDaily } from '@sudobility/sudojo_client';\nimport type { GameFetchStatus } from './useLevelGame';\n\n/** Extended API response with action field from Sudojo API */\ninterface SudojoApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string | null | undefined;\n message?: string;\n action?: {\n type: string;\n options?: string[];\n };\n}\n\n/** Check if response indicates auth is required */\nfunction isAuthRequired(\n response: SudojoApiResponse<unknown> | undefined,\n error: unknown\n): boolean {\n if (\n response?.success === false &&\n response.action?.type === 'auth_required'\n ) {\n return true;\n }\n if (error && typeof error === 'object') {\n const err = error as { message?: string };\n if (err.message?.includes('Account required')) return true;\n }\n return false;\n}\n\n/** Check if response indicates subscription is required */\nfunction isSubscriptionRequired(\n response: SudojoApiResponse<unknown> | undefined,\n error: unknown\n): boolean {\n if (\n response?.success === false &&\n response.action?.type === 'subscription_required'\n ) {\n return true;\n }\n if (error && typeof error === 'object') {\n const err = error as { message?: string };\n if (\n err.message?.includes('Daily limit reached') ||\n err.message?.includes('subscription')\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport interface UseDailyGameOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication */\n token: string;\n /** Whether subscription is currently active */\n subscriptionActive?: boolean;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseDailyGameResult {\n /** Today's daily puzzle */\n daily: Daily | null;\n /** The date string for this daily (YYYY-MM-DD) */\n dailyDate: string | null;\n /** Current status of the game fetch */\n status: GameFetchStatus;\n /** Whether data is loading */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch the daily puzzle */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching today's daily puzzle\n *\n * Automatically refetches when auth token or subscription status changes.\n * Returns status indicating whether auth or subscription is required.\n *\n * @param options - Hook options\n * @returns Daily puzzle data and status\n *\n * @example\n * ```tsx\n * function DailyPage() {\n * const { daily, dailyDate, status, refetch } = useDailyGame({\n * networkClient,\n * config,\n * auth,\n * subscriptionActive: subscription.isActive,\n * });\n *\n * if (status === 'loading') return <Loading />;\n * if (status === 'auth_required') return <AuthRequired onLogin={openAuthModal} />;\n * if (status === 'subscription_required') return <SubscriptionPaywall onSuccess={refetch} />;\n * if (status === 'error') return <Error />;\n *\n * return <SudokuGame puzzle={daily.board} solution={daily.solution} />;\n * }\n * ```\n */\nexport function useDailyGame(options: UseDailyGameOptions): UseDailyGameResult {\n const {\n networkClient,\n baseUrl,\n token,\n subscriptionActive = false,\n enabled: _enabled = true,\n } = options;\n\n // Track previous state to detect changes\n const prevStateRef = useRef({\n authToken: token,\n subscriptionActive,\n });\n\n // Note: useSudojoTodayDaily doesn't support enabled option directly\n // We handle enabled by conditionally using the data\n const { data, isLoading, error, refetch } = useSudojoTodayDaily(\n networkClient,\n baseUrl,\n token\n );\n\n // Determine status based on response\n const status = useMemo((): GameFetchStatus => {\n if (isLoading) return 'loading';\n if (isAuthRequired(data, error)) return 'auth_required';\n if (isSubscriptionRequired(data, error)) return 'subscription_required';\n if (error) return 'error';\n if (data?.success && data.data) return 'success';\n return 'loading';\n }, [isLoading, data, error]);\n\n const daily = useMemo(() => {\n if (data?.success && data.data) {\n return data.data;\n }\n return null;\n }, [data]);\n\n const dailyDate = useMemo((): string | null => {\n if (daily?.date) {\n const dateStr = new Date(daily.date).toISOString().split('T')[0];\n return dateStr ?? null;\n }\n return null;\n }, [daily]);\n\n // Auto-refresh when auth token or subscription status changes\n useEffect(() => {\n const prev = prevStateRef.current;\n const authChanged = prev.authToken !== token;\n const subscriptionChanged = !prev.subscriptionActive && subscriptionActive;\n\n if (authChanged || subscriptionChanged) {\n refetch();\n }\n\n // Update ref for next comparison\n prevStateRef.current = { authToken: token, subscriptionActive };\n }, [token, subscriptionActive, refetch]);\n\n return {\n daily,\n dailyDate,\n status,\n isLoading,\n error: error ?? (data?.error ? new Error(data.error) : null),\n refetch: () => refetch(),\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGame.js","sourceRoot":"","sources":["../../src/hooks/useGame.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EACL,uBAAuB,EACvB,UAAU,EACV,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAuC7B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,GAAc,EAAE;IACvC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC;gBACZ,GAAG;gBACH,MAAM,EAAE,GAAG;gBACX,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,IAAI,GAAG,EAAU;gBAC9B,UAAU,EAAE,KAAK;gBACjB,aAAa,EAAE,KAAK;gBACpB,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,GAAc,EAAE,CAAC,CAAC;IAC3C,KAAK,EAAE,gBAAgB,EAAE;IACzB,cAAc,EAAE,EAAE;IAClB,QAAQ,EAAE,EAAE;IACZ,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,YAAY,EAAE,IAAI,GAAG,EAAE;IACvB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,YAAY,EAAE,IAAI;IAClB,QAAQ,EAAE,EAAE,GAAG,qBAAqB,EAAE;IACtC,MAAM,EAAE,MAAM;IACd,YAAY,EAAE,CAAC;IACf,WAAW,EAAE,CAAC;IACd,WAAW,EAAE,CAAC;IACd,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,IAAI;CACnB,CAAC,CAAC;AAEH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,WAAW,CAAC,KAAgB,EAAE,MAAkB;IACvD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,SAAS,EACT,SAAS,GACV,GAAG,MAAM,CAAC;YAEX,gCAAgC;YAChC,MAAM,cAAc,GAAG,QAAQ;gBAC7B,CAAC,CAAC,aAAa,CACX,MAAM,EACN,QAAQ,EACR,cAAc,IAAI,uBAAuB,CAC1C;gBACH,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEjC,8CAA8C;YAC9C,MAAM,KAAK,GAAG,eAAe,CAC3B,cAAc,CAAC,MAAM,EACrB,cAAc,CAAC,QAAQ,CACxB,CAAC;YAEF,OAAO;gBACL,GAAG,kBAAkB,EAAE;gBACvB,uDAAuD;gBACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK;gBACL,cAAc,EAAE,MAAM;gBACtB,QAAQ;gBACR,eAAe,EAAE,cAAc,CAAC,MAAM;gBACtC,iBAAiB,EAAE,cAAc,CAAC,QAAQ;gBAC1C,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,SAAS,EAAE,SAAS,IAAI,IAAI;aAC7B,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YAC/B,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAEvC,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;aAC9B,CAAC;QACJ,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;gBACnC,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEpE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAEvC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEzC,6BAA6B;YAC7B,MAAM,SAAS,GAAG,cAAc,CAC9B,KAAK,CAAC,iBAAiB,EACvB,GAAG,EACH,MAAM,EACN,KAAK,CACN,CAAC;YACF,MAAM,SAAS,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;YAE1D,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,EAAE,EAAE,uCAAuC;gBAClE,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,yBAAyB;YACzB,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;gBACtB,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;gBAChC,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;YAC9B,CAAC;YAED,6CAA6C;YAC7C,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;gBACzC,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YAED,oBAAoB;YACpB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YAEF,uBAAuB;YACvB,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACnE,MAAM,eAAe,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,QAAQ,GACZ,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,eAAe,IAAI,KAAK,CAAC,WAAW,CAAC;YAEhE,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE,EAAE,+BAA+B;gBAC9C,YAAY,EAAE,eAAe;gBAC7B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;aACpE,CAAC;QACJ,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEpE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9D,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,IAAI;gBACd,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBACzC,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,yBAAyB;YACzB,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,CAAC;YAED,oBAAoB;YACpB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEpE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEzC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YAED,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,IAAI;gBACd,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,YAAY;aACnB,CAAC;YAEF,yBAAyB;YACzB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC;YACvC,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEpE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE9D,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC5C,CAAC;YAEF,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI;gBACnB,QAAQ,EAAE,IAAI;gBACd,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,YAAY;aACnB,CAAC;YAEF,yBAAyB;YACzB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC;YACvC,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAEpE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEtE,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,IAAI,CAAC,KAAK;gBACpB,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,EAAE;gBACzB,IAAI,EAAE,YAAY;aACnB,CAAC;YAEF,yBAAyB;YACzB,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;YAClC,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;aACd,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IACE,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC5B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC;gBAE3D,OAAO,KAAK,CAAC;YAEf,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,mCAAmC;YACnC,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;gBAChC,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACrD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,sBAAsB;gBAC5C,kEAAkE;gBAClE,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,QAAQ,GAAG,gBAAgB,CACzB,QAAQ,EACR,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,QAAQ,CAAC,UAAU,CAC1B,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,KAAK,CAAC,YAAY,CAAC,GAAG,EACtB,KAAK,CAAC,YAAY,CAAC,MAAM,EACzB,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IACE,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC5B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC;gBAE3D,OAAO,KAAK,CAAC;YAEf,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,+BAA+B;YAC/B,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAChD,kEAAkE;gBAClE,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,QAAQ,GAAG,gBAAgB,CACzB,QAAQ,EACR,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,QAAQ,CAAC,UAAU,CAC1B,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACvB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,KAAK,CAAC,YAAY,CAAC,GAAG,EACtB,KAAK,CAAC,YAAY,CAAC,MAAM,EACzB,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACxC,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAE9D,6CAA6C;YAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;YAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7C,QAAQ,GAAG,gBAAgB,CACzB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,EACvB,KAAK,CAAC,iBAAiB,EACvB,WAAW,CAAC,UAAU,CACvB,CAAC;YACJ,CAAC;YAED,+EAA+E;YAC/E,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,KAAK,SAAS;gBAClD,MAAM,CAAC,QAAQ,CAAC,oBAAoB,KAAK,SAAS,CAAC;gBACrD,KAAK,CAAC,YAAY,EAClB,CAAC;gBACD,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAC7D,KAAK,CAAC,YAAY,CAAC,GAAG,EACtB,KAAK,CAAC,YAAY,CAAC,MAAM,EACzB,WAAW,CAAC,qBAAqB,EACjC,WAAW,CAAC,oBAAoB,CACjC,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,WAAW;aACtB,CAAC;QACJ,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC7C,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxC,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC5C,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACzC,CAAC;QAED,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,eAAe;gBAAE,OAAO,KAAK,CAAC;YAEzC,MAAM,QAAQ,GAAG,eAAe,CAC9B,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,iBAAiB,CACxB,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC7C,OAAO,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;QAED,2EAA2E;QAC3E,qBAAqB;QACrB,2EAA2E;QAE3E,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,uCAAuC;YACvC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;YACtC,OAAO;gBACL,GAAG,kBAAkB,EAAE;gBACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAErE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO,KAAK,CAAC;YAExB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;YACzB,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAEzC,uDAAuD;YACvD,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,KAAK;gBACf,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,EAAE;gBACzB,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,gEAAgE;YAChE,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;gBACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,qBAAqB;gBAC5C,OAAO,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;gBAChC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,CAAC;YAED,oBAAoB;YACpB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAErE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC;YAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;gBAAE,OAAO,KAAK,CAAC;YAE/C,uBAAuB;YACvB,MAAM,IAAI,GAAa;gBACrB,GAAG;gBACH,MAAM;gBACN,aAAa,EAAE,IAAI,CAAC,KAAK;gBACzB,QAAQ,EAAE,IAAI;gBACd,mBAAmB,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,cAAc,EAAE,IAAI,GAAG,EAAE;gBACzB,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,yBAAyB;YACzB,IAAI,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;gBACvB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;YAC1B,CAAC;YAED,oBAAoB;YACpB,QAAQ,GAAG,oBAAoB,CAC7B,QAAQ,EACR,GAAG,EACH,MAAM,EACN,KAAK,CAAC,QAAQ,CAAC,qBAAqB,EACpC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CACpC,CAAC;YAEF,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC;gBACrC,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YAE9C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YAEpC,kDAAkD;YAClD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAEhD,OAAO;gBACL,GAAG,KAAK;gBACR,KAAK;gBACL,cAAc,EAAE,MAAM;gBACtB,QAAQ;gBACR,eAAe,EAAE,MAAM;gBACvB,iBAAiB,EAAE,QAAQ;gBAC3B,YAAY,EAAE,IAAI,GAAG,EAAE;gBACvB,SAAS,EAAE,EAAE;gBACb,SAAS,EAAE,EAAE;gBACb,YAAY,EAAE,IAAI;gBAClB,MAAM,EAAE,SAAS;gBACjB,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,CAAC;gBACf,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,IAAI;aACnB,CAAC;QACJ,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpD,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAiGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,OAAO,CAAC,UAA0B,EAAE;IAClD,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAErD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,OAAO,CAAC,WAAW,GAAG,WAAW,CAAC;QAClC,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAC7D,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;IAEF,MAAM,UAAU,GAAG,OAAO,CACxB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,EAClC,CAAC,KAAK,CAAC,MAAM,CAAC,CACf,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE1E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,EAC7D,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACvC,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC1B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,EAC7D,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CACvC,CAAC;IAEF,UAAU;IACV,MAAM,SAAS,GAAG,WAAW,CAC3B,CACE,MAAc,EACd,QAAgB,EAChB,IAKC,EACD,EAAE;QACF,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,YAAY;YAClB,MAAM;YACN,QAAQ;YACR,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI;SACjC,CAAC;QACF,IAAI,IAAI,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,MAA8C,CAAC,cAAc;gBAC5D,IAAI,CAAC,cAAc,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAiC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,MAAiC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChE,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,GAAW,EAAE,MAAc,EAAE,EAAE;QAC7D,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAC7C,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QACrD,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,MAAgB,EAAE,EAAE;QACtD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,QAA+B,EAAE,EAAE;QACrE,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,OAAgB,EAAE,EAAE;QACnD,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,qBAAqB;IACrB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE;QAClD,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC1C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE;QACtE,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,OAAe,EAAE,EAAE;QAC/C,QAAQ,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,yCAAyC;QACzC,oDAAoD;QACpD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YACjC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBACrC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,yCAAyC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,MAAM,yBAAyB,GAAG,WAAW,CAAC,GAAG,EAAE;QACjD,OAAO,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAElB,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,OAAO,KAAK,CAAC,eAAe,CAAC;IAC/B,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAE5B,OAAO;QACL,KAAK;QACL,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,UAAU;QACV,OAAO;QACP,OAAO;QACP,SAAS;QACT,UAAU;QACV,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,IAAI;QACJ,IAAI;QACJ,cAAc;QACd,KAAK;QACL,MAAM;QACN,KAAK;QACL,IAAI;QACJ,WAAW;QACX,aAAa;QACb,aAAa;QACb,aAAa;QACb,eAAe;QACf,cAAc;QACd,QAAQ;QACR,UAAU;QACV,gBAAgB;QAChB,qBAAqB;QACrB,cAAc;QACd,oBAAoB,EAAE,yBAAyB;QAC/C,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"useGame.js","sourceRoot":"","sources":["../../src/hooks/useGame.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Main game state management hook for Sudoku gameplay\n */\n\nimport { useCallback, useMemo, useReducer } from 'react';\nimport type { GameBoard, GameMove, GameSettings, GameState } from '../types';\nimport { DEFAULT_GAME_SETTINGS } from '../types';\nimport type { ScrambleConfig } from '@sudobility/sudojo_types';\nimport {\n DEFAULT_SCRAMBLE_CONFIG,\n noScramble,\n scrambleBoard,\n} from '@sudobility/sudojo_types';\nimport {\n cloneBoard,\n createGameBoard,\n getBoardStateString,\n getPencilmarksString,\n} from '../utils/board';\nimport {\n autoRemovePencilmarks,\n clearHighlights,\n isGameComplete,\n isValueCorrect,\n updateCellErrors,\n updateCellHighlights,\n} from '../utils/validation';\n\n// ============================================================================\n// Action Types\n// ============================================================================\n\ntype GameAction =\n | {\n type: 'LOAD_BOARD';\n puzzle: string;\n solution: string;\n scramble: boolean;\n scrambleConfig?: ScrambleConfig;\n boardUuid?: string;\n levelUuid?: string;\n }\n | { type: 'SELECT_CELL'; row: number; column: number }\n | { type: 'DESELECT_CELL' }\n | { type: 'SET_VALUE'; value: number }\n | { type: 'CLEAR_VALUE' }\n | { type: 'TOGGLE_PENCILMARK'; value: number }\n | { type: 'SET_PENCILMARKS'; values: number[] }\n | { type: 'CLEAR_PENCILMARKS' }\n | { type: 'UNDO' }\n | { type: 'REDO' }\n | { type: 'UPDATE_SETTINGS'; settings: Partial<GameSettings> }\n | { type: 'PAUSE' }\n | { type: 'RESUME' }\n | { type: 'RESET' }\n | { type: 'TICK'; seconds: number }\n | { type: 'SET_HINT_MODE'; enabled: boolean }\n // Enter mode actions\n | { type: 'START_ENTERING' }\n | { type: 'SET_GIVEN_VALUE'; value: number }\n | { type: 'CLEAR_GIVEN_VALUE' }\n | { type: 'FINISH_ENTERING'; puzzle: string; solution: string }\n | { type: 'SET_ERROR'; message: string }\n | { type: 'CLEAR_ERROR' };\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst createEmptyBoard = (): GameBoard => {\n const board: GameBoard = [];\n for (let row = 0; row < 9; row++) {\n const rowCells = [];\n for (let col = 0; col < 9; col++) {\n rowCells.push({\n row,\n column: col,\n value: null,\n isClue: false,\n isError: false,\n pencilmarks: new Set<number>(),\n isSelected: false,\n isHighlighted: false,\n isSameValue: false,\n });\n }\n board.push(rowCells);\n }\n return board;\n};\n\nconst createInitialState = (): GameState => ({\n board: createEmptyBoard(),\n originalPuzzle: '',\n solution: '',\n scrambledPuzzle: '',\n scrambledSolution: '',\n digitMapping: new Map(),\n undoStack: [],\n redoStack: [],\n selectedCell: null,\n settings: { ...DEFAULT_GAME_SETTINGS },\n status: 'idle',\n mistakeCount: 0,\n maxMistakes: 3,\n elapsedTime: 0,\n hintMode: false,\n boardUuid: null,\n levelUuid: null,\n entering: false,\n errorMessage: null,\n});\n\n// ============================================================================\n// Reducer\n// ============================================================================\n\nfunction gameReducer(state: GameState, action: GameAction): GameState {\n switch (action.type) {\n case 'LOAD_BOARD': {\n const {\n puzzle,\n solution,\n scramble,\n scrambleConfig,\n boardUuid,\n levelUuid,\n } = action;\n\n // Apply scrambling if requested\n const scrambleResult = scramble\n ? scrambleBoard(\n puzzle,\n solution,\n scrambleConfig ?? DEFAULT_SCRAMBLE_CONFIG\n )\n : noScramble(puzzle, solution);\n\n // Create the game board from scrambled puzzle\n const board = createGameBoard(\n scrambleResult.puzzle,\n scrambleResult.solution\n );\n\n return {\n ...createInitialState(),\n // Preserve settings and maxMistakes from current state\n settings: state.settings,\n maxMistakes: state.maxMistakes,\n board,\n originalPuzzle: puzzle,\n solution,\n scrambledPuzzle: scrambleResult.puzzle,\n scrambledSolution: scrambleResult.solution,\n digitMapping: scrambleResult.digitMapping,\n status: 'playing',\n boardUuid: boardUuid ?? null,\n levelUuid: levelUuid ?? null,\n };\n }\n\n case 'SELECT_CELL': {\n const { row, column } = action;\n let newBoard = cloneBoard(state.board);\n\n newBoard = updateCellHighlights(\n newBoard,\n row,\n column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n\n return {\n ...state,\n board: newBoard,\n selectedCell: { row, column },\n };\n }\n\n case 'DESELECT_CELL': {\n return {\n ...state,\n board: clearHighlights(state.board),\n selectedCell: null,\n };\n }\n\n case 'SET_VALUE': {\n if (!state.selectedCell || state.status !== 'playing') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.isClue) return state;\n\n const { value } = action;\n if (value < 1 || value > 9) return state;\n\n // Check if this is a mistake\n const isCorrect = isValueCorrect(\n state.scrambledSolution,\n row,\n column,\n value\n );\n const isMistake = !isCorrect && state.settings.showErrors;\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: cell.value,\n newValue: value,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(), // Clear pencilmarks when setting value\n type: 'value',\n };\n\n // Clone and update board\n let newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.value = value;\n newCell.pencilmarks = new Set();\n newCell.isError = isMistake;\n }\n\n // Auto-remove pencilmarks from related cells\n if (state.settings.autoRemovePencilmarks) {\n newBoard = autoRemovePencilmarks(newBoard, row, column, value);\n }\n\n // Update highlights\n newBoard = updateCellHighlights(\n newBoard,\n row,\n column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n\n // Check for completion\n const complete = isGameComplete(newBoard, state.scrambledSolution);\n const newMistakeCount = state.mistakeCount + (isMistake ? 1 : 0);\n const gameOver =\n state.maxMistakes > 0 && newMistakeCount >= state.maxMistakes;\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [], // Clear redo stack on new move\n mistakeCount: newMistakeCount,\n status: complete ? 'completed' : gameOver ? 'failed' : state.status,\n };\n }\n\n case 'CLEAR_VALUE': {\n if (!state.selectedCell || state.status !== 'playing') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.isClue || cell.value === null) return state;\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: cell.value,\n newValue: null,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(cell.pencilmarks),\n type: 'value',\n };\n\n // Clone and update board\n let newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.value = null;\n newCell.isError = false;\n }\n\n // Update highlights\n newBoard = updateCellHighlights(\n newBoard,\n row,\n column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n };\n }\n\n case 'TOGGLE_PENCILMARK': {\n if (!state.selectedCell || state.status !== 'playing') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.isClue || cell.value !== null) return state;\n\n const { value } = action;\n if (value < 1 || value > 9) return state;\n\n const newPencilmarks = new Set(cell.pencilmarks);\n if (newPencilmarks.has(value)) {\n newPencilmarks.delete(value);\n } else {\n newPencilmarks.add(value);\n }\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: null,\n newValue: null,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(newPencilmarks),\n type: 'pencilmark',\n };\n\n // Clone and update board\n const newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.pencilmarks = newPencilmarks;\n }\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n };\n }\n\n case 'SET_PENCILMARKS': {\n if (!state.selectedCell || state.status !== 'playing') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.isClue || cell.value !== null) return state;\n\n const newPencilmarks = new Set(\n action.values.filter(v => v >= 1 && v <= 9)\n );\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: null,\n newValue: null,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(newPencilmarks),\n type: 'pencilmark',\n };\n\n // Clone and update board\n const newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.pencilmarks = newPencilmarks;\n }\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n };\n }\n\n case 'CLEAR_PENCILMARKS': {\n if (!state.selectedCell || state.status !== 'playing') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.isClue || cell.pencilmarks.size === 0) return state;\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: cell.value,\n newValue: cell.value,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(),\n type: 'pencilmark',\n };\n\n // Clone and update board\n const newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.pencilmarks = new Set();\n }\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n };\n }\n\n case 'UNDO': {\n if (\n state.undoStack.length === 0 ||\n (state.status !== 'playing' && state.status !== 'entering')\n )\n return state;\n\n const move = state.undoStack[state.undoStack.length - 1];\n if (!move) return state;\n\n // Clone and restore previous state\n let newBoard = cloneBoard(state.board);\n const cell = newBoard[move.row]?.[move.column];\n if (cell) {\n cell.value = move.previousValue;\n cell.pencilmarks = new Set(move.previousPencilmarks);\n cell.isError = false; // Clear error on undo\n // In entering mode, update isClue based on whether cell has value\n if (state.status === 'entering') {\n cell.isClue = move.previousValue !== null;\n }\n }\n\n // Update errors based on settings (only in playing mode)\n if (state.status === 'playing') {\n newBoard = updateCellErrors(\n newBoard,\n state.scrambledSolution,\n state.settings.showErrors\n );\n }\n\n // Update highlights if there's a selected cell\n if (state.selectedCell) {\n newBoard = updateCellHighlights(\n newBoard,\n state.selectedCell.row,\n state.selectedCell.column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n }\n\n return {\n ...state,\n board: newBoard,\n undoStack: state.undoStack.slice(0, -1),\n redoStack: [...state.redoStack, move],\n };\n }\n\n case 'REDO': {\n if (\n state.redoStack.length === 0 ||\n (state.status !== 'playing' && state.status !== 'entering')\n )\n return state;\n\n const move = state.redoStack[state.redoStack.length - 1];\n if (!move) return state;\n\n // Clone and restore next state\n let newBoard = cloneBoard(state.board);\n const cell = newBoard[move.row]?.[move.column];\n if (cell) {\n cell.value = move.newValue;\n cell.pencilmarks = new Set(move.newPencilmarks);\n // In entering mode, update isClue based on whether cell has value\n if (state.status === 'entering') {\n cell.isClue = move.newValue !== null;\n }\n }\n\n // Update errors based on settings (only in playing mode)\n if (state.status === 'playing') {\n newBoard = updateCellErrors(\n newBoard,\n state.scrambledSolution,\n state.settings.showErrors\n );\n }\n\n // Update highlights if there's a selected cell\n if (state.selectedCell) {\n newBoard = updateCellHighlights(\n newBoard,\n state.selectedCell.row,\n state.selectedCell.column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n }\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: state.redoStack.slice(0, -1),\n };\n }\n\n case 'UPDATE_SETTINGS': {\n const newSettings = { ...state.settings, ...action.settings };\n\n // If showErrors changed, update error states\n let newBoard = state.board;\n if (action.settings.showErrors !== undefined) {\n newBoard = updateCellErrors(\n cloneBoard(state.board),\n state.scrambledSolution,\n newSettings.showErrors\n );\n }\n\n // If highlight settings changed and there's a selected cell, update highlights\n if (\n (action.settings.highlightRelatedCells !== undefined ||\n action.settings.highlightSameNumbers !== undefined) &&\n state.selectedCell\n ) {\n newBoard = updateCellHighlights(\n newBoard === state.board ? cloneBoard(state.board) : newBoard,\n state.selectedCell.row,\n state.selectedCell.column,\n newSettings.highlightRelatedCells,\n newSettings.highlightSameNumbers\n );\n }\n\n return {\n ...state,\n board: newBoard,\n settings: newSettings,\n };\n }\n\n case 'PAUSE': {\n if (state.status !== 'playing') return state;\n return { ...state, status: 'paused' };\n }\n\n case 'RESUME': {\n if (state.status !== 'paused') return state;\n return { ...state, status: 'playing' };\n }\n\n case 'RESET': {\n if (!state.scrambledPuzzle) return state;\n\n const newBoard = createGameBoard(\n state.scrambledPuzzle,\n state.scrambledSolution\n );\n\n return {\n ...state,\n board: newBoard,\n undoStack: [],\n redoStack: [],\n selectedCell: null,\n status: 'playing',\n mistakeCount: 0,\n elapsedTime: 0,\n hintMode: false,\n };\n }\n\n case 'TICK': {\n if (state.status !== 'playing') return state;\n return { ...state, elapsedTime: action.seconds };\n }\n\n case 'SET_HINT_MODE': {\n return { ...state, hintMode: action.enabled };\n }\n\n // ========================================================================\n // Enter Mode Actions\n // ========================================================================\n\n case 'START_ENTERING': {\n // Create empty board for entering mode\n const emptyBoard = createEmptyBoard();\n return {\n ...createInitialState(),\n settings: state.settings,\n maxMistakes: state.maxMistakes,\n board: emptyBoard,\n status: 'entering',\n entering: true,\n errorMessage: null,\n };\n }\n\n case 'SET_GIVEN_VALUE': {\n if (!state.selectedCell || state.status !== 'entering') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell) return state;\n\n const { value } = action;\n if (value < 1 || value > 9) return state;\n\n // Create move for undo (reuse existing move structure)\n const move: GameMove = {\n row,\n column,\n previousValue: cell.value,\n newValue: value,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(),\n type: 'value',\n };\n\n // Clone and update board - in enter mode, values become \"clues\"\n let newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.value = value;\n newCell.isClue = true; // Mark as given/clue\n newCell.pencilmarks = new Set();\n newCell.isError = false;\n }\n\n // Update highlights\n newBoard = updateCellHighlights(\n newBoard,\n row,\n column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n errorMessage: null,\n };\n }\n\n case 'CLEAR_GIVEN_VALUE': {\n if (!state.selectedCell || state.status !== 'entering') return state;\n\n const { row, column } = state.selectedCell;\n const cell = state.board[row]?.[column];\n if (!cell || cell.value === null) return state;\n\n // Create move for undo\n const move: GameMove = {\n row,\n column,\n previousValue: cell.value,\n newValue: null,\n previousPencilmarks: new Set(cell.pencilmarks),\n newPencilmarks: new Set(),\n type: 'value',\n };\n\n // Clone and update board\n let newBoard = cloneBoard(state.board);\n const newCell = newBoard[row]?.[column];\n if (newCell) {\n newCell.value = null;\n newCell.isClue = false;\n newCell.isError = false;\n }\n\n // Update highlights\n newBoard = updateCellHighlights(\n newBoard,\n row,\n column,\n state.settings.highlightRelatedCells,\n state.settings.highlightSameNumbers\n );\n\n return {\n ...state,\n board: newBoard,\n undoStack: [...state.undoStack, move],\n redoStack: [],\n errorMessage: null,\n };\n }\n\n case 'FINISH_ENTERING': {\n if (state.status !== 'entering') return state;\n\n const { puzzle, solution } = action;\n\n // Create board from validated puzzle and solution\n const board = createGameBoard(puzzle, solution);\n\n return {\n ...state,\n board,\n originalPuzzle: puzzle,\n solution,\n scrambledPuzzle: puzzle,\n scrambledSolution: solution,\n digitMapping: new Map(),\n undoStack: [],\n redoStack: [],\n selectedCell: null,\n status: 'playing',\n entering: false,\n mistakeCount: 0,\n elapsedTime: 0,\n hintMode: false,\n errorMessage: null,\n };\n }\n\n case 'SET_ERROR': {\n return { ...state, errorMessage: action.message };\n }\n\n case 'CLEAR_ERROR': {\n return { ...state, errorMessage: null };\n }\n\n default:\n return state;\n }\n}\n\n// ============================================================================\n// Hook Interface\n// ============================================================================\n\nexport interface UseGameOptions {\n /** Maximum mistakes allowed (0 = unlimited) */\n maxMistakes?: number;\n /** Initial settings */\n initialSettings?: Partial<GameSettings>;\n}\n\nexport interface UseGameResult {\n /** Current game state */\n state: GameState;\n /** Whether the game is active (playing or paused) */\n isActive: boolean;\n /** Whether the game is complete */\n isComplete: boolean;\n /** Whether the game failed (too many mistakes) */\n isFailed: boolean;\n /** Whether in entering mode */\n isEntering: boolean;\n /** Can undo */\n canUndo: boolean;\n /** Can redo */\n canRedo: boolean;\n\n // Actions\n /** Load a new board */\n loadBoard: (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n scrambleConfig?: ScrambleConfig;\n boardUuid?: string;\n levelUuid?: string;\n }\n ) => void;\n /** Select a cell */\n selectCell: (row: number, column: number) => void;\n /** Deselect the current cell */\n deselectCell: () => void;\n /** Set a value in the selected cell */\n setValue: (value: number) => void;\n /** Clear the value in the selected cell */\n clearValue: () => void;\n /** Toggle a pencilmark in the selected cell */\n togglePencilmark: (value: number) => void;\n /** Set pencilmarks in the selected cell */\n setPencilmarks: (values: number[]) => void;\n /** Clear pencilmarks in the selected cell */\n clearPencilmarks: () => void;\n /** Undo the last move */\n undo: () => void;\n /** Redo the last undone move */\n redo: () => void;\n /** Update game settings */\n updateSettings: (settings: Partial<GameSettings>) => void;\n /** Pause the game */\n pause: () => void;\n /** Resume the game */\n resume: () => void;\n /** Reset the game to initial state */\n reset: () => void;\n /** Update elapsed time */\n tick: (seconds: number) => void;\n /** Set hint mode */\n setHintMode: (enabled: boolean) => void;\n\n // Enter mode actions\n /** Start entering mode with empty board */\n startEntering: () => void;\n /** Set a given value in enter mode (marks cell as clue) */\n setGivenValue: (value: number) => void;\n /** Clear a given value in enter mode */\n clearGivenValue: () => void;\n /** Finish entering and transition to playing mode */\n finishEntering: (puzzle: string, solution: string) => void;\n /** Set an error message */\n setError: (message: string) => void;\n /** Clear the error message */\n clearError: () => void;\n /** Get the entered puzzle string (81 chars) */\n getEnteredPuzzle: () => string;\n\n // Computed values for solver integration\n /** Get current board state as string (for solver API) */\n getBoardString: () => string;\n /** Get pencilmarks as string (for solver API) */\n getPencilmarksString: () => string;\n /** Get the original (unscrambled) puzzle string */\n getOriginalPuzzle: () => string;\n}\n\n/**\n * Main hook for managing Sudoku game state\n *\n * @param options - Hook options\n * @returns Game state and actions\n *\n * @example\n * ```tsx\n * function GameScreen() {\n * const {\n * state,\n * loadBoard,\n * selectCell,\n * setValue,\n * isComplete,\n * } = useGame({ maxMistakes: 3 });\n *\n * useEffect(() => {\n * // Load a puzzle from the API\n * loadBoard(puzzle, solution, { scramble: true });\n * }, []);\n *\n * if (isComplete) {\n * return <Congratulations />;\n * }\n *\n * return (\n * <Board\n * cells={state.board}\n * onCellPress={(row, col) => selectCell(row, col)}\n * />\n * );\n * }\n * ```\n */\nexport function useGame(options: UseGameOptions = {}): UseGameResult {\n const { maxMistakes = 3, initialSettings } = options;\n\n const [state, dispatch] = useReducer(gameReducer, undefined, () => {\n const initial = createInitialState();\n initial.maxMistakes = maxMistakes;\n if (initialSettings) {\n initial.settings = { ...initial.settings, ...initialSettings };\n }\n return initial;\n });\n\n // Memoized computed values\n const isActive = useMemo(\n () => state.status === 'playing' || state.status === 'paused',\n [state.status]\n );\n\n const isComplete = useMemo(\n () => state.status === 'completed',\n [state.status]\n );\n\n const isFailed = useMemo(() => state.status === 'failed', [state.status]);\n\n const isEntering = useMemo(() => state.status === 'entering', [state.status]);\n\n const canUndo = useMemo(\n () =>\n state.undoStack.length > 0 &&\n (state.status === 'playing' || state.status === 'entering'),\n [state.undoStack.length, state.status]\n );\n\n const canRedo = useMemo(\n () =>\n state.redoStack.length > 0 &&\n (state.status === 'playing' || state.status === 'entering'),\n [state.redoStack.length, state.status]\n );\n\n // Actions\n const loadBoard = useCallback(\n (\n puzzle: string,\n solution: string,\n opts?: {\n scramble?: boolean;\n scrambleConfig?: ScrambleConfig;\n boardUuid?: string;\n levelUuid?: string;\n }\n ) => {\n const action: GameAction = {\n type: 'LOAD_BOARD',\n puzzle,\n solution,\n scramble: opts?.scramble ?? true,\n };\n if (opts?.scrambleConfig !== undefined) {\n (action as { scrambleConfig?: ScrambleConfig }).scrambleConfig =\n opts.scrambleConfig;\n }\n if (opts?.boardUuid !== undefined) {\n (action as { boardUuid?: string }).boardUuid = opts.boardUuid;\n }\n if (opts?.levelUuid !== undefined) {\n (action as { levelUuid?: string }).levelUuid = opts.levelUuid;\n }\n dispatch(action);\n },\n []\n );\n\n const selectCell = useCallback((row: number, column: number) => {\n dispatch({ type: 'SELECT_CELL', row, column });\n }, []);\n\n const deselectCell = useCallback(() => {\n dispatch({ type: 'DESELECT_CELL' });\n }, []);\n\n const setValue = useCallback((value: number) => {\n dispatch({ type: 'SET_VALUE', value });\n }, []);\n\n const clearValue = useCallback(() => {\n dispatch({ type: 'CLEAR_VALUE' });\n }, []);\n\n const togglePencilmark = useCallback((value: number) => {\n dispatch({ type: 'TOGGLE_PENCILMARK', value });\n }, []);\n\n const setPencilmarks = useCallback((values: number[]) => {\n dispatch({ type: 'SET_PENCILMARKS', values });\n }, []);\n\n const clearPencilmarks = useCallback(() => {\n dispatch({ type: 'CLEAR_PENCILMARKS' });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: 'UNDO' });\n }, []);\n\n const redo = useCallback(() => {\n dispatch({ type: 'REDO' });\n }, []);\n\n const updateSettings = useCallback((settings: Partial<GameSettings>) => {\n dispatch({ type: 'UPDATE_SETTINGS', settings });\n }, []);\n\n const pause = useCallback(() => {\n dispatch({ type: 'PAUSE' });\n }, []);\n\n const resume = useCallback(() => {\n dispatch({ type: 'RESUME' });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' });\n }, []);\n\n const tick = useCallback((seconds: number) => {\n dispatch({ type: 'TICK', seconds });\n }, []);\n\n const setHintMode = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_HINT_MODE', enabled });\n }, []);\n\n // Enter mode actions\n const startEntering = useCallback(() => {\n dispatch({ type: 'START_ENTERING' });\n }, []);\n\n const setGivenValue = useCallback((value: number) => {\n dispatch({ type: 'SET_GIVEN_VALUE', value });\n }, []);\n\n const clearGivenValue = useCallback(() => {\n dispatch({ type: 'CLEAR_GIVEN_VALUE' });\n }, []);\n\n const finishEntering = useCallback((puzzle: string, solution: string) => {\n dispatch({ type: 'FINISH_ENTERING', puzzle, solution });\n }, []);\n\n const setError = useCallback((message: string) => {\n dispatch({ type: 'SET_ERROR', message });\n }, []);\n\n const clearError = useCallback(() => {\n dispatch({ type: 'CLEAR_ERROR' });\n }, []);\n\n // Get entered puzzle string (for validation API)\n const getEnteredPuzzle = useCallback(() => {\n // Convert board to 81-char puzzle string\n // Empty cells are '0', filled cells are their digit\n let puzzle = '';\n for (let row = 0; row < 9; row++) {\n for (let col = 0; col < 9; col++) {\n const cell = state.board[row]?.[col];\n puzzle += cell?.value ?? 0;\n }\n }\n return puzzle;\n }, [state.board]);\n\n // Computed values for solver integration\n const getBoardString = useCallback(() => {\n return getBoardStateString(state.board);\n }, [state.board]);\n\n const getPencilmarksStringValue = useCallback(() => {\n return getPencilmarksString(state.board);\n }, [state.board]);\n\n const getOriginalPuzzle = useCallback(() => {\n return state.scrambledPuzzle;\n }, [state.scrambledPuzzle]);\n\n return {\n state,\n isActive,\n isComplete,\n isFailed,\n isEntering,\n canUndo,\n canRedo,\n loadBoard,\n selectCell,\n deselectCell,\n setValue,\n clearValue,\n togglePencilmark,\n setPencilmarks,\n clearPencilmarks,\n undo,\n redo,\n updateSettings,\n pause,\n resume,\n reset,\n tick,\n setHintMode,\n // Enter mode\n startEntering,\n setGivenValue,\n clearGivenValue,\n finishEntering,\n setError,\n clearError,\n getEnteredPuzzle,\n // Solver integration\n getBoardString,\n getPencilmarksString: getPencilmarksStringValue,\n getOriginalPuzzle,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGamePersistence.js","sourceRoot":"","sources":["../../src/hooks/useGamePersistence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useGamePersistence.js","sourceRoot":"","sources":["../../src/hooks/useGamePersistence.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for persisting game state to localStorage\n *\n * Saves game progress automatically so users can resume where they left off\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport type {\n GamePersistenceKey,\n SavedGameState,\n} from '../types/gamePersistence';\nimport { getGameStorageKey } from '../types/gamePersistence';\n\nexport interface UseGamePersistenceOptions {\n /** Puzzle identifier */\n puzzleKey: GamePersistenceKey | null;\n /** Whether auto-save is enabled */\n autoSave?: boolean;\n /** Debounce delay in ms for auto-save */\n debounceMs?: number;\n}\n\nexport interface UseGamePersistenceResult {\n /** Load saved game state */\n loadGame: () => SavedGameState | null;\n /** Save current game state */\n saveGame: (state: Omit<SavedGameState, 'savedAt'>) => void;\n /** Clear saved game state */\n clearGame: () => void;\n /** Check if saved game exists */\n hasSavedGame: () => boolean;\n}\n\n/**\n * Hook for persisting individual game progress\n *\n * @param options - Hook options\n * @returns Functions to load, save, and clear game state\n *\n * @example\n * ```tsx\n * const { loadGame, saveGame, clearGame } = useGamePersistence({\n * puzzleKey: { type: 'daily', id: '2024-01-15' },\n * autoSave: true,\n * });\n *\n * // On mount, try to restore saved state\n * useEffect(() => {\n * const saved = loadGame();\n * if (saved) {\n * // Restore game state\n * }\n * }, []);\n *\n * // Save after each move\n * useEffect(() => {\n * saveGame({ inputString, pencilmarksString, isPencilMode });\n * }, [inputString, pencilmarksString, isPencilMode]);\n * ```\n */\nexport function useGamePersistence({\n puzzleKey,\n}: UseGamePersistenceOptions): UseGamePersistenceResult {\n const storageKey = puzzleKey ? getGameStorageKey(puzzleKey) : null;\n\n const loadGame = useCallback((): SavedGameState | null => {\n if (!storageKey) return null;\n\n try {\n const item = window.localStorage.getItem(storageKey);\n if (!item) return null;\n return JSON.parse(item) as SavedGameState;\n } catch (error) {\n console.warn('Error loading saved game:', error);\n return null;\n }\n }, [storageKey]);\n\n const saveGame = useCallback(\n (state: Omit<SavedGameState, 'savedAt'>) => {\n if (!storageKey) return;\n\n try {\n const savedState: SavedGameState = {\n ...state,\n savedAt: new Date().toISOString(),\n };\n window.localStorage.setItem(storageKey, JSON.stringify(savedState));\n } catch (error) {\n console.warn('Error saving game:', error);\n }\n },\n [storageKey]\n );\n\n const clearGame = useCallback(() => {\n if (!storageKey) return;\n\n try {\n window.localStorage.removeItem(storageKey);\n } catch (error) {\n console.warn('Error clearing saved game:', error);\n }\n }, [storageKey]);\n\n const hasSavedGame = useCallback((): boolean => {\n if (!storageKey) return false;\n\n try {\n return window.localStorage.getItem(storageKey) !== null;\n } catch {\n return false;\n }\n }, [storageKey]);\n\n return {\n loadGame,\n saveGame,\n clearGame,\n hasSavedGame,\n };\n}\n\n/**\n * Hook that auto-saves game state with debouncing\n *\n * @param puzzleKey - Key identifying the puzzle\n * @param getCurrentState - Function to get current game state\n * @param dependencies - Dependencies that trigger save\n * @param debounceMs - Debounce delay in ms (default: 1000)\n */\nexport function useAutoSave(\n puzzleKey: GamePersistenceKey | null,\n getCurrentState: () => Omit<SavedGameState, 'savedAt'> | null,\n dependencies: unknown[],\n debounceMs: number = 1000\n): void {\n const { saveGame } = useGamePersistence({ puzzleKey });\n const timeoutRef = useRef<ReturnType<typeof globalThis.setTimeout> | null>(\n null\n );\n\n useEffect(() => {\n if (!puzzleKey) return;\n\n // Clear any pending save\n if (timeoutRef.current) {\n globalThis.clearTimeout(timeoutRef.current);\n }\n\n // Schedule new save\n timeoutRef.current = globalThis.setTimeout(() => {\n const state = getCurrentState();\n if (state) {\n saveGame(state);\n }\n }, debounceMs);\n\n return () => {\n if (timeoutRef.current) {\n globalThis.clearTimeout(timeoutRef.current);\n }\n };\n }, [puzzleKey, saveGame, debounceMs, ...dependencies]);\n}\n\n// Re-export types for convenience\nexport type { SavedGameState, GamePersistenceKey };\n"]}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* startGame('daily', puzzle, solution, { dailyDate: '2024-01-15' });
|
|
14
14
|
*
|
|
15
15
|
* // Update progress (debounced)
|
|
16
|
-
* updateProgress(inputString, pencilmarksString, isPencilMode, elapsedTime);
|
|
16
|
+
* updateProgress(inputString, pencilmarksString, isPencilMode, autoPencilmarks, elapsedTime);
|
|
17
17
|
*
|
|
18
18
|
* // Clear on completion
|
|
19
19
|
* clearGame();
|
|
@@ -34,7 +34,7 @@ export interface UseGamePlayResult {
|
|
|
34
34
|
/** Start a new game */
|
|
35
35
|
startGame: (source: GameSource, puzzle: string, solution: string, meta?: CurrentGameMeta) => void;
|
|
36
36
|
/** Update progress (debounced internally) */
|
|
37
|
-
updateProgress: (inputString: string, pencilmarksString: string, isPencilMode: boolean, elapsedTime: number) => void;
|
|
37
|
+
updateProgress: (inputString: string, pencilmarksString: string, isPencilMode: boolean, autoPencilmarks: boolean, elapsedTime: number) => void;
|
|
38
38
|
/** Clear current game (call on completion) */
|
|
39
39
|
clearGame: () => void;
|
|
40
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGamePlay.d.ts","sourceRoot":"","sources":["../../src/hooks/useGamePlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,qCAAqC;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,uBAAuB;IACvB,SAAS,EAAE,CACT,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,eAAe,KACnB,IAAI,CAAC;IACV,6CAA6C;IAC7C,cAAc,EAAE,CACd,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,8CAA8C;IAC9C,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,WAAW,CACzB,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useGamePlay.d.ts","sourceRoot":"","sources":["../../src/hooks/useGamePlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,qCAAqC;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,uBAAuB;IACvB,SAAS,EAAE,CACT,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,eAAe,KACnB,IAAI,CAAC;IACV,6CAA6C;IAC7C,cAAc,EAAE,CACd,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,OAAO,EACrB,eAAe,EAAE,OAAO,EACxB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IACV,8CAA8C;IAC9C,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,WAAW,CACzB,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAiGnB"}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* startGame('daily', puzzle, solution, { dailyDate: '2024-01-15' });
|
|
14
14
|
*
|
|
15
15
|
* // Update progress (debounced)
|
|
16
|
-
* updateProgress(inputString, pencilmarksString, isPencilMode, elapsedTime);
|
|
16
|
+
* updateProgress(inputString, pencilmarksString, isPencilMode, autoPencilmarks, elapsedTime);
|
|
17
17
|
*
|
|
18
18
|
* // Clear on completion
|
|
19
19
|
* clearGame();
|
|
@@ -40,11 +40,12 @@ export function useGamePlay(options = {}) {
|
|
|
40
40
|
// Throttled update — saves at most every autoSaveDelay ms.
|
|
41
41
|
// Unlike debounce, throttle ensures periodic saves even when called
|
|
42
42
|
// continuously (e.g. every second from the game timer).
|
|
43
|
-
const updateProgress = useCallback((inputString, pencilmarksString, isPencilMode, elapsedTime) => {
|
|
43
|
+
const updateProgress = useCallback((inputString, pencilmarksString, isPencilMode, autoPencilmarks, elapsedTime) => {
|
|
44
44
|
pendingUpdate.current = [
|
|
45
45
|
inputString,
|
|
46
46
|
pencilmarksString,
|
|
47
47
|
isPencilMode,
|
|
48
|
+
autoPencilmarks,
|
|
48
49
|
elapsedTime,
|
|
49
50
|
];
|
|
50
51
|
// Only start a new timer if one isn't already running (throttle)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGamePlay.js","sourceRoot":"","sources":["../../src/hooks/useGamePlay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useGamePlay.js","sourceRoot":"","sources":["../../src/hooks/useGamePlay.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for managing the current game\n *\n * Provides a clean API for starting, updating, and clearing the current game.\n * The `slot` option selects which independent store slot to use ('daily' or 'play'),\n * keeping the returned function signatures identical to before.\n *\n * @example\n * ```tsx\n * const { currentGame, startGame, updateProgress, clearGame } = useGamePlay({ slot: 'daily' });\n *\n * // Start a new game\n * startGame('daily', puzzle, solution, { dailyDate: '2024-01-15' });\n *\n * // Update progress (debounced)\n * updateProgress(inputString, pencilmarksString, isPencilMode, autoPencilmarks, elapsedTime);\n *\n * // Clear on completion\n * clearGame();\n * ```\n */\n\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useGamePlayStore } from '../stores/gamePlayStore';\nimport type {\n CurrentGame,\n CurrentGameMeta,\n GameSlot,\n GameSource,\n} from '../types/currentGame';\n\nexport interface UseGamePlayOptions {\n /** Which game slot to use (default: 'play') */\n slot?: GameSlot;\n /** Debounce delay for auto-save in ms (default: 2000) */\n autoSaveDelay?: number;\n}\n\nexport interface UseGamePlayResult {\n /** Current game state (null if none) */\n currentGame: CurrentGame | null;\n /** Whether there's an active game */\n hasCurrentGame: boolean;\n /** Start a new game */\n startGame: (\n source: GameSource,\n puzzle: string,\n solution: string,\n meta?: CurrentGameMeta\n ) => void;\n /** Update progress (debounced internally) */\n updateProgress: (\n inputString: string,\n pencilmarksString: string,\n isPencilMode: boolean,\n autoPencilmarks: boolean,\n elapsedTime: number\n ) => void;\n /** Clear current game (call on completion) */\n clearGame: () => void;\n}\n\nexport function useGamePlay(\n options: UseGamePlayOptions = {}\n): UseGamePlayResult {\n const { slot = 'play', autoSaveDelay = 2000 } = options;\n\n // Select the correct slot from the store\n const currentGame = useGamePlayStore(s =>\n slot === 'daily' ? s.dailyGame : s.playGame\n );\n\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingUpdate = useRef<\n [string, string, boolean, boolean, number] | null\n >(null);\n\n // Curry slot into startGame so callers keep the same signature\n const startGame = useCallback(\n (\n source: GameSource,\n puzzle: string,\n solution: string,\n meta?: CurrentGameMeta\n ) => {\n useGamePlayStore\n .getState()\n .startGame(slot, source, puzzle, solution, meta);\n },\n [slot]\n );\n\n // Curry slot into clearGame\n const clearGame = useCallback(() => {\n useGamePlayStore.getState().clearGame(slot);\n }, [slot]);\n\n // Throttled update — saves at most every autoSaveDelay ms.\n // Unlike debounce, throttle ensures periodic saves even when called\n // continuously (e.g. every second from the game timer).\n const updateProgress = useCallback(\n (\n inputString: string,\n pencilmarksString: string,\n isPencilMode: boolean,\n autoPencilmarks: boolean,\n elapsedTime: number\n ) => {\n pendingUpdate.current = [\n inputString,\n pencilmarksString,\n isPencilMode,\n autoPencilmarks,\n elapsedTime,\n ];\n\n // Only start a new timer if one isn't already running (throttle)\n if (!timeoutRef.current) {\n timeoutRef.current = setTimeout(() => {\n if (pendingUpdate.current) {\n useGamePlayStore\n .getState()\n .updateProgress(slot, ...pendingUpdate.current);\n pendingUpdate.current = null;\n }\n timeoutRef.current = null;\n }, autoSaveDelay);\n }\n },\n [slot, autoSaveDelay]\n );\n\n // Flush pending updates on unmount and beforeunload\n useEffect(() => {\n const flush = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n if (pendingUpdate.current) {\n useGamePlayStore\n .getState()\n .updateProgress(slot, ...pendingUpdate.current);\n pendingUpdate.current = null;\n }\n };\n\n window.addEventListener('beforeunload', flush);\n return () => {\n window.removeEventListener('beforeunload', flush);\n flush();\n };\n }, [slot]);\n\n return {\n currentGame,\n hasCurrentGame: currentGame !== null,\n startGame,\n updateProgress,\n clearGame,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGameSession.d.ts","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"useGameSession.d.ts","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB;yBAyBP,gBAAgB,KAAG,OAAO,CAAC,iBAAiB,CAAC;iCAqCtC,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC;;;;;EA4DzD"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* - Finishing game sessions and receiving rewards
|
|
7
7
|
* - Tracking achievement results for display
|
|
8
8
|
*/
|
|
9
|
-
import { useCallback, useRef, useState } from 'react';
|
|
9
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
10
10
|
import { useSudojoPlayFinish, useSudojoPlayStart, } from '@sudobility/sudojo_client';
|
|
11
11
|
export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
12
12
|
const [isStarting, setIsStarting] = useState(false);
|
|
@@ -14,19 +14,30 @@ export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
|
14
14
|
const sessionIdRef = useRef(null);
|
|
15
15
|
const playStartMutation = useSudojoPlayStart(networkClient, baseUrl);
|
|
16
16
|
const playFinishMutation = useSudojoPlayFinish(networkClient, baseUrl);
|
|
17
|
+
// Use refs for mutations so callbacks have stable identity
|
|
18
|
+
const playStartRef = useRef(playStartMutation);
|
|
19
|
+
const playFinishRef = useRef(playFinishMutation);
|
|
20
|
+
const tokenRef = useRef(token);
|
|
21
|
+
const userIdRef = useRef(userId);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
playStartRef.current = playStartMutation;
|
|
24
|
+
playFinishRef.current = playFinishMutation;
|
|
25
|
+
tokenRef.current = token;
|
|
26
|
+
userIdRef.current = userId;
|
|
27
|
+
});
|
|
17
28
|
/**
|
|
18
29
|
* Start a game session on the server
|
|
19
30
|
* Only works if user is authenticated
|
|
20
31
|
*/
|
|
21
32
|
const startSession = useCallback(async (data) => {
|
|
22
33
|
// Skip if not authenticated
|
|
23
|
-
if (!
|
|
34
|
+
if (!userIdRef.current || !tokenRef.current) {
|
|
24
35
|
return { sessionStarted: false };
|
|
25
36
|
}
|
|
26
37
|
setIsStarting(true);
|
|
27
38
|
try {
|
|
28
|
-
const response = await
|
|
29
|
-
token,
|
|
39
|
+
const response = await playStartRef.current.mutateAsync({
|
|
40
|
+
token: tokenRef.current,
|
|
30
41
|
data,
|
|
31
42
|
});
|
|
32
43
|
if (response.success && response.data) {
|
|
@@ -45,14 +56,14 @@ export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
|
45
56
|
finally {
|
|
46
57
|
setIsStarting(false);
|
|
47
58
|
}
|
|
48
|
-
}, [
|
|
59
|
+
}, []);
|
|
49
60
|
/**
|
|
50
61
|
* Finish the game session and get rewards
|
|
51
62
|
* Only works if user is authenticated and session was started
|
|
52
63
|
*/
|
|
53
64
|
const finishSession = useCallback(async (elapsedTime) => {
|
|
54
65
|
// Skip if not authenticated
|
|
55
|
-
if (!
|
|
66
|
+
if (!userIdRef.current || !tokenRef.current) {
|
|
56
67
|
return {
|
|
57
68
|
leveledUp: false,
|
|
58
69
|
newBadges: [],
|
|
@@ -61,8 +72,8 @@ export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
|
61
72
|
}
|
|
62
73
|
setIsFinishing(true);
|
|
63
74
|
try {
|
|
64
|
-
const response = await
|
|
65
|
-
token,
|
|
75
|
+
const response = await playFinishRef.current.mutateAsync({
|
|
76
|
+
token: tokenRef.current,
|
|
66
77
|
data: { elapsedTime },
|
|
67
78
|
});
|
|
68
79
|
sessionIdRef.current = null;
|
|
@@ -91,7 +102,7 @@ export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
|
91
102
|
finally {
|
|
92
103
|
setIsFinishing(false);
|
|
93
104
|
}
|
|
94
|
-
}, [
|
|
105
|
+
}, []);
|
|
95
106
|
/**
|
|
96
107
|
* Check if user is authenticated (can use gamification)
|
|
97
108
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGameSession.js","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useGameSession.js","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for managing game sessions with gamification\n *\n * Handles:\n * - Starting game sessions on the server\n * - Finishing game sessions and receiving rewards\n * - Tracking achievement results for display\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n useSudojoPlayFinish,\n useSudojoPlayStart,\n} from '@sudobility/sudojo_client';\nimport type {\n GameFinishResponse,\n GameStartRequest,\n} from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\n\nexport interface UseGameSessionOptions {\n networkClient: NetworkClient;\n baseUrl: string;\n token: string | null;\n userId: string | null;\n}\n\nexport interface GameSessionResult {\n /** Whether a server session was started */\n sessionStarted: boolean;\n /** Session ID from server (if started) */\n sessionId?: string;\n}\n\nexport interface GameFinishResult {\n /** The full response from the server */\n response?: GameFinishResponse;\n /** Whether the user leveled up */\n leveledUp: boolean;\n /** New badges earned */\n newBadges: Array<{\n badgeKey: string;\n title: string;\n description: string | null;\n }>;\n /** Total points earned */\n totalPointsEarned: number;\n}\n\nexport function useGameSession({\n networkClient,\n baseUrl,\n token,\n userId,\n}: UseGameSessionOptions) {\n const [isStarting, setIsStarting] = useState(false);\n const [isFinishing, setIsFinishing] = useState(false);\n const sessionIdRef = useRef<string | null>(null);\n\n const playStartMutation = useSudojoPlayStart(networkClient, baseUrl);\n const playFinishMutation = useSudojoPlayFinish(networkClient, baseUrl);\n\n // Use refs for mutations so callbacks have stable identity\n const playStartRef = useRef(playStartMutation);\n const playFinishRef = useRef(playFinishMutation);\n const tokenRef = useRef(token);\n const userIdRef = useRef(userId);\n useEffect(() => {\n playStartRef.current = playStartMutation;\n playFinishRef.current = playFinishMutation;\n tokenRef.current = token;\n userIdRef.current = userId;\n });\n\n /**\n * Start a game session on the server\n * Only works if user is authenticated\n */\n const startSession = useCallback(\n async (data: GameStartRequest): Promise<GameSessionResult> => {\n // Skip if not authenticated\n if (!userIdRef.current || !tokenRef.current) {\n return { sessionStarted: false };\n }\n\n setIsStarting(true);\n try {\n const response = await playStartRef.current.mutateAsync({\n token: tokenRef.current,\n data,\n });\n\n if (response.success && response.data) {\n sessionIdRef.current = response.data.sessionId;\n return {\n sessionStarted: true,\n sessionId: response.data.sessionId,\n };\n }\n\n return { sessionStarted: false };\n } catch (error) {\n console.error('Failed to start game session:', error);\n return { sessionStarted: false };\n } finally {\n setIsStarting(false);\n }\n },\n []\n );\n\n /**\n * Finish the game session and get rewards\n * Only works if user is authenticated and session was started\n */\n const finishSession = useCallback(\n async (elapsedTime: number): Promise<GameFinishResult> => {\n // Skip if not authenticated\n if (!userIdRef.current || !tokenRef.current) {\n return {\n leveledUp: false,\n newBadges: [],\n totalPointsEarned: 0,\n };\n }\n\n setIsFinishing(true);\n try {\n const response = await playFinishRef.current.mutateAsync({\n token: tokenRef.current,\n data: { elapsedTime },\n });\n\n sessionIdRef.current = null;\n\n if (response.success && response.data) {\n return {\n response: response.data,\n leveledUp: !!response.data.level,\n newBadges: response.data.badges ?? [],\n totalPointsEarned: response.data.points.totalPoints,\n };\n }\n\n return {\n leveledUp: false,\n newBadges: [],\n totalPointsEarned: 0,\n };\n } catch (error) {\n console.error('Failed to finish game session:', error);\n return {\n leveledUp: false,\n newBadges: [],\n totalPointsEarned: 0,\n };\n } finally {\n setIsFinishing(false);\n }\n },\n []\n );\n\n /**\n * Check if user is authenticated (can use gamification)\n */\n const isAuthenticated = !!userId && !!token;\n\n return {\n startSession,\n finishSession,\n isStarting,\n isFinishing,\n isAuthenticated,\n sessionId: sessionIdRef.current,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGameTeaching.js","sourceRoot":"","sources":["../../src/hooks/useGameTeaching.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useGameTeaching.js","sourceRoot":"","sources":["../../src/hooks/useGameTeaching.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for integrating the Sudoku solver for teaching and hints\n */\n\nimport { useCallback, useMemo, useState } from 'react';\nimport type { NetworkClient } from '@sudobility/types';\nimport type {\n BaseResponse,\n SolveData,\n SolverHintStep,\n} from '@sudobility/sudojo_types';\nimport { createSudojoClient } from '@sudobility/sudojo_client';\nimport type { GameHint, TeachingState } from '../types';\n\nexport interface UseGameTeachingOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication */\n token: string;\n}\n\nexport interface UseGameTeachingResult {\n /** Current teaching state */\n teachingState: TeachingState;\n /** Get a hint for the current board state */\n getHint: (\n originalPuzzle: string,\n userBoard: string,\n options?: { autoPencilmarks?: boolean; pencilmarks?: string }\n ) => Promise<void>;\n /** Apply the current hint to the board (returns the action to perform) */\n applyHint: () => GameHint | null;\n /** Move to the next step in a multi-step hint */\n nextStep: () => void;\n /** Move to the previous step in a multi-step hint */\n previousStep: () => void;\n /** Clear the current hint */\n clearHint: () => void;\n /** Whether a hint is available */\n hasHint: boolean;\n /** Whether there are more steps in the current hint */\n hasMoreSteps: boolean;\n /** Whether we can go to previous step */\n hasPreviousStep: boolean;\n}\n\n/**\n * Converts a solver SolverHintStep to our GameHint format\n */\nfunction convertHintStep(step: SolverHintStep): GameHint {\n return {\n title: step.title,\n text: step.text,\n cells:\n step.cells?.map(cell => {\n const action: {\n select?: number;\n addPencilmarks?: number[];\n removePencilmarks?: number[];\n } = {};\n if (cell.actions.select) {\n action.select = parseInt(cell.actions.select, 10);\n }\n if (cell.actions.add) {\n action.addPencilmarks = cell.actions.add\n .split('')\n .map(d => parseInt(d, 10));\n }\n if (cell.actions.remove) {\n action.removePencilmarks = cell.actions.remove\n .split('')\n .map(d => parseInt(d, 10));\n }\n return {\n row: cell.row,\n column: cell.column,\n color: cell.color,\n ...(Object.keys(action).length > 0 ? { action } : {}),\n };\n }) ?? [],\n areas:\n step.areas?.map(area => ({\n type: area.type,\n index: area.index,\n color: area.color,\n })) ?? [],\n };\n}\n\n/**\n * Hook for teaching/hint functionality using the solver API\n *\n * @param options - Hook options\n * @returns Teaching state and actions\n *\n * @example\n * ```tsx\n * function GameWithHints() {\n * const game = useGame();\n * const { teachingState, getHint, applyHint } = useGameTeaching({\n * networkClient,\n * baseUrl: 'https://api.sudojo.com',\n * token: 'user-access-token',\n * });\n *\n * const handleGetHint = async () => {\n * await getHint(\n * game.getOriginalPuzzle(),\n * game.getBoardString(),\n * { autoPencilmarks: game.state.settings.autoPencilmarks }\n * );\n * };\n *\n * const handleApplyHint = () => {\n * const hint = applyHint();\n * if (hint) {\n * // Apply the hint actions to the game\n * for (const cell of hint.cells) {\n * if (cell.action?.select) {\n * game.selectCell(cell.row, cell.column);\n * game.setValue(cell.action.select);\n * }\n * }\n * }\n * };\n *\n * return (\n * <div>\n * <Board cells={game.state.board} />\n * <button onClick={handleGetHint}>Get Hint</button>\n * {teachingState.currentHint && (\n * <div>\n * <h3>{teachingState.currentHint.title}</h3>\n * <p>{teachingState.currentHint.text}</p>\n * <button onClick={handleApplyHint}>Apply</button>\n * </div>\n * )}\n * </div>\n * );\n * }\n * ```\n */\nexport function useGameTeaching(\n options: UseGameTeachingOptions\n): UseGameTeachingResult {\n const { networkClient, baseUrl, token } = options;\n\n const [teachingState, setTeachingState] = useState<TeachingState>({\n isActive: false,\n currentHint: null,\n currentStep: 0,\n totalSteps: 0,\n isLoading: false,\n error: null,\n });\n\n // Store all hint steps for multi-step hints\n const [allSteps, setAllSteps] = useState<GameHint[]>([]);\n\n // Create Sudojo client\n const client = useMemo(() => {\n return createSudojoClient(networkClient, baseUrl);\n }, [networkClient, baseUrl]);\n\n const getHint = useCallback(\n async (\n originalPuzzle: string,\n userBoard: string,\n hintOptions?: { autoPencilmarks?: boolean; pencilmarks?: string }\n ) => {\n setTeachingState(prev => ({\n ...prev,\n isLoading: true,\n error: null,\n }));\n\n try {\n const solveOptions: {\n original: string;\n user: string;\n autoPencilmarks?: boolean;\n pencilmarks?: string;\n } = {\n original: originalPuzzle,\n user: userBoard,\n };\n if (hintOptions?.autoPencilmarks !== undefined) {\n solveOptions.autoPencilmarks = hintOptions.autoPencilmarks;\n }\n if (hintOptions?.pencilmarks !== undefined) {\n solveOptions.pencilmarks = hintOptions.pencilmarks;\n }\n const response: BaseResponse<SolveData> = await client.solverSolve(\n token,\n solveOptions\n );\n\n if (!response.success || !response.data?.hints?.steps?.length) {\n const errorMessage =\n response.error ?? 'No hints available for the current state';\n setTeachingState(prev => ({\n ...prev,\n isLoading: false,\n error: errorMessage,\n isActive: false,\n currentHint: null,\n currentStep: 0,\n totalSteps: 0,\n }));\n setAllSteps([]);\n return;\n }\n\n const hintSteps = response.data.hints.steps;\n const convertedSteps = hintSteps.map(convertHintStep);\n\n if (convertedSteps.length === 0) {\n setTeachingState(prev => ({\n ...prev,\n isLoading: false,\n error: 'No hints available',\n isActive: false,\n currentHint: null,\n currentStep: 0,\n totalSteps: 0,\n }));\n setAllSteps([]);\n return;\n }\n\n setAllSteps(convertedSteps);\n setTeachingState({\n isActive: true,\n currentHint: convertedSteps[0] ?? null,\n currentStep: 0,\n totalSteps: convertedSteps.length,\n isLoading: false,\n error: null,\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to get hint';\n setTeachingState(prev => ({\n ...prev,\n isLoading: false,\n error: errorMessage,\n isActive: false,\n currentHint: null,\n currentStep: 0,\n totalSteps: 0,\n }));\n setAllSteps([]);\n }\n },\n [client, token]\n );\n\n const applyHint = useCallback((): GameHint | null => {\n return teachingState.currentHint;\n }, [teachingState.currentHint]);\n\n const nextStep = useCallback(() => {\n if (teachingState.currentStep < teachingState.totalSteps - 1) {\n const nextStepIndex = teachingState.currentStep + 1;\n setTeachingState(prev => ({\n ...prev,\n currentStep: nextStepIndex,\n currentHint: allSteps[nextStepIndex] ?? null,\n }));\n }\n }, [teachingState.currentStep, teachingState.totalSteps, allSteps]);\n\n const previousStep = useCallback(() => {\n if (teachingState.currentStep > 0) {\n const prevStepIndex = teachingState.currentStep - 1;\n setTeachingState(prev => ({\n ...prev,\n currentStep: prevStepIndex,\n currentHint: allSteps[prevStepIndex] ?? null,\n }));\n }\n }, [teachingState.currentStep, allSteps]);\n\n const clearHint = useCallback(() => {\n setTeachingState({\n isActive: false,\n currentHint: null,\n currentStep: 0,\n totalSteps: 0,\n isLoading: false,\n error: null,\n });\n setAllSteps([]);\n }, []);\n\n const hasHint = useMemo(\n () => teachingState.isActive && teachingState.currentHint !== null,\n [teachingState.isActive, teachingState.currentHint]\n );\n\n const hasMoreSteps = useMemo(\n () => teachingState.currentStep < teachingState.totalSteps - 1,\n [teachingState.currentStep, teachingState.totalSteps]\n );\n\n const hasPreviousStep = useMemo(\n () => teachingState.currentStep > 0,\n [teachingState.currentStep]\n );\n\n return {\n teachingState,\n getHint,\n applyHint,\n nextStep,\n previousStep,\n clearHint,\n hasHint,\n hasMoreSteps,\n hasPreviousStep,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGameTimer.js","sourceRoot":"","sources":["../../src/hooks/useGameTimer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA4BjE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA+B,EAAE;IAEjC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEvD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CACxB,IAAI,CACL,CAAC;IAEF,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE;gBAChD,UAAU,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9C,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,UAAU;QACV,iBAAiB;QACjB,SAAS;QACT,KAAK;QACL,KAAK;QACL,MAAM;QACN,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"useGameTimer.js","sourceRoot":"","sources":["../../src/hooks/useGameTimer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA4BjE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY,CAC1B,UAA+B,EAAE;IAEjC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,WAAW,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEvD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,MAAM,CACxB,IAAI,CACL,CAAC;IAEF,4DAA4D;IAC5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,EAAE,CAAC;YACd,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,EAAE;gBAChD,UAAU,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC9C,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;QACvB,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACjC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,UAAU;QACV,iBAAiB;QACjB,SAAS;QACT,KAAK;QACL,KAAK;QACL,MAAM;QACN,KAAK;QACL,IAAI;KACL,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Game Timer Hook - Track elapsed time during gameplay\n *\n * Uses a ref for elapsed seconds to avoid re-rendering the parent\n * component every second. Components that need to display the time\n * should use their own interval to read from elapsedRef.\n */\n\nimport type { RefObject } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseGameTimerResult {\n /** Ref holding the current elapsed seconds (does not trigger re-renders) */\n elapsedRef: RefObject<number>;\n /** Get current elapsed seconds */\n getElapsedSeconds: () => number;\n /** Whether the timer is running */\n isRunning: boolean;\n /** Start the timer (resets to 0) */\n start: () => void;\n /** Pause the timer */\n pause: () => void;\n /** Resume the timer */\n resume: () => void;\n /** Reset the timer */\n reset: () => void;\n /** Stop the timer (pause and return final time) */\n stop: () => number;\n}\n\nexport interface UseGameTimerOptions {\n /** Auto-start timer on mount */\n autoStart?: boolean;\n /** Initial time in seconds */\n initialTime?: number;\n}\n\n/**\n * Hook for game timer functionality\n *\n * Elapsed time is tracked in a ref to avoid causing re-renders every second.\n * Use `elapsedRef` in display components that manage their own update interval.\n * Use `getElapsedSeconds()` to read the current time in event handlers.\n *\n * @param options - Timer options\n * @returns Timer state and controls\n *\n * @example\n * ```tsx\n * const { elapsedRef, getElapsedSeconds, isRunning, stop } = useGameTimer({ autoStart: true });\n *\n * // Pass to self-updating GameTimer component:\n * <GameTimer elapsedRef={elapsedRef} isRunning={isRunning} />\n *\n * // Read time in handlers:\n * const finalTime = stop();\n * ```\n */\nexport function useGameTimer(\n options: UseGameTimerOptions = {}\n): UseGameTimerResult {\n const { autoStart = false, initialTime = 0 } = options;\n\n const elapsedRef = useRef(initialTime);\n const [isRunning, setIsRunning] = useState(autoStart);\n const intervalRef = useRef<ReturnType<typeof globalThis.setInterval> | null>(\n null\n );\n\n // Timer tick effect — only updates the ref, no state change\n useEffect(() => {\n if (isRunning) {\n intervalRef.current = globalThis.setInterval(() => {\n elapsedRef.current = (elapsedRef.current ?? 0) + 1;\n }, 1000);\n }\n\n return () => {\n if (intervalRef.current) {\n globalThis.clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isRunning]);\n\n const getElapsedSeconds = useCallback(() => elapsedRef.current ?? 0, []);\n\n const start = useCallback(() => {\n elapsedRef.current = 0;\n setIsRunning(true);\n }, []);\n\n const pause = useCallback(() => {\n setIsRunning(false);\n }, []);\n\n const resume = useCallback(() => {\n setIsRunning(true);\n }, []);\n\n const reset = useCallback(() => {\n setIsRunning(false);\n elapsedRef.current = 0;\n }, []);\n\n const stop = useCallback(() => {\n setIsRunning(false);\n return elapsedRef.current ?? 0;\n }, []);\n\n return {\n elapsedRef,\n getElapsedSeconds,\n isRunning,\n start,\n pause,\n resume,\n reset,\n stop,\n };\n}\n"]}
|