@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":"useHint.js","sourceRoot":"","sources":["../../src/hooks/useHint.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useHint.js","sourceRoot":"","sources":["../../src/hooks/useHint.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for getting hints from the Sudoku solver\n *\n * Matches Kotlin HintInteractor behavior:\n * - Stores all hint steps from the API response\n * - Tracks current step index\n * - next() advances to next step (if available)\n * - previous() goes back to previous step\n * - getHint() fetches new hints OR advances to next step if hints exist\n */\n\nimport { useCallback, useRef, useState } from 'react';\nimport type {\n BaseResponse,\n HintAccessUserState,\n HintEntitlement,\n SolveData,\n SolverBoard,\n SolverHintStep,\n} from '@sudobility/sudojo_types';\nimport {\n createSudojoClient,\n HintAccessDeniedError,\n} from '@sudobility/sudojo_client';\nimport type { NetworkClient } from '@sudobility/types';\n\n/** Board data returned when applying a hint */\nexport interface HintBoardData {\n /** 81-character user input string */\n user: string;\n /** Pencilmarks string (comma-separated) */\n pencilmarks: string | null;\n /** Whether auto-pencilmarks are enabled */\n autoPencilmarks: boolean;\n}\n\n/** Data passed to onHintReceived callback */\nexport interface HintReceivedData {\n /** The first hint step */\n hint: SolverHintStep;\n /** All hint steps */\n hints: SolverHintStep[];\n /** Board data that will be applied */\n boardData: HintBoardData;\n /** Difficulty level for this hint (from SolverHints.level) */\n hintLevel: number;\n /** Technique ID for this hint (from SolverHints.technique) */\n hintTechnique: number;\n}\n\n/** Access denied error info when hint level exceeds subscription tier */\nexport interface HintAccessError {\n /** The difficulty level of the requested hint */\n hintLevel: number;\n /** The entitlement required to access this hint level */\n requiredEntitlement: HintEntitlement;\n /** The user's current state */\n userState: HintAccessUserState;\n}\n\nexport interface UseHintOptions {\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 /** Original puzzle string (81 chars) */\n puzzle: string;\n /** Current user input string (81 chars) */\n userInput: string;\n /** Current pencilmarks (comma-separated or empty) */\n pencilmarks?: string;\n /** Whether auto-pencilmarks were generated */\n autoPencilmarks?: boolean;\n /**\n * Optional technique number to filter for.\n * When set, will first try to find hints for this specific technique.\n * If no hints found for the target technique, will retry without filter\n * to get the next available hint (allowing puzzle progression).\n */\n techniqueFilter?: number;\n /**\n * Callback fired when hints are received from the API.\n * Use this to intercept hints for logging, saving examples, etc.\n * Called before state is updated.\n */\n onHintReceived?: (data: HintReceivedData) => void;\n}\n\nexport interface UseHintResult {\n /** Current hint step being displayed */\n hint: SolverHintStep | null;\n /** All hint steps (for showing progress like \"Step 1 of 3\") */\n hints: SolverHintStep[] | null;\n /** Current step index (0-based) */\n stepIndex: number;\n /** Total number of steps */\n totalSteps: number;\n /** Whether a hint request is in progress */\n isLoading: boolean;\n /** Error message if hint request failed */\n error: string | null;\n /** Access denied error info when hint level exceeds subscription tier */\n accessError: HintAccessError | null;\n /** Request hints or advance to next step */\n getHint: () => Promise<void>;\n /** Go to next hint step */\n nextStep: () => void;\n /** Go to previous hint step */\n previousStep: () => void;\n /** Clear all hints */\n clearHint: () => void;\n /** Apply the hint to the board - returns board data and clears hint */\n applyHint: () => HintBoardData | null;\n /** Whether there are more steps after current */\n hasNextStep: boolean;\n /** Whether there are steps before current */\n hasPreviousStep: boolean;\n /** Whether the hint can be applied (on last step) */\n canApply: boolean;\n /** Whether the current hint matches the techniqueFilter (if one was set) */\n isTargetTechnique: boolean;\n}\n\n/**\n * Hook for getting hints from the solver API\n *\n * Matches Kotlin HintInteractor behavior:\n * - First call to getHint() fetches hints from API\n * - Subsequent calls advance to next step (if available)\n * - Use nextStep()/previousStep() to navigate manually\n * - clearHint() resets everything\n *\n * @param options - Puzzle state for hint generation\n * @returns Hint state and controls\n *\n * @example\n * ```tsx\n * const { hint, isLoading, getHint, nextStep, clearHint, applyHint } = useHint({\n * networkClient,\n * baseUrl: 'https://api.sudojo.com',\n * token: 'user-access-token',\n * puzzle: originalPuzzle,\n * userInput: currentInput,\n * pencilmarks: currentPencilmarks,\n * });\n *\n * // Get hint button\n * <Button onClick={getHint} disabled={isLoading}>Get Hint</Button>\n *\n * // Display hint\n * {hint && <HintDisplay step={hint} />}\n *\n * // Apply hint to board\n * const handleApply = () => {\n * const boardData = applyHint();\n * if (boardData) {\n * setUserInput(boardData.user);\n * setPencilmarks(boardData.pencilmarks);\n * }\n * };\n * ```\n */\nexport function useHint({\n networkClient,\n baseUrl,\n token,\n puzzle,\n userInput,\n pencilmarks,\n autoPencilmarks = false,\n techniqueFilter,\n onHintReceived,\n}: UseHintOptions): UseHintResult {\n const [hints, setHints] = useState<SolverHintStep[] | null>(null);\n const [stepIndex, setStepIndex] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [accessError, setAccessError] = useState<HintAccessError | null>(null);\n const [isTargetTechnique, setIsTargetTechnique] = useState(false);\n\n // Track puzzle state to detect when we need to re-fetch\n const lastPuzzleStateRef = useRef<string>('');\n\n // Store board data from API response for applying hint\n const boardDataRef = useRef<SolverBoard | null>(null);\n\n // Compute current hint step\n const hint = hints?.[stepIndex] ?? null;\n const totalSteps = hints?.length ?? 0;\n const hasNextStep = stepIndex < totalSteps - 1;\n const hasPreviousStep = stepIndex > 0;\n // Can apply when on last step and have board data\n const canApply =\n hints !== null &&\n stepIndex === totalSteps - 1 &&\n boardDataRef.current !== null;\n\n // Helper to process a successful hint response\n const processHintResponse = useCallback(\n (response: BaseResponse<SolveData>, isTarget: boolean): boolean => {\n if (response.success && response.data?.hints?.steps?.length) {\n const hintSteps = response.data.hints.steps;\n const board = response.data.board ?? null;\n\n // Call onHintReceived callback if provided (for interception/logging)\n if (\n onHintReceived &&\n hintSteps[0] &&\n board?.user !== null &&\n board?.user !== undefined\n ) {\n onHintReceived({\n hint: hintSteps[0],\n hints: hintSteps,\n boardData: {\n user: board.user,\n pencilmarks: board.pencilmark?.numbers ?? null,\n autoPencilmarks: board.pencilmark?.autopencil ?? false,\n },\n hintLevel: response.data.hints.level,\n hintTechnique: response.data.hints.technique,\n });\n }\n\n setHints(hintSteps);\n setStepIndex(0);\n setIsTargetTechnique(isTarget);\n // Store board data for applying hint later\n boardDataRef.current = board;\n // Track the puzzle state we fetched for\n lastPuzzleStateRef.current = `${puzzle}|${userInput}|${pencilmarks ?? ''}`;\n return true;\n }\n return false;\n },\n [onHintReceived, puzzle, userInput, pencilmarks]\n );\n\n // Fetch hints from API\n const fetchHints = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n setAccessError(null);\n setIsTargetTechnique(false);\n\n try {\n const client = createSudojoClient(networkClient, baseUrl);\n\n // Phase 1: If techniqueFilter is set, first try to find that specific technique\n if (techniqueFilter !== undefined) {\n const filteredOptions = {\n original: puzzle,\n user: userInput,\n autoPencilmarks,\n ...(pencilmarks !== undefined && { pencilmarks }),\n techniques: techniqueFilter.toString(),\n };\n\n const filteredResponse = await client.solverSolve(\n token,\n filteredOptions\n );\n\n // If we found hints for the target technique, use them\n if (processHintResponse(filteredResponse, true)) {\n setIsLoading(false);\n return;\n }\n // No hints for target technique, fall through to Phase 2\n }\n\n // Phase 2: Regular (unfiltered) call to get next available hint\n const solveOptions = {\n original: puzzle,\n user: userInput,\n autoPencilmarks,\n ...(pencilmarks !== undefined && { pencilmarks }),\n };\n const response: BaseResponse<SolveData> = await client.solverSolve(\n token,\n solveOptions\n );\n\n if (processHintResponse(response, false)) {\n // Successfully got hints (not the target technique)\n } else if (response.error) {\n setError(response.error);\n setHints(null);\n boardDataRef.current = null;\n } else {\n setError('No hints available');\n setHints(null);\n boardDataRef.current = null;\n }\n } catch (err) {\n // Handle hint access denied error (402)\n if (HintAccessDeniedError.isHintAccessDeniedError(err)) {\n setAccessError({\n hintLevel: err.hintLevel,\n requiredEntitlement: err.requiredEntitlement,\n userState: err.userState,\n });\n setError(null);\n } else {\n setError(err instanceof Error ? err.message : 'Failed to get hint');\n }\n setHints(null);\n boardDataRef.current = null;\n } finally {\n setIsLoading(false);\n }\n }, [\n networkClient,\n baseUrl,\n token,\n puzzle,\n userInput,\n pencilmarks,\n autoPencilmarks,\n techniqueFilter,\n processHintResponse,\n ]);\n\n // Get hint: fetch if no hints or puzzle changed, otherwise advance\n const getHint = useCallback(async () => {\n const currentPuzzleState = `${puzzle}|${userInput}|${pencilmarks ?? ''}`;\n\n if (hints === null || lastPuzzleStateRef.current !== currentPuzzleState) {\n // No hints or puzzle state changed - fetch new hints\n await fetchHints();\n } else if (hasNextStep) {\n // Have hints and more steps - advance to next\n setStepIndex(prev => prev + 1);\n }\n // If at last step and hints exist, do nothing (stay on last step)\n }, [hints, hasNextStep, fetchHints, puzzle, userInput, pencilmarks]);\n\n // Navigate to next step\n const nextStep = useCallback(() => {\n if (hasNextStep) {\n setStepIndex(prev => prev + 1);\n }\n }, [hasNextStep]);\n\n // Navigate to previous step\n const previousStep = useCallback(() => {\n if (hasPreviousStep) {\n setStepIndex(prev => prev - 1);\n }\n }, [hasPreviousStep]);\n\n // Clear all hints\n const clearHint = useCallback(() => {\n setHints(null);\n setStepIndex(0);\n setError(null);\n setAccessError(null);\n setIsTargetTechnique(false);\n lastPuzzleStateRef.current = '';\n boardDataRef.current = null;\n }, []);\n\n // Apply the hint to the board - returns board data and clears hint\n const applyHint = useCallback((): HintBoardData | null => {\n const board = boardDataRef.current;\n // Check for null/undefined board or user, but allow empty string user\n if (!board || board.user === null || board.user === undefined) {\n return null;\n }\n\n const result: HintBoardData = {\n user: board.user,\n pencilmarks: board.pencilmark?.numbers ?? null,\n autoPencilmarks: board.pencilmark?.autopencil ?? false,\n };\n\n // Clear hints after applying (matches Kotlin: result = null)\n setHints(null);\n setStepIndex(0);\n setError(null);\n lastPuzzleStateRef.current = '';\n boardDataRef.current = null;\n\n return result;\n }, []);\n\n return {\n hint,\n hints,\n stepIndex,\n totalSteps,\n isLoading,\n error,\n accessError,\n getHint,\n nextStep,\n previousStep,\n clearHint,\n applyHint,\n hasNextStep,\n hasPreviousStep,\n canApply,\n isTargetTechnique,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLearning.js","sourceRoot":"","sources":["../../src/hooks/useLearning.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLearning.js","sourceRoot":"","sources":["../../src/hooks/useLearning.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for fetching and managing learning materials for techniques\n */\n\nimport { useMemo } from 'react';\nimport type { Learning } from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\nimport {\n useSudojoLearning,\n useSudojoLearningItem,\n} from '@sudobility/sudojo_client';\n\nexport interface UseLearningOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Optional technique number to filter learning materials */\n technique?: number;\n /** Optional language code to filter learning materials */\n languageCode?: string;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseLearningResult {\n /** All learning materials (optionally filtered) */\n learningMaterials: Learning[];\n /** Whether learning materials are loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch learning materials */\n refetch: () => void;\n /** Get learning material by UUID */\n getLearningByUuid: (uuid: string) => Learning | undefined;\n /** Learning materials sorted by index */\n sortedLearning: Learning[];\n /** Group learning materials by technique number */\n learningByTechnique: Map<number, Learning[]>;\n /** Group learning materials by language code */\n learningByLanguage: Map<string, Learning[]>;\n}\n\n/**\n * Hook for fetching and managing learning materials\n *\n * @param options - Hook options\n * @returns Learning materials data and utilities\n *\n * @example\n * ```tsx\n * function LearningContent({ technique }: { technique: number }) {\n * const { learningMaterials, isLoading, sortedLearning } = useLearning({\n * networkClient,\n * baseUrl: 'https://api.sudojo.com',\n * technique,\n * languageCode: 'en',\n * });\n *\n * if (isLoading) return <Loading />;\n *\n * return (\n * <div>\n * {sortedLearning.map(item => (\n * <div key={item.uuid}>\n * <p>{item.text}</p>\n * {item.image_url && <img src={item.image_url} alt=\"\" />}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useLearning(options: UseLearningOptions): UseLearningResult {\n const {\n networkClient,\n baseUrl,\n token = '',\n technique,\n languageCode,\n enabled = true,\n } = options;\n\n const queryParams = useMemo(() => {\n // Only return params if at least one filter is provided\n if (technique === undefined && !languageCode) return undefined;\n return {\n technique: technique ?? undefined,\n language_code: languageCode ?? undefined,\n };\n }, [technique, languageCode]);\n\n const { data, isLoading, error, refetch } = useSudojoLearning(\n networkClient,\n baseUrl,\n token,\n queryParams,\n { enabled }\n );\n\n const learningMaterials = useMemo(() => {\n if (!data?.success || !data.data) return [];\n return data.data;\n }, [data]);\n\n const sortedLearning = useMemo(() => {\n return [...learningMaterials].sort((a, b) => {\n // First sort by technique number, then by index\n if (a.technique !== b.technique) {\n return (a.technique ?? 0) - (b.technique ?? 0);\n }\n return a.index - b.index;\n });\n }, [learningMaterials]);\n\n const getLearningByUuid = useMemo(() => {\n const learningMap = new Map(learningMaterials.map(l => [l.uuid, l]));\n return (uuid: string) => learningMap.get(uuid);\n }, [learningMaterials]);\n\n const learningByTechnique = useMemo(() => {\n const byTechnique = new Map<number, Learning[]>();\n for (const learning of sortedLearning) {\n const key = learning.technique ?? 0;\n const existing = byTechnique.get(key) ?? [];\n existing.push(learning);\n byTechnique.set(key, existing);\n }\n return byTechnique;\n }, [sortedLearning]);\n\n const learningByLanguage = useMemo(() => {\n const byLanguage = new Map<string, Learning[]>();\n for (const learning of sortedLearning) {\n const key = learning.language_code;\n const existing = byLanguage.get(key) ?? [];\n existing.push(learning);\n byLanguage.set(key, existing);\n }\n return byLanguage;\n }, [sortedLearning]);\n\n return {\n learningMaterials,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n getLearningByUuid,\n sortedLearning,\n learningByTechnique,\n learningByLanguage,\n };\n}\n\nexport interface UseLearningItemOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Learning item UUID to fetch */\n learningUuid: string;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseLearningItemResult {\n /** The fetched learning item */\n learningItem: Learning | null;\n /** Whether learning item is loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch learning item */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching a single learning item by UUID\n *\n * @param options - Hook options\n * @returns Learning item data\n */\nexport function useLearningItem(\n options: UseLearningItemOptions\n): UseLearningItemResult {\n const {\n networkClient,\n baseUrl,\n token = '',\n learningUuid,\n enabled = true,\n } = options;\n\n const { data, isLoading, error, refetch } = useSudojoLearningItem(\n networkClient,\n baseUrl,\n token,\n learningUuid,\n {\n enabled: enabled && !!learningUuid,\n }\n );\n\n const learningItem = useMemo(() => {\n if (!data?.success || !data.data) return null;\n return data.data;\n }, [data]);\n\n return {\n learningItem,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLevelGame.js","sourceRoot":"","sources":["../../src/hooks/useLevelGame.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLevelGame.js","sourceRoot":"","sources":["../../src/hooks/useLevelGame.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for fetching and managing game board for a specific level\n * Handles auth and subscription status with automatic refresh\n */\n\nimport { useMemo } from 'react';\nimport type { Board } from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\nimport { useSudojoRandomBoard } from '@sudobility/sudojo_client';\nimport { useQueryClient } from '@tanstack/react-query';\n\n/** Game fetch status indicating what screen to show */\nexport type GameFetchStatus =\n | 'loading'\n | 'success'\n | 'auth_required'\n | 'subscription_required'\n | 'error';\n\n/** Extended API response with action field from Sudojo API */\ninterface SudojoApiResponse<T> {\n success: boolean;\n data?: T;\n error?: string | null;\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 UseLevelGameOptions {\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 /** Level number (1-12) to fetch game for */\n level: number;\n /** Whether to fetch only symmetrical puzzles */\n symmetrical?: boolean;\n /** Whether subscription is currently active */\n subscriptionActive?: boolean;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseLevelGameResult {\n /** The game board data */\n board: Board | 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 game board */\n refetch: () => void;\n /** Fetch a new random board for this level */\n nextPuzzle: () => void;\n}\n\n/**\n * Hook for fetching a game board for a specific level\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 Game board data and status\n *\n * @example\n * ```tsx\n * function LevelPlayPage({ level }: { level: number }) {\n * const { board, status, refetch, nextPuzzle } = useLevelGame({\n * networkClient,\n * config,\n * auth,\n * level,\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={board.board} solution={board.solution} />;\n * }\n * ```\n */\nexport function useLevelGame(options: UseLevelGameOptions): UseLevelGameResult {\n const {\n networkClient,\n baseUrl,\n token,\n level,\n symmetrical,\n enabled = true,\n } = options;\n\n const queryClient = useQueryClient();\n\n const queryParams = useMemo(\n () => ({\n level,\n symmetrical: symmetrical || undefined,\n limit: undefined,\n offset: undefined,\n techniques: undefined,\n technique_bit: undefined,\n }),\n [level, symmetrical]\n );\n\n const { data, isLoading, error, refetch } = useSudojoRandomBoard(\n networkClient,\n baseUrl,\n token,\n queryParams,\n { enabled: enabled && level >= 1 && level <= 12 }\n );\n\n // Determine status based on response\n // Cast to SudojoApiResponse to check for action field\n const apiResponse = data as SudojoApiResponse<Board> | undefined;\n\n const status = useMemo((): GameFetchStatus => {\n if (isLoading) return 'loading';\n if (isAuthRequired(apiResponse, error)) return 'auth_required';\n if (isSubscriptionRequired(apiResponse, error))\n return 'subscription_required';\n if (error) return 'error';\n if (apiResponse?.success && apiResponse.data) return 'success';\n return 'loading';\n }, [isLoading, apiResponse, error]);\n\n const board = useMemo(() => {\n if (data?.success && data.data) {\n return data.data;\n }\n return null;\n }, [data]);\n\n const nextPuzzle = useMemo(() => {\n return () => {\n queryClient.invalidateQueries({\n queryKey: ['sudojo', 'boards', 'random'],\n });\n refetch();\n };\n }, [queryClient, refetch]);\n\n return {\n board,\n status,\n isLoading,\n error: error ?? null,\n refetch: () => refetch(),\n nextPuzzle,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLevels.js","sourceRoot":"","sources":["../../src/hooks/useLevels.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useLevels.js","sourceRoot":"","sources":["../../src/hooks/useLevels.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for fetching and managing Sudoku difficulty levels\n */\n\nimport { useMemo } from 'react';\nimport type { Level } from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\nimport { useSudojoLevel, useSudojoLevels } from '@sudobility/sudojo_client';\n\nexport interface UseLevelsOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseLevelsResult {\n /** All available levels */\n levels: Level[];\n /** Whether levels are loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch levels */\n refetch: () => void;\n /** Get level by its number (1-12) */\n getLevel: (level: number) => Level | undefined;\n /** Levels sorted by level number */\n sortedLevels: Level[];\n /** Free levels (no subscription required) */\n freeLevels: Level[];\n /** Premium levels (subscription required) */\n premiumLevels: Level[];\n}\n\n/**\n * Hook for fetching and managing difficulty levels\n *\n * @param options - Hook options\n * @returns Levels data and utilities\n *\n * @example\n * ```tsx\n * function LevelSelector() {\n * const { levels, isLoading, sortedLevels } = useLevels({\n * networkClient,\n * baseUrl: 'https://api.sudojo.com',\n * });\n *\n * if (isLoading) return <Loading />;\n *\n * return (\n * <ul>\n * {sortedLevels.map(level => (\n * <li key={level.level}>{level.title}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useLevels(options: UseLevelsOptions): UseLevelsResult {\n const { networkClient, baseUrl, token = '', enabled = true } = options;\n\n const { data, isLoading, error, refetch } = useSudojoLevels(\n networkClient,\n baseUrl,\n token,\n { enabled }\n );\n\n const levels = useMemo(() => {\n if (!data?.success || !data.data) return [];\n return data.data;\n }, [data]);\n\n const sortedLevels = useMemo(() => {\n return [...levels].sort((a, b) => a.level - b.level);\n }, [levels]);\n\n const freeLevels = useMemo(() => {\n return sortedLevels.filter(level => !level.requires_subscription);\n }, [sortedLevels]);\n\n const premiumLevels = useMemo(() => {\n return sortedLevels.filter(level => level.requires_subscription);\n }, [sortedLevels]);\n\n const getLevel = useMemo(() => {\n const levelMap = new Map(levels.map(l => [l.level, l]));\n return (level: number) => levelMap.get(level);\n }, [levels]);\n\n return {\n levels,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n getLevel,\n sortedLevels,\n freeLevels,\n premiumLevels,\n };\n}\n\nexport interface UseLevelOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Level number (1-12) to fetch */\n level: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseLevelResult {\n /** The fetched level */\n level: Level | null;\n /** Whether level is loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch level */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching a single level by number\n *\n * @param options - Hook options\n * @returns Level data\n */\nexport function useLevel(options: UseLevelOptions): UseLevelResult {\n const { networkClient, baseUrl, token = '', level, enabled = true } = options;\n\n const { data, isLoading, error, refetch } = useSudojoLevel(\n networkClient,\n baseUrl,\n token,\n level,\n {\n enabled: enabled && level >= 1 && level <= 12,\n }\n );\n\n const levelData = useMemo(() => {\n if (!data?.success || !data.data) return null;\n return data.data;\n }, [data]);\n\n return {\n level: levelData,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLocalStorage.js","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,YAAe;IAEf,qDAAqD;IACrD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAI,GAAG,EAAE;QACrD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvB,gDAAgD;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,KAA2B,EAAE,EAAE;QAC3D,cAAc,CAAC,IAAI,CAAC,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,2BAA2B;IAC3B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACpC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oCAAoC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAExB,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC"}
|
|
1
|
+
{"version":3,"file":"useLocalStorage.js","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,YAAe;IAEf,qDAAqD;IACrD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAI,GAAG,EAAE;QACrD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mCAAmC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAEvB,gDAAgD;IAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,KAA2B,EAAE,EAAE;QAC3D,cAAc,CAAC,IAAI,CAAC,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,2BAA2B;IAC3B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACpC,cAAc,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,oCAAoC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAExB,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["/**\n * Generic localStorage hook with type safety\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\n/**\n * Hook for persisting state to localStorage\n *\n * @param key - localStorage key\n * @param initialValue - Default value if nothing in storage\n * @returns [value, setValue, removeValue]\n *\n * @example\n * ```tsx\n * const [settings, setSettings, removeSettings] = useLocalStorage('app-settings', defaultSettings);\n *\n * // Update settings\n * setSettings({ ...settings, theme: 'dark' });\n *\n * // Or use updater function\n * setSettings(prev => ({ ...prev, theme: 'dark' }));\n *\n * // Clear settings\n * removeSettings();\n * ```\n */\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [T, (value: T | ((prev: T) => T)) => void, () => void] {\n // Get initial value from localStorage or use default\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (typeof window === 'undefined') {\n return initialValue;\n }\n\n try {\n const item = window.localStorage.getItem(key);\n return item ? (JSON.parse(item) as T) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Update localStorage when value changes\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(key, JSON.stringify(storedValue));\n } catch (error) {\n console.warn(`Error writing localStorage key \"${key}\":`, error);\n }\n }, [key, storedValue]);\n\n // Set value (supports updater function pattern)\n const setValue = useCallback((value: T | ((prev: T) => T)) => {\n setStoredValue(prev => {\n const newValue = value instanceof Function ? value(prev) : value;\n return newValue;\n });\n }, []);\n\n // Remove from localStorage\n const removeValue = useCallback(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.removeItem(key);\n setStoredValue(initialValue);\n } catch (error) {\n console.warn(`Error removing localStorage key \"${key}\":`, error);\n }\n }, [key, initialValue]);\n\n return [storedValue, setValue, removeValue];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSudoku.js","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSudoku.js","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * useSudoku hook - Main game state management\n *\n * Ported from renderable/sudokuschool/interactors/sudoku/SudokuInteractor.kt\n *\n * Handles:\n * - Board initialization with scrambling\n * - Cell selection\n * - Value input (normal and pencil modes)\n * - Error detection\n * - Game completion detection\n * - Undo functionality\n * - Auto pencilmarks generation\n */\n\nimport { useCallback, useMemo, useReducer } from 'react';\nimport {\n blockOf,\n cellHasError,\n columnOf,\n DEFAULT_APP_SETTINGS,\n DEFAULT_PLAY_SETTINGS,\n PlayingSource,\n rowOf,\n SudokuAppSettings,\n SudokuBoard,\n SudokuCell,\n SudokuPlay,\n} from '../types/sudoku';\nimport {\n cellsToInputString,\n cellsToPencilmarksString,\n cellsToPuzzleString,\n cellsToStateString,\n NonScrambler,\n parsePuzzleString,\n scrambleBoard,\n Scrambler,\n ScramblerProtocol,\n} from '../utils/sudokuScrambler';\n\n// =============================================================================\n// State Types\n// =============================================================================\n\ninterface SudokuState {\n /** Current play state */\n play: SudokuPlay | null;\n /** Original puzzle string (before scrambling) */\n originalPuzzle: string;\n /** Original solution string (before scrambling) */\n originalSolution: string;\n /** Puzzle source */\n source: PlayingSource;\n /** Level UUID if from a level */\n levelUuid: string | null;\n /** Board UUID if applicable */\n boardUuid: string | null;\n /** Undo history stack */\n history: SudokuPlay[];\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping from original (1-9) to scrambled (1-9) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n}\n\n// =============================================================================\n// Actions\n// =============================================================================\n\ntype SudokuAction =\n | {\n type: 'LOAD_BOARD';\n puzzle: string;\n solution: string;\n scramble: boolean;\n symmetrical: boolean;\n source: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n | { type: 'SELECT_CELL'; index: number }\n | { type: 'DESELECT_CELL' }\n | { type: 'INPUT'; value: number | null }\n | { type: 'TOGGLE_PENCIL_MODE' }\n | { type: 'SET_PENCIL_MODE'; enabled: boolean }\n | { type: 'UNDO' }\n | { type: 'ERASE' }\n | { type: 'AUTO_PENCILMARKS' }\n | { type: 'UPDATE_APP_SETTINGS'; settings: Partial<SudokuAppSettings> }\n | { type: 'RESET' }\n | {\n type: 'APPLY_HINT_DATA';\n userInput: string;\n pencilmarks: string | null;\n autoPencilmarks: boolean;\n };\n\n// =============================================================================\n// Initial State\n// =============================================================================\n\nfunction createInitialState(\n appSettings?: Partial<SudokuAppSettings>\n): SudokuState {\n return {\n play: null,\n originalPuzzle: '',\n originalSolution: '',\n source: 'LEVEL',\n levelUuid: null,\n boardUuid: null,\n history: [],\n appSettings: { ...DEFAULT_APP_SETTINGS, ...appSettings },\n digitMapping: new Map(),\n reverseDigitMapping: new Map(),\n };\n}\n\n// =============================================================================\n// Reducer\n// =============================================================================\n\nfunction sudokuReducer(state: SudokuState, action: SudokuAction): SudokuState {\n switch (action.type) {\n case 'LOAD_BOARD': {\n const {\n puzzle,\n solution,\n scramble,\n symmetrical,\n source,\n levelUuid,\n boardUuid,\n } = action;\n\n // Parse puzzle and solution into cells\n const cells = parsePuzzleString(puzzle, solution);\n\n // Apply scrambling if requested\n const scrambler: ScramblerProtocol = scramble ? Scrambler : NonScrambler;\n const scrambleResult = scrambleBoard(scrambler, cells, symmetrical);\n\n // Check if puzzle is already complete (all cells are clues, or all inputs match solution)\n const isComplete = scrambleResult.cells.every(cell => {\n if (cell.given !== null) return true; // Clue cells are always correct\n // Non-clue cells need input to match solution\n return cell.input !== null && cell.input === cell.solution;\n });\n\n // Create initial board\n const board: SudokuBoard = {\n cells: scrambleResult.cells,\n completed: isComplete,\n entering: false,\n enteringError: null,\n };\n\n // Create initial play state\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...createInitialState(state.appSettings),\n play,\n originalPuzzle: puzzle,\n originalSolution: solution,\n source,\n levelUuid: levelUuid ?? null,\n boardUuid: boardUuid ?? null,\n digitMapping: scrambleResult.digitMapping,\n reverseDigitMapping: scrambleResult.reverseDigitMapping,\n appSettings: state.appSettings,\n };\n }\n\n case 'SELECT_CELL': {\n if (!state.play) return state;\n if (state.play.board.completed) return state; // Can't select when completed\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex: action.index,\n },\n };\n }\n\n case 'DESELECT_CELL': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n selectedIndex: null,\n },\n };\n }\n\n case 'INPUT': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell) return state;\n\n // Can't modify given (clue) cells\n if (cell.given !== null) return state;\n\n const { value } = action;\n\n // Handle pencil marking mode\n // Matches Kotlin: if (cell.given == null && value != null)\n if (settings.pencilmarking) {\n if (value === null) return state; // Can't erase in pencil mode with null\n\n // Toggle pencilmark - matches Kotlin exactly\n const currentPencilmarks = cell.pencilmarks ?? [];\n const newPencilmarks = currentPencilmarks.includes(value)\n ? currentPencilmarks.filter(p => p !== value)\n : [...currentPencilmarks, value].sort((a, b) => a - b);\n\n const newCell: SudokuCell = {\n ...cell,\n input: null, // Clear input when setting pencilmarks\n pencilmarks: newPencilmarks,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // Normal input mode\n const row = rowOf(selectedIndex);\n const column = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n\n let completed = true;\n const newCells = board.cells.map((c, i) => {\n if (c.given !== null) return c; // Skip clue cells\n\n if (i === selectedIndex) {\n // Update the selected cell\n // Matches Kotlin: pencilmarks = if (value != null) null else cell.pencilmarks\n const modified: SudokuCell = {\n ...c,\n input: value,\n pencilmarks: value !== null ? null : c.pencilmarks,\n };\n\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n\n // Remove pencilmark from related cells\n // Matches Kotlin: cell.pencilmarks?.filter { it != value }?.toTypedArray()\n if (value !== null) {\n const cellRow = rowOf(i);\n const cellColumn = columnOf(i);\n const cellBlock = blockOf(i);\n\n if (cellRow === row || cellColumn === column || cellBlock === block) {\n const modified: SudokuCell = {\n ...c,\n pencilmarks: c.pencilmarks?.filter(p => p !== value) ?? null,\n };\n // Check completion\n if (modified.input !== modified.solution) {\n completed = false;\n }\n return modified;\n }\n }\n\n // Check completion for unmodified cells\n if (c.input !== c.solution) {\n completed = false;\n }\n return c;\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: {\n ...board,\n cells: newCells,\n completed,\n },\n selectedIndex: null, // Deselect after input\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'TOGGLE_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: !state.play.settings.pencilmarking,\n },\n },\n };\n }\n\n case 'SET_PENCIL_MODE': {\n if (!state.play) return state;\n\n return {\n ...state,\n play: {\n ...state.play,\n settings: {\n ...state.play.settings,\n pencilmarking: action.enabled,\n },\n },\n };\n }\n\n case 'UNDO': {\n if (state.history.length === 0) return state;\n\n const newHistory = [...state.history];\n const previousPlay = newHistory.pop();\n if (!previousPlay) return state;\n\n return {\n ...state,\n history: newHistory,\n play: previousPlay,\n };\n }\n\n case 'ERASE': {\n if (!state.play) return state;\n const { selectedIndex, board, settings } = state.play;\n if (selectedIndex === null) return state;\n if (board.completed) return state;\n\n const cell = board.cells[selectedIndex];\n if (!cell || cell.given !== null) return state;\n\n // In pencil mode, clear pencilmarks\n if (settings.pencilmarking) {\n if (!cell.pencilmarks || cell.pencilmarks.length === 0) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n pencilmarks: [],\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n // In normal mode, clear input\n if (cell.input === null) return state;\n\n const newCell: SudokuCell = {\n ...cell,\n input: null,\n };\n\n const newCells = board.cells.map((c, i) =>\n i === selectedIndex ? newCell : c\n );\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'AUTO_PENCILMARKS': {\n // Matches Kotlin: fun autoPencilmarks()\n if (!state.play) return state;\n const { board } = state.play;\n if (board.completed) return state;\n\n // Calculate potentials for each row, column, and block\n // Matches Kotlin: Array(9) { CellPotentials((1..9).toMutableSet()) }\n const rowPotentials: Map<number, Set<number>> = new Map();\n const colPotentials: Map<number, Set<number>> = new Map();\n const blockPotentials: Map<number, Set<number>> = new Map();\n for (let i = 0; i < 9; i++) {\n rowPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n colPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n blockPotentials.set(i, new Set([1, 2, 3, 4, 5, 6, 7, 8, 9]));\n }\n\n // Remove values that are already placed\n board.cells.forEach((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n rowPotentials.get(rowOf(index))?.delete(value);\n colPotentials.get(columnOf(index))?.delete(value);\n blockPotentials.get(blockOf(index))?.delete(value);\n }\n });\n\n // Calculate pencilmarks for each empty cell\n const newCells = board.cells.map((cell, index) => {\n const value = cell.given ?? cell.input;\n if (value !== null) {\n // Cell has a value - matches Kotlin: pencilmarks = null\n return { ...cell, pencilmarks: null };\n }\n\n // Intersect row, column, and block potentials\n const row = rowPotentials.get(rowOf(index)) ?? new Set<number>();\n const col = colPotentials.get(columnOf(index)) ?? new Set<number>();\n const block = blockPotentials.get(blockOf(index)) ?? new Set<number>();\n\n const pencilmarks = Array.from(row)\n .filter(v => col.has(v) && block.has(v))\n .sort((a, b) => a - b);\n\n return { ...cell, pencilmarks };\n });\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: { ...board, cells: newCells },\n settings: { ...state.play.settings, autoPencilmarks: true },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n case 'UPDATE_APP_SETTINGS': {\n return {\n ...state,\n appSettings: { ...state.appSettings, ...action.settings },\n };\n }\n\n case 'RESET': {\n if (!state.play) return state;\n\n // Reset to initial board state (keep original puzzle but clear all inputs)\n const cells = parsePuzzleString(\n state.originalPuzzle,\n state.originalSolution\n );\n const scrambler: ScramblerProtocol = NonScrambler; // Don't re-scramble on reset\n\n // Re-apply the same scrambling\n let newCells = cells;\n if (state.digitMapping.size > 0) {\n // Use the stored digit mapping to recreate scrambled cells\n const scrambleResult = scrambleBoard(scrambler, cells, false);\n newCells = scrambleResult.cells;\n }\n\n const board: SudokuBoard = {\n cells: newCells,\n completed: false,\n entering: false,\n enteringError: null,\n };\n\n const play: SudokuPlay = {\n board,\n settings: { ...DEFAULT_PLAY_SETTINGS },\n selectedIndex: null,\n };\n\n return {\n ...state,\n play,\n history: [],\n };\n }\n\n case 'APPLY_HINT_DATA': {\n // Matches Kotlin HintInteractor.apply() - applies board data from hint API response\n if (!state.play) return state;\n const { board } = state.play;\n\n const { userInput, pencilmarks, autoPencilmarks } = action;\n\n // Parse pencilmarks string (comma-separated, 81 entries)\n // Each entry is a string of digits (e.g., \"123\" for pencilmarks 1,2,3)\n const pencilmarksArray: (number[] | null)[] = pencilmarks\n ? pencilmarks.split(',').map(entry => {\n if (!entry || entry === '') return null;\n return entry\n .split('')\n .map(d => parseInt(d, 10))\n .filter(n => !isNaN(n) && n > 0);\n })\n : Array(81).fill(null);\n\n // Apply user input and pencilmarks to each cell\n let isComplete = true;\n const newCells = board.cells.map((cell, index) => {\n // Get input value from userInput string (0 means no input)\n const inputChar = userInput.charAt(index);\n const inputValue =\n inputChar >= '1' && inputChar <= '9' ? parseInt(inputChar, 10) : null;\n\n // Get pencilmarks for this cell\n const cellPencilmarks = pencilmarksArray[index];\n\n // Check completion - matches Kotlin: if (cell.given == null && cell.solution != cell.input)\n if (cell.given === null && inputValue !== cell.solution) {\n isComplete = false;\n }\n\n // If cell has a given value, don't modify it\n if (cell.given !== null) {\n return cell;\n }\n\n // Apply input and pencilmarks - matches Kotlin: input = if (input != 0) input else null\n return {\n ...cell,\n input: inputValue,\n pencilmarks:\n cellPencilmarks && cellPencilmarks.length > 0\n ? cellPencilmarks\n : null,\n };\n });\n\n const newBoard: SudokuBoard = {\n ...board,\n cells: newCells,\n completed: isComplete,\n };\n\n const newPlay: SudokuPlay = {\n ...state.play,\n board: newBoard,\n settings: {\n ...state.play.settings,\n autoPencilmarks,\n },\n };\n\n return {\n ...state,\n history: [...state.history, state.play],\n play: newPlay,\n };\n }\n\n default:\n return state;\n }\n}\n\n// =============================================================================\n// Hook Options and Result Types\n// =============================================================================\n\nexport interface UseSudokuOptions {\n /** Initial app settings */\n appSettings?: Partial<SudokuAppSettings>;\n}\n\nexport interface UseSudokuResult {\n // State\n /** Current play state (null if no board loaded) */\n play: SudokuPlay | null;\n /** Current board (shortcut to play.board) */\n board: SudokuBoard | null;\n /** Currently selected cell */\n selectedCell: SudokuCell | null;\n /** Selected cell index */\n selectedIndex: number | null;\n /** Whether pencil mode is active */\n isPencilMode: boolean;\n /** Whether game is completed */\n isCompleted: boolean;\n /** Whether undo is available */\n canUndo: boolean;\n /** App settings */\n appSettings: SudokuAppSettings;\n /** Digit mapping (original -> scrambled) */\n digitMapping: Map<number, number>;\n /** Reverse digit mapping (scrambled -> original) */\n reverseDigitMapping: Map<number, number>;\n\n // Computed values\n /** Cells with errors (when showErrors is enabled) */\n errorCells: SudokuCell[];\n /** Count of errors */\n errorCount: number;\n /** Progress percentage (0-100) */\n progress: number;\n /** Cells with the same value as selected cell */\n sameValueCells: SudokuCell[];\n /** Related cells (same row, column, block) */\n relatedCells: SudokuCell[];\n\n // Actions\n /** Load a new board */\n loadBoard: (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => void;\n /** Select a cell by index */\n selectCell: (index: number) => void;\n /** Select a cell by row and column */\n selectCellAt: (row: number, column: number) => void;\n /** Deselect the current cell */\n deselectCell: () => void;\n /** Input a value (1-9) into the selected cell */\n input: (value: number) => void;\n /** Erase the selected cell */\n erase: () => void;\n /** Toggle pencil mode */\n togglePencilMode: () => void;\n /** Set pencil mode */\n setPencilMode: (enabled: boolean) => void;\n /** Undo the last action */\n undo: () => void;\n /** Generate auto pencilmarks */\n autoPencilmarks: () => void;\n /** Update app settings */\n updateSettings: (settings: Partial<SudokuAppSettings>) => void;\n /** Reset the game to initial state */\n reset: () => void;\n /** Apply hint data from solver API response */\n applyHintData: (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => void;\n\n // Utility functions\n /** Get board state as string */\n getBoardString: () => string;\n /** Get original puzzle string (before scrambling) */\n getOriginalPuzzle: () => string;\n /** Get scrambled puzzle string (what the user is playing) - use this for solver API */\n getScrambledPuzzle: () => string;\n /** Get input string (user entries only) */\n getInputString: () => string;\n /** Get pencilmarks string */\n getPencilmarksString: () => string;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * Main Sudoku game hook\n *\n * @example\n * ```tsx\n * const {\n * play,\n * board,\n * selectedCell,\n * isPencilMode,\n * isCompleted,\n * loadBoard,\n * selectCell,\n * input,\n * togglePencilMode,\n * undo,\n * } = useSudoku();\n *\n * // Load a puzzle\n * loadBoard(puzzleString, solutionString, { scramble: true });\n *\n * // Select a cell and enter a value\n * selectCell(0);\n * input(5);\n *\n * // Toggle pencil mode\n * togglePencilMode();\n * input(1); // Adds 1 as pencilmark\n * input(2); // Adds 2 as pencilmark\n * input(1); // Removes 1 from pencilmarks\n * ```\n */\nexport function useSudoku(options: UseSudokuOptions = {}): UseSudokuResult {\n const [state, dispatch] = useReducer(\n sudokuReducer,\n options.appSettings,\n createInitialState\n );\n\n // Computed values\n const board = state.play?.board ?? null;\n const selectedIndex = state.play?.selectedIndex ?? null;\n const selectedCell =\n selectedIndex !== null && board\n ? (board.cells[selectedIndex] ?? null)\n : null;\n const isPencilMode = state.play?.settings.pencilmarking ?? false;\n const isCompleted = board?.completed ?? false;\n const canUndo = state.history.length > 0;\n\n const errorCells = useMemo(() => {\n if (!board || !state.appSettings.showErrors) return [];\n return board.cells.filter(cellHasError);\n }, [board, state.appSettings.showErrors]);\n\n const errorCount = errorCells.length;\n\n const progress = useMemo(() => {\n if (!board) return 0;\n const totalEmpty = board.cells.filter(c => c.given === null).length;\n if (totalEmpty === 0) return 100;\n const filled = board.cells.filter(\n c => c.given === null && c.input !== null\n ).length;\n return Math.round((filled / totalEmpty) * 100);\n }, [board]);\n\n const sameValueCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const selectedCell = board.cells[selectedIndex];\n if (!selectedCell) return [];\n const value = selectedCell.given ?? selectedCell.input;\n if (value === null) return [];\n return board.cells.filter((c, i) => {\n if (i === selectedIndex) return false;\n return (c.given ?? c.input) === value;\n });\n }, [board, selectedIndex]);\n\n const relatedCells = useMemo(() => {\n if (!board || selectedIndex === null) return [];\n const row = rowOf(selectedIndex);\n const col = columnOf(selectedIndex);\n const block = blockOf(selectedIndex);\n return board.cells.filter((_, i) => {\n if (i === selectedIndex) return false;\n return rowOf(i) === row || columnOf(i) === col || blockOf(i) === block;\n });\n }, [board, selectedIndex]);\n\n // Actions\n const loadBoard = useCallback(\n (\n puzzle: string,\n solution: string,\n options?: {\n scramble?: boolean;\n symmetrical?: boolean;\n source?: PlayingSource;\n levelUuid?: string;\n boardUuid?: string;\n }\n ) => {\n const action: SudokuAction = {\n type: 'LOAD_BOARD',\n puzzle,\n solution,\n scramble: options?.scramble ?? true,\n symmetrical: options?.symmetrical ?? false,\n source: options?.source ?? 'LEVEL',\n };\n if (options?.levelUuid !== undefined) {\n (action as { levelUuid?: string }).levelUuid = options.levelUuid;\n }\n if (options?.boardUuid !== undefined) {\n (action as { boardUuid?: string }).boardUuid = options.boardUuid;\n }\n dispatch(action);\n },\n []\n );\n\n const selectCell = useCallback((index: number) => {\n dispatch({ type: 'SELECT_CELL', index });\n }, []);\n\n const selectCellAt = useCallback((row: number, column: number) => {\n dispatch({ type: 'SELECT_CELL', index: row * 9 + column });\n }, []);\n\n const deselectCell = useCallback(() => {\n dispatch({ type: 'DESELECT_CELL' });\n }, []);\n\n const input = useCallback((value: number) => {\n dispatch({ type: 'INPUT', value });\n }, []);\n\n const erase = useCallback(() => {\n dispatch({ type: 'ERASE' });\n }, []);\n\n const togglePencilMode = useCallback(() => {\n dispatch({ type: 'TOGGLE_PENCIL_MODE' });\n }, []);\n\n const setPencilMode = useCallback((enabled: boolean) => {\n dispatch({ type: 'SET_PENCIL_MODE', enabled });\n }, []);\n\n const undo = useCallback(() => {\n dispatch({ type: 'UNDO' });\n }, []);\n\n const autoPencilmarks = useCallback(() => {\n dispatch({ type: 'AUTO_PENCILMARKS' });\n }, []);\n\n const updateSettings = useCallback((settings: Partial<SudokuAppSettings>) => {\n dispatch({ type: 'UPDATE_APP_SETTINGS', settings });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: 'RESET' });\n }, []);\n\n const applyHintData = useCallback(\n (\n userInput: string,\n pencilmarks: string | null,\n autoPencilmarks: boolean\n ) => {\n dispatch({\n type: 'APPLY_HINT_DATA',\n userInput,\n pencilmarks,\n autoPencilmarks,\n });\n },\n []\n );\n\n // Utility functions\n const getBoardString = useCallback(() => {\n if (!board) return '';\n return cellsToStateString(board.cells);\n }, [board]);\n\n const getOriginalPuzzle = useCallback(() => {\n return state.originalPuzzle;\n }, [state.originalPuzzle]);\n\n const getScrambledPuzzle = useCallback(() => {\n if (!board) return '';\n return cellsToPuzzleString(board.cells);\n }, [board]);\n\n const getInputString = useCallback(() => {\n if (!board) return '';\n return cellsToInputString(board.cells);\n }, [board]);\n\n const getPencilmarksString = useCallback(() => {\n if (!board) return '';\n return cellsToPencilmarksString(board.cells);\n }, [board]);\n\n return {\n // State\n play: state.play,\n board,\n selectedCell,\n selectedIndex,\n isPencilMode,\n isCompleted,\n canUndo,\n appSettings: state.appSettings,\n digitMapping: state.digitMapping,\n reverseDigitMapping: state.reverseDigitMapping,\n\n // Computed\n errorCells,\n errorCount,\n progress,\n sameValueCells,\n relatedCells,\n\n // Actions\n loadBoard,\n selectCell,\n selectCellAt,\n deselectCell,\n input,\n erase,\n togglePencilMode,\n setPencilMode,\n undo,\n autoPencilmarks,\n updateSettings,\n reset,\n applyHintData,\n\n // Utilities\n getBoardString,\n getOriginalPuzzle,\n getScrambledPuzzle,\n getInputString,\n getPencilmarksString,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTechniques.js","sourceRoot":"","sources":["../../src/hooks/useTechniques.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTechniques.js","sourceRoot":"","sources":["../../src/hooks/useTechniques.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for fetching and managing Sudoku solving techniques\n */\n\nimport { useMemo } from 'react';\nimport type { Technique } from '@sudobility/sudojo_types';\nimport type { NetworkClient } from '@sudobility/types';\nimport {\n useSudojoTechnique,\n useSudojoTechniques,\n} from '@sudobility/sudojo_client';\n\nexport interface UseTechniquesOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Optional level number (1-12) to filter techniques */\n level?: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseTechniquesResult {\n /** All techniques (optionally filtered by level) */\n techniques: Technique[];\n /** Whether techniques are loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch techniques */\n refetch: () => void;\n /** Get technique by its number */\n getTechniqueByNumber: (technique: number) => Technique | undefined;\n /** Techniques sorted by technique number */\n sortedTechniques: Technique[];\n /** Group techniques by level number */\n techniquesByLevel: Map<number, Technique[]>;\n}\n\n/**\n * Hook for fetching and managing solving techniques\n *\n * @param options - Hook options\n * @returns Techniques data and utilities\n *\n * @example\n * ```tsx\n * function TechniqueList({ level }: { level: number }) {\n * const { techniques, isLoading, sortedTechniques } = useTechniques({\n * networkClient,\n * baseUrl: 'https://api.sudojo.com',\n * level,\n * });\n *\n * if (isLoading) return <Loading />;\n *\n * return (\n * <ul>\n * {sortedTechniques.map(technique => (\n * <li key={technique.technique}>{technique.title}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useTechniques(\n options: UseTechniquesOptions\n): UseTechniquesResult {\n const { networkClient, baseUrl, token = '', level, enabled = true } = options;\n\n const queryParams = useMemo(() => {\n if (level === undefined) return undefined;\n return { level };\n }, [level]);\n\n const { data, isLoading, error, refetch } = useSudojoTechniques(\n networkClient,\n baseUrl,\n token,\n queryParams,\n { enabled }\n );\n\n const techniques = useMemo(() => {\n if (!data?.success || !data.data) return [];\n return data.data;\n }, [data]);\n\n const sortedTechniques = useMemo(() => {\n return [...techniques].sort((a, b) => {\n // First sort by level, then by technique number\n if (a.level !== b.level) {\n return (a.level ?? 0) - (b.level ?? 0);\n }\n return a.technique - b.technique;\n });\n }, [techniques]);\n\n const getTechniqueByNumber = useMemo(() => {\n const techniqueMap = new Map(techniques.map(t => [t.technique, t]));\n return (technique: number) => techniqueMap.get(technique);\n }, [techniques]);\n\n const techniquesByLevel = useMemo(() => {\n const byLevel = new Map<number, Technique[]>();\n for (const technique of sortedTechniques) {\n const key = technique.level ?? 0;\n const existing = byLevel.get(key) ?? [];\n existing.push(technique);\n byLevel.set(key, existing);\n }\n return byLevel;\n }, [sortedTechniques]);\n\n return {\n techniques,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n getTechniqueByNumber,\n sortedTechniques,\n techniquesByLevel,\n };\n}\n\nexport interface UseTechniqueOptions {\n /** Network client for API calls */\n networkClient: NetworkClient;\n /** Base URL for the Sudojo API */\n baseUrl: string;\n /** Access token for authentication (optional for public data) */\n token?: string;\n /** Technique number to fetch */\n technique: number;\n /** Whether to enable the query */\n enabled?: boolean;\n}\n\nexport interface UseTechniqueResult {\n /** The fetched technique */\n technique: Technique | null;\n /** Whether technique is loading */\n isLoading: boolean;\n /** Error if loading failed */\n error: Error | null;\n /** Refetch technique */\n refetch: () => void;\n}\n\n/**\n * Hook for fetching a single technique by number\n *\n * @param options - Hook options\n * @returns Technique data\n */\nexport function useTechnique(options: UseTechniqueOptions): UseTechniqueResult {\n const {\n networkClient,\n baseUrl,\n token = '',\n technique,\n enabled = true,\n } = options;\n\n const { data, isLoading, error, refetch } = useSudojoTechnique(\n networkClient,\n baseUrl,\n token,\n technique,\n {\n enabled: enabled && technique >= 1,\n }\n );\n\n const techniqueData = useMemo(() => {\n if (!data?.success || !data.data) return null;\n return data.data;\n }, [data]);\n\n return {\n technique: techniqueData,\n isLoading,\n error: error ?? null,\n refetch: () => {\n refetch();\n },\n };\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @sudobility/sudojo_lib - Business logic library for Sudojo app\n *\n * This library provides:\n * - Game state management with useSudoku hook (ported from renderable)\n * - Board scrambling utilities\n * - Game validation (mistakes, completion)\n * - Level, technique, and learning data hooks\n * - Teaching/hint integration with solver\n * - Legacy useGame hook for backward compatibility\n */\n\n// Legacy Types (useGame hook)\nexport type {\n CellPosition,\n CellState,\n GameBoard,\n GameHint,\n GameMove,\n GameSettings,\n GameState,\n GameStatus,\n TeachingState,\n} from './types';\n\nexport { DEFAULT_GAME_SETTINGS } from './types';\n\n// Sudoku Types (useSudoku hook - ported from renderable)\nexport type {\n SudokuCell,\n SudokuBoard,\n SudokuPlay,\n SudokuPlaySettings,\n SudokuAppSettings,\n SudokuGameState,\n SudokuDisplay,\n PlayingSource,\n} from './types';\n\nexport {\n DEFAULT_PLAY_SETTINGS,\n DEFAULT_APP_SETTINGS,\n createEmptyCell,\n createEmptyBoard,\n cellHasError,\n rowOf,\n columnOf,\n blockOf,\n cellIndex,\n getRowIndices,\n getColumnIndices,\n getBlockIndices,\n getRelatedIndices,\n} from './types';\n\n// Display types (for rendering - matches Kotlin renderable)\nexport type {\n HintArea,\n HintCell,\n HintCellActions,\n DisplayHintStep,\n CellDisplayState,\n PencilmarkDisplayState,\n UIColorPalette,\n // Link and group types for chain visualization\n LinkType,\n DisplayLink,\n DisplayCellGroup,\n} from './types';\n\nexport { ThemeColor, SudokuColor, UIColorLight, UIColorDark } from './types';\n\n// Progress Types (for user progress tracking)\nexport type { CompletedPuzzle, GameStats, UserProgress } from './types';\nexport { DEFAULT_PROGRESS, PROGRESS_STORAGE_KEY } from './types';\n\n// Settings Types (for app settings)\nexport type { DigitDisplay, AppSettings } from './types';\nexport { DEFAULT_SETTINGS, SETTINGS_STORAGE_KEY } from './types';\n\n// Subscription Types (for subscription management)\nexport type { Product, Subscription } from './types';\nexport { DEFAULT_SUBSCRIPTION } from './types';\n\n// Game Persistence Types (for saving/loading game state)\nexport type { SavedGameState, GamePersistenceKey } from './types';\nexport { GAME_STORAGE_PREFIX, getGameStorageKey } from './types';\n\n// Current Game Types (for current game feature)\nexport type {\n GameSource,\n CurrentGameMeta,\n CurrentGame,\n GameSlot,\n} from './types';\n\n// Legacy Utilities (useGame hook)\nexport {\n // Board utilities\n cloneBoard,\n countFilledCells,\n createGameBoard,\n getBlockCells,\n getBlockIndex,\n getBoardStateString,\n getColumnCells,\n getEmptyCells,\n getPencilmarksString,\n getRelatedCells,\n getRowCells,\n isValidPlacement,\n // Validation utilities\n autoRemovePencilmarks,\n clearHighlights,\n countMistakes,\n getIncorrectCells,\n getProgressPercentage,\n isBoardFilled,\n isCellCorrect,\n isGameComplete,\n isValueCorrect,\n updateCellErrors,\n updateCellHighlights,\n validateGameState,\n} from './utils';\n\n// Sudoku Utilities (useSudoku hook - ported from renderable)\nexport type { ScramblerProtocol, SudokuScrambleResult } from './utils';\nexport {\n Scrambler,\n NonScrambler,\n scrambleSudokuBoard,\n parsePuzzleString,\n cellsToPuzzleString,\n cellsToStateString,\n cellsToInputString,\n cellsToPencilmarksString,\n} from './utils';\n\n// Presenter utilities (for rendering - matches Kotlin renderable)\nexport type { PresentBoardOptions } from './utils';\nexport {\n presentBoard,\n calculateCellHints,\n themeColorToCSS,\n getColorPalette,\n getCellsWithDigit,\n getSelectedDigit,\n computeSelectedDigitCells,\n convertSolverLink,\n convertSolverCellGroup,\n sudokuColorToTheme,\n} from './utils';\n\n// Time Utilities\nexport { formatTime, parseTime } from './utils';\n\n// Progress Utilities\nexport {\n calculateStats,\n calculateStreak,\n isPuzzleCompleted,\n getCompletedLevelIds,\n getCompletedDailyDates,\n} from './utils';\n\n// Theme Utilities\nexport type { ThemePreference, ResolvedTheme } from './utils';\nexport {\n THEME_STORAGE_KEY,\n getSystemTheme,\n resolveTheme,\n isValidThemePreference,\n} from './utils';\n\n// Subscription Utilities\nexport {\n convertPackageToProduct,\n parseCustomerInfo,\n getPeriodDisplayName,\n isBestValuePlan,\n getRevenueCatErrorMessage,\n} from './utils';\n\n// Technique Utilities\nexport { getTechniqueIconUrl } from './utils';\n\n// Hint Explanation Utilities\nexport { generateDetailedExplanation, getHintActionSummary } from './utils';\n\n// Localized Hint Utilities\nexport type { TranslateFunction } from './utils';\nexport { getLocalizedHintText } from './utils';\n\n// i18n Key Utilities\nexport {\n getBeltKey,\n getLocalizedBeltName,\n getBeltLabelKey,\n getLocalizedBeltLabel,\n getLevelKey,\n getLocalizedLevelTitle,\n getTechniqueKey,\n getLocalizedTechniqueName,\n} from './utils';\n\n// Digit Display Utilities\nexport { displayDigit } from './utils';\n\n// Hooks\nexport {\n // Levels\n useLevel,\n useLevels,\n // Techniques\n useTechnique,\n useTechniques,\n // Learning\n useLearning,\n useLearningItem,\n // Game (legacy)\n useGame,\n // Sudoku (ported from renderable)\n useSudoku,\n // Teaching\n useGameTeaching,\n // Game fetching (with auth/subscription handling)\n useLevelGame,\n useDailyGame,\n // Game timer\n useGameTimer,\n // Game persistence\n useGamePersistence,\n useAutoSave,\n // Local storage\n useLocalStorage,\n // Hint\n useHint,\n // Game play (current game management)\n useGamePlay,\n // Board entry\n useBoardEntry,\n // Game session\n useGameSession,\n} from './hooks';\n\nexport type {\n // Levels\n UseLevelOptions,\n UseLevelResult,\n UseLevelsOptions,\n UseLevelsResult,\n // Techniques\n UseTechniqueOptions,\n UseTechniqueResult,\n UseTechniquesOptions,\n UseTechniquesResult,\n // Learning\n UseLearningItemOptions,\n UseLearningItemResult,\n UseLearningOptions,\n UseLearningResult,\n // Game (legacy)\n UseGameOptions,\n UseGameResult,\n // Sudoku (ported from renderable)\n UseSudokuOptions,\n UseSudokuResult,\n // Teaching\n UseGameTeachingOptions,\n UseGameTeachingResult,\n // Game fetching (with auth/subscription handling)\n UseLevelGameOptions,\n UseLevelGameResult,\n UseDailyGameOptions,\n UseDailyGameResult,\n GameFetchStatus,\n // Game timer\n UseGameTimerOptions,\n UseGameTimerResult,\n // Game persistence\n UseGamePersistenceOptions,\n UseGamePersistenceResult,\n // Hint\n UseHintOptions,\n UseHintResult,\n HintBoardData,\n HintReceivedData,\n HintAccessError,\n // Game play (current game management)\n UseGamePlayOptions,\n UseGamePlayResult,\n // Board entry\n UseBoardEntryOptions,\n UseBoardEntryReturn,\n ValidatedPuzzle,\n // Game session\n UseGameSessionOptions,\n GameSessionResult,\n GameFinishResult,\n} from './hooks';\n\n// Stores\nexport { useGamePlayStore } from './stores/gamePlayStore';\nexport type { GamePlayState } from './stores/gamePlayStore';\n\n// Config\nexport type { AuthProviderType, AuthProvidersConfig } from './config';\nexport { DEFAULT_AUTH_PROVIDERS } from './config';\n"]}
|
|
@@ -13,7 +13,7 @@ export interface GamePlayState {
|
|
|
13
13
|
/** Start a new game in the given slot */
|
|
14
14
|
startGame: (slot: GameSlot, source: GameSource, puzzle: string, solution: string, meta?: CurrentGameMeta) => void;
|
|
15
15
|
/** Update game progress for the given slot */
|
|
16
|
-
updateProgress: (slot: GameSlot, inputString: string, pencilmarksString: string, isPencilMode: boolean, elapsedTime: number) => void;
|
|
16
|
+
updateProgress: (slot: GameSlot, inputString: string, pencilmarksString: string, isPencilMode: boolean, autoPencilmarks: boolean, elapsedTime: number) => void;
|
|
17
17
|
/** Clear the game in the given slot */
|
|
18
18
|
clearGame: (slot: GameSlot) => void;
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gamePlayStore.d.ts","sourceRoot":"","sources":["../../src/stores/gamePlayStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,yCAAyC;IACzC,SAAS,EAAE,CACT,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,eAAe,KACnB,IAAI,CAAC;IAEV,8CAA8C;IAC9C,cAAc,EAAE,CACd,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,OAAO,EACrB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IAEV,uCAAuC;IACvC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"gamePlayStore.d.ts","sourceRoot":"","sources":["../../src/stores/gamePlayStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,QAAQ,EACR,UAAU,EACX,MAAM,sBAAsB,CAAC;AAO9B,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7B,yCAAyC;IACzC,SAAS,EAAE,CACT,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,eAAe,KACnB,IAAI,CAAC;IAEV,8CAA8C;IAC9C,cAAc,EAAE,CACd,IAAI,EAAE,QAAQ,EACd,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,YAAY,EAAE,OAAO,EACrB,eAAe,EAAE,OAAO,EACxB,WAAW,EAAE,MAAM,KAChB,IAAI,CAAC;IAEV,uCAAuC;IACvC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EA+F5B,CAAC"}
|
|
@@ -21,13 +21,14 @@ export const useGamePlayStore = create()(persist((set, get) => ({
|
|
|
21
21
|
inputString: '0'.repeat(81),
|
|
22
22
|
pencilmarksString: '',
|
|
23
23
|
isPencilMode: false,
|
|
24
|
+
autoPencilmarks: false,
|
|
24
25
|
elapsedTime: 0,
|
|
25
26
|
startedAt: now,
|
|
26
27
|
updatedAt: now,
|
|
27
28
|
},
|
|
28
29
|
});
|
|
29
30
|
},
|
|
30
|
-
updateProgress: (slot, inputString, pencilmarksString, isPencilMode, elapsedTime) => {
|
|
31
|
+
updateProgress: (slot, inputString, pencilmarksString, isPencilMode, autoPencilmarks, elapsedTime) => {
|
|
31
32
|
const field = slotField(slot);
|
|
32
33
|
const current = get()[field];
|
|
33
34
|
if (!current)
|
|
@@ -38,6 +39,7 @@ export const useGamePlayStore = create()(persist((set, get) => ({
|
|
|
38
39
|
inputString,
|
|
39
40
|
pencilmarksString,
|
|
40
41
|
isPencilMode,
|
|
42
|
+
autoPencilmarks,
|
|
41
43
|
elapsedTime,
|
|
42
44
|
updatedAt: new Date().toISOString(),
|
|
43
45
|
},
|
|
@@ -46,7 +48,7 @@ export const useGamePlayStore = create()(persist((set, get) => ({
|
|
|
46
48
|
clearGame: slot => set({ [slotField(slot)]: null }),
|
|
47
49
|
}), {
|
|
48
50
|
name: 'sudojo-current-game',
|
|
49
|
-
version:
|
|
51
|
+
version: 2,
|
|
50
52
|
migrate: (persistedState, version) => {
|
|
51
53
|
if (version === 0) {
|
|
52
54
|
// v0 had a single `currentGame` field — move it to the right slot
|
|
@@ -61,6 +63,20 @@ export const useGamePlayStore = create()(persist((set, get) => ({
|
|
|
61
63
|
playGame: isDailySource ? null : game,
|
|
62
64
|
};
|
|
63
65
|
}
|
|
66
|
+
if (version === 1) {
|
|
67
|
+
const state = persistedState;
|
|
68
|
+
const addAuto = (game) => game
|
|
69
|
+
? {
|
|
70
|
+
...game,
|
|
71
|
+
autoPencilmarks: 'autoPencilmarks' in game ? game.autoPencilmarks : false,
|
|
72
|
+
}
|
|
73
|
+
: (game ?? null);
|
|
74
|
+
return {
|
|
75
|
+
...state,
|
|
76
|
+
dailyGame: addAuto(state.dailyGame),
|
|
77
|
+
playGame: addAuto(state.playGame),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
64
80
|
return persistedState;
|
|
65
81
|
},
|
|
66
82
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gamePlayStore.js","sourceRoot":"","sources":["../../src/stores/gamePlayStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAU7C,MAAM,SAAS,GAAG,CAAC,IAAc,EAAa,EAAE,CAC9C,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"gamePlayStore.js","sourceRoot":"","sources":["../../src/stores/gamePlayStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Zustand store for current game state\n *\n * Persists two independent game slots (daily / play) to localStorage\n * so users can resume where they left off without one overwriting the other.\n */\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport type {\n CurrentGame,\n CurrentGameMeta,\n GameSlot,\n GameSource,\n} from '../types/currentGame';\n\ntype SlotField = 'dailyGame' | 'playGame';\n\nconst slotField = (slot: GameSlot): SlotField =>\n slot === 'daily' ? 'dailyGame' : 'playGame';\n\nexport interface GamePlayState {\n /** Daily game slot (null if none) */\n dailyGame: CurrentGame | null;\n /** Play game slot — levels & entered puzzles (null if none) */\n playGame: CurrentGame | null;\n\n /** Start a new game in the given slot */\n startGame: (\n slot: GameSlot,\n source: GameSource,\n puzzle: string,\n solution: string,\n meta?: CurrentGameMeta\n ) => void;\n\n /** Update game progress for the given slot */\n updateProgress: (\n slot: GameSlot,\n inputString: string,\n pencilmarksString: string,\n isPencilMode: boolean,\n autoPencilmarks: boolean,\n elapsedTime: number\n ) => void;\n\n /** Clear the game in the given slot */\n clearGame: (slot: GameSlot) => void;\n}\n\nexport const useGamePlayStore = create<GamePlayState>()(\n persist(\n (set, get) => ({\n dailyGame: null,\n playGame: null,\n\n startGame: (slot, source, puzzle, solution, meta = {}) => {\n const now = new Date().toISOString();\n set({\n [slotField(slot)]: {\n source,\n puzzle,\n solution,\n meta,\n inputString: '0'.repeat(81),\n pencilmarksString: '',\n isPencilMode: false,\n autoPencilmarks: false,\n elapsedTime: 0,\n startedAt: now,\n updatedAt: now,\n },\n });\n },\n\n updateProgress: (\n slot,\n inputString,\n pencilmarksString,\n isPencilMode,\n autoPencilmarks,\n elapsedTime\n ) => {\n const field = slotField(slot);\n const current = get()[field];\n if (!current) return;\n\n set({\n [field]: {\n ...current,\n inputString,\n pencilmarksString,\n isPencilMode,\n autoPencilmarks,\n elapsedTime,\n updatedAt: new Date().toISOString(),\n },\n });\n },\n\n clearGame: slot => set({ [slotField(slot)]: null }),\n }),\n {\n name: 'sudojo-current-game',\n version: 2,\n migrate: (persistedState: unknown, version: number) => {\n if (version === 0) {\n // v0 had a single `currentGame` field — move it to the right slot\n const old = persistedState as {\n currentGame?: CurrentGame | null;\n };\n const game = old.currentGame ?? null;\n const isDailySource = game?.source === 'daily';\n\n // Remove the old field and populate the new slots\n const { currentGame: _, ...rest } = old as Record<string, unknown>;\n return {\n ...rest,\n dailyGame: isDailySource ? game : null,\n playGame: isDailySource ? null : game,\n };\n }\n if (version === 1) {\n const state = persistedState as {\n dailyGame?: CurrentGame | null;\n playGame?: CurrentGame | null;\n };\n const addAuto = (game: CurrentGame | null | undefined) =>\n game\n ? {\n ...game,\n autoPencilmarks:\n 'autoPencilmarks' in game ? game.autoPencilmarks : false,\n }\n : (game ?? null);\n return {\n ...state,\n dailyGame: addAuto(state.dailyGame),\n playGame: addAuto(state.playGame),\n };\n }\n return persistedState;\n },\n }\n )\n);\n"]}
|
package/dist/test/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC;AACF,MAAM,CAAC,YAAY,GAAG,gBAAuB,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAExC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;IAChD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,oBAAoB;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE;IACnD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,uBAAuB;CAC/B,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IAC1C,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;QACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;QACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC5B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;KACvB,CAAC,CAAC;CACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE5B,2BAA2B;AAC3B,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;IAChB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;CACf,CAAC;AACF,MAAM,CAAC,YAAY,GAAG,gBAAuB,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,oBAAoB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACrC,MAAM,uBAAuB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAExC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE;IAChD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,oBAAoB;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE;IACnD,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,uBAAuB;CAC/B,CAAC,CAAC;AAEH,yBAAyB;AACzB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IAC1C,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;QACpB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;QACvB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;QACzB,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;QAC5B,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;KACvB,CAAC,CAAC;CACJ,CAAC,CAAC","sourcesContent":["import { vi } from 'vitest';\n\n// Mock window.localStorage\nconst localStorageMock = {\n getItem: vi.fn(),\n setItem: vi.fn(),\n removeItem: vi.fn(),\n clear: vi.fn(),\n};\nglobal.localStorage = localStorageMock as any;\n\n// Mock window event listeners\nconst addEventListenerMock = vi.fn();\nconst removeEventListenerMock = vi.fn();\n\nObject.defineProperty(window, 'addEventListener', {\n writable: true,\n value: addEventListenerMock,\n});\n\nObject.defineProperty(window, 'removeEventListener', {\n writable: true,\n value: removeEventListenerMock,\n});\n\n// Mock window.matchMedia\nObject.defineProperty(window, 'matchMedia', {\n writable: true,\n value: vi.fn().mockImplementation(query => ({\n matches: false,\n media: query,\n onchange: null,\n addListener: vi.fn(),\n removeListener: vi.fn(),\n addEventListener: vi.fn(),\n removeEventListener: vi.fn(),\n dispatchEvent: vi.fn(),\n })),\n});\n"]}
|
|
@@ -13,6 +13,10 @@ export interface CurrentGameMeta {
|
|
|
13
13
|
levelId?: string;
|
|
14
14
|
/** Level title for display */
|
|
15
15
|
levelTitle?: string;
|
|
16
|
+
/** Board UUID for the puzzle */
|
|
17
|
+
boardUuid?: string;
|
|
18
|
+
/** Techniques bitset for the puzzle */
|
|
19
|
+
techniques?: number | null;
|
|
16
20
|
}
|
|
17
21
|
/** Current game state stored in Zustand */
|
|
18
22
|
export interface CurrentGame {
|
|
@@ -30,6 +34,8 @@ export interface CurrentGame {
|
|
|
30
34
|
pencilmarksString: string;
|
|
31
35
|
/** Whether pencil mode was active */
|
|
32
36
|
isPencilMode: boolean;
|
|
37
|
+
/** Whether auto pencilmarks were enabled */
|
|
38
|
+
autoPencilmarks: boolean;
|
|
33
39
|
/** Elapsed time in seconds */
|
|
34
40
|
elapsedTime: number;
|
|
35
41
|
/** When the game was started (ISO string) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentGame.d.ts","sourceRoot":"","sources":["../../src/types/currentGame.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"currentGame.d.ts","sourceRoot":"","sources":["../../src/types/currentGame.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qCAAqC;IACrC,YAAY,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,eAAe,EAAE,OAAO,CAAC;IACzB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentGame.js","sourceRoot":"","sources":["../../src/types/currentGame.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
1
|
+
{"version":3,"file":"currentGame.js","sourceRoot":"","sources":["../../src/types/currentGame.ts"],"names":[],"mappings":"AAAA;;GAEG","sourcesContent":["/**\n * Types for the current game feature\n */\n\n/** Source of the current game */\nexport type GameSource = 'daily' | 'level' | 'entered';\n\n/** Which store slot a game lives in */\nexport type GameSlot = 'daily' | 'play';\n\n/** Metadata for navigation back to the game */\nexport interface CurrentGameMeta {\n /** For daily games - the date string (YYYY-MM-DD) */\n dailyDate?: string;\n /** For level games - the level UUID */\n levelId?: string;\n /** Level title for display */\n levelTitle?: string;\n /** Board UUID for the puzzle */\n boardUuid?: string;\n /** Techniques bitset for the puzzle */\n techniques?: number | null;\n}\n\n/** Current game state stored in Zustand */\nexport interface CurrentGame {\n /** Game source type */\n source: GameSource;\n /** Original puzzle string (81 chars) */\n puzzle: string;\n /** Solution string (81 chars) */\n solution: string;\n /** Navigation metadata */\n meta: CurrentGameMeta;\n /** User's current input (81 chars, '0' = empty) */\n inputString: string;\n /** User's pencilmarks (comma-separated format) */\n pencilmarksString: string;\n /** Whether pencil mode was active */\n isPencilMode: boolean;\n /** Whether auto pencilmarks were enabled */\n autoPencilmarks: boolean;\n /** Elapsed time in seconds */\n elapsedTime: number;\n /** When the game was started (ISO string) */\n startedAt: string;\n /** When last updated (ISO string) */\n updatedAt: string;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/types/display.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,UAiBX;AAjBD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,6BAAe,CAAA;IACf,6BAAe,CAAA;IACf,iDAAmC,CAAA;IACnC,+CAAiC,CAAA;IACjC,mDAAqC,CAAA;IACrC,uCAAyB,CAAA;IACzB,2DAA6C,CAAA;IAC7C,yDAA2C,CAAA;IAC3C,6DAA+C,CAAA;IAC/C,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,qDAAuC,CAAA;IACvC,6BAAe,CAAA;IACf,mCAAqB,CAAA;AACvB,CAAC,EAjBW,UAAU,KAAV,UAAU,QAiBrB;AAED,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,WAeX;AAfD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;IACjB,0BAAW,CAAA;IACX,8BAAe,CAAA;IACf,uCAAwB,CAAA;IACxB,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,gCAAiB,CAAA;IACjB,oDAAqC,CAAA;IACrC,oCAAqB,CAAA;AACvB,CAAC,EAfW,WAAW,KAAX,WAAW,QAetB;AAwJD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,gBAAgB,EAAE,SAAS;IAC3B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,gBAAgB,EAAE,WAAW;IAC7B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC"}
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/types/display.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gFAAgF;AAChF,sCAAsC;AACtC,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,UAiBX;AAjBD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,6BAAe,CAAA;IACf,6BAAe,CAAA;IACf,iDAAmC,CAAA;IACnC,+CAAiC,CAAA;IACjC,mDAAqC,CAAA;IACrC,uCAAyB,CAAA;IACzB,2DAA6C,CAAA;IAC7C,yDAA2C,CAAA;IAC3C,6DAA+C,CAAA;IAC/C,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,qDAAuC,CAAA;IACvC,6BAAe,CAAA;IACf,mCAAqB,CAAA;AACvB,CAAC,EAjBW,UAAU,KAAV,UAAU,QAiBrB;AAED,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAN,IAAY,WAeX;AAfD,WAAY,WAAW;IACrB,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,8BAAe,CAAA;IACf,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;IACjB,0BAAW,CAAA;IACX,8BAAe,CAAA;IACf,uCAAwB,CAAA;IACxB,8BAAe,CAAA;IACf,4BAAa,CAAA;IACb,gCAAiB,CAAA;IACjB,oDAAqC,CAAA;IACrC,oCAAqB,CAAA;AACvB,CAAC,EAfW,WAAW,KAAX,WAAW,QAetB;AAwJD;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,gBAAgB,EAAE,SAAS;IAC3B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,gBAAgB,EAAE,WAAW;IAC7B,yBAAyB,EAAE,WAAW;IACtC,wBAAwB,EAAE,WAAW;IACrC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,WAAW;IAC3B,aAAa,EAAE,WAAW;IAC1B,eAAe,EAAE,WAAW;IAC5B,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,WAAW;IACxB,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,WAAW;IACtB,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,WAAW;IACvB,KAAK,EAAE,WAAW;CACnB,CAAC","sourcesContent":["/**\n * Display types for Sudoku rendering\n *\n * Matches Kotlin renderable types exactly\n */\n\n// =============================================================================\n// Theme Color (matches ThemeColor.kt)\n// =============================================================================\n\n/**\n * Theme colors for the UI - matches Kotlin ThemeColor enum\n */\nexport enum ThemeColor {\n NONE = 'NONE',\n CLEAR = 'CLEAR',\n LABEL = 'LABEL',\n LABEL_SECONDARY = 'LABEL_SECONDARY',\n LABEL_TERTIARY = 'LABEL_TERTIARY',\n LABEL_QUATERNARY = 'LABEL_QUATERNARY',\n BACKGROUND = 'BACKGROUND',\n BACKGROUND_SECONDARY = 'BACKGROUND_SECONDARY',\n BACKGROUND_TERTIARY = 'BACKGROUND_TERTIARY',\n BACKGROUND_QUATERNARY = 'BACKGROUND_QUATERNARY',\n SELECTED = 'SELECTED',\n SUCCESS = 'SUCCESS',\n WARNING = 'WARNING',\n WARNING_SECONDARY = 'WARNING_SECONDARY',\n ERROR = 'ERROR',\n DISABLED = 'DISABLED',\n}\n\n// =============================================================================\n// Sudoku Color (matches SudokuColor in Shared.kt)\n// =============================================================================\n\n/**\n * Sudoku-specific colors - matches Kotlin SudokuColor enum\n */\nexport enum SudokuColor {\n NONE = 'none',\n CLEAR = 'clear',\n BLUE = 'blue',\n GREEN = 'green',\n YELLOW = 'yellow',\n ORANGE = 'orange',\n RED = 'red',\n WHITE = 'white',\n LIGHT_GRAY = 'lightgray',\n BLACK = 'black',\n GRAY = 'gray',\n ACTION = 'action',\n SECONDARY_ACTION = 'secondary-action',\n DISABLED = 'disabled',\n}\n\n// =============================================================================\n// Hint Types (matches Hint.kt)\n// =============================================================================\n\n/**\n * Area type for highlighting - matches HintArea.Type\n */\nexport type HintAreaType = 'row' | 'column' | 'block';\n\n/**\n * Highlighted area in a hint - matches HintArea\n */\nexport interface HintArea {\n type: HintAreaType;\n color: SudokuColor | null;\n index: number;\n}\n\n/**\n * Actions to perform on a cell - matches HintCellActions\n */\nexport interface HintCellActions {\n select: number | null;\n unselect: number | null;\n add: number[] | null;\n remove: number[] | null;\n highlight: number[] | null;\n}\n\n/**\n * Cell display information in a hint - matches HintCell\n */\nexport interface HintCell {\n index: number;\n color: SudokuColor | null;\n fill: boolean;\n actions?: HintCellActions;\n}\n\n/**\n * A single hint step - matches HintStep\n */\nexport interface HintStep {\n title: string;\n text: string;\n areas?: HintArea[] | null;\n cells?: HintCell[] | null;\n links?: DisplayLink[] | null;\n groups?: DisplayCellGroup[] | null;\n digit?: number | null;\n}\n\n// =============================================================================\n// Link Types (for chain visualization)\n// =============================================================================\n\n/**\n * Link type for chain visualization\n */\nexport type LinkType = 'strong' | 'weak';\n\n/**\n * A link between two cells in a chain (display format)\n */\nexport interface DisplayLink {\n /** Start cell index (0-80) */\n fromIndex: number;\n /** End cell index (0-80) */\n toIndex: number;\n /** Link type: \"strong\" (solid line) or \"weak\" (dashed line) */\n type: LinkType;\n /** The digit this link applies to (1-9) */\n digit: number;\n}\n\n// =============================================================================\n// Cell Group Types (for pattern visualization)\n// =============================================================================\n\n/**\n * A group of cells for pattern visualization (display format)\n */\nexport interface DisplayCellGroup {\n /** Group name (e.g., \"ALS A\", \"Conjugate Pair\", \"UR Corner\") */\n name: string;\n /** Theme color for the group */\n color: ThemeColor;\n /** Array of cell indices (0-80) */\n cellIndices: number[];\n}\n\n// =============================================================================\n// Cell Display State\n// =============================================================================\n\n/**\n * Complete display state for a single cell\n */\nexport interface CellDisplayState {\n /** Cell index (0-80) */\n index: number;\n /** Background color */\n backgroundColor: ThemeColor;\n /** Border color (null for no border) */\n borderColor: ThemeColor | null;\n /** Text color */\n textColor: ThemeColor | null;\n /** The digit to display (1-9) or null */\n digit: number | null;\n /** Whether this is a given (original) digit */\n isGiven: boolean;\n /** Pencilmarks to display */\n pencilmarks: PencilmarkDisplayState[];\n}\n\n/**\n * Display state for a single pencilmark\n */\nexport interface PencilmarkDisplayState {\n /** The digit (1-9) */\n digit: number;\n /** Color of the pencilmark */\n color: ThemeColor | null;\n}\n\n// =============================================================================\n// Color Palette\n// =============================================================================\n\n/**\n * UI color palette - matches UIColorType from sudojo-web\n */\nexport interface UIColorPalette {\n systemBackground: string;\n secondarySystemBackground: string;\n tertiarySystemBackground: string;\n label: string;\n secondaryLabel: string;\n tertiaryLabel: string;\n quaternaryLabel: string;\n systemBlue: string;\n systemGreen: string;\n systemOrange: string;\n systemPurple: string;\n systemRed: string;\n systemYellow: string;\n systemGray: string;\n clear: string;\n}\n\n/**\n * Light mode color palette - matches sudojo-web UIColorLight\n */\nexport const UIColorLight: UIColorPalette = {\n systemBackground: '#FFFFFF',\n secondarySystemBackground: '#F2F2F7FF',\n tertiarySystemBackground: '#FFFFFFFF',\n label: '#000000FF',\n secondaryLabel: '#3C3C4399',\n tertiaryLabel: '#3C3C434D',\n quaternaryLabel: '#3C3C432E',\n systemBlue: '#007AFFFF',\n systemGreen: '#34C759FF',\n systemOrange: '#FF9500FF',\n systemPurple: '#AF52DEFF',\n systemRed: '#FF3B30FF',\n systemYellow: '#FFCC00FF',\n systemGray: '#8E8E93FF',\n clear: '#00000000',\n};\n\n/**\n * Dark mode color palette - matches sudojo-web UIColorDark\n */\nexport const UIColorDark: UIColorPalette = {\n systemBackground: '#000000FF',\n secondarySystemBackground: '#1C1C1EFF',\n tertiarySystemBackground: '#2C2C2EFF',\n label: '#FFFFFFFF',\n secondaryLabel: '#EBEBF599',\n tertiaryLabel: '#EBEBF54D',\n quaternaryLabel: '#EBEBF52E',\n systemBlue: '#0A84FFFF',\n systemGreen: '#30D158FF',\n systemOrange: '#FF9F0AFF',\n systemPurple: '#BF5AF2FF',\n systemRed: '#FF453AFF',\n systemYellow: '#FFD60AFF',\n systemGray: '#8E8E93FF',\n clear: '#00000000',\n};\n"]}
|
package/dist/types/game.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../src/types/game.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmEH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,UAAU,EAAE,IAAI;IAChB,oBAAoB,EAAE,IAAI;IAC1B,qBAAqB,EAAE,IAAI;IAC3B,qBAAqB,EAAE,IAAI;IAC3B,eAAe,EAAE,KAAK;CACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../src/types/game.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmEH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,UAAU,EAAE,IAAI;IAChB,oBAAoB,EAAE,IAAI;IAC1B,qBAAqB,EAAE,IAAI;IAC3B,qBAAqB,EAAE,IAAI;IAC3B,eAAe,EAAE,KAAK;CACvB,CAAC","sourcesContent":["/**\n * Game state types for Sudojo\n */\n\n/**\n * Represents a single cell in the Sudoku grid\n */\nexport interface CellState {\n /** Row index (0-8) */\n row: number;\n /** Column index (0-8) */\n column: number;\n /** The current value (1-9) or null if empty */\n value: number | null;\n /** Whether this cell is an original clue (cannot be modified) */\n isClue: boolean;\n /** Whether this cell has an error (wrong value) */\n isError: boolean;\n /** Pencilmarks (candidate digits) for this cell */\n pencilmarks: Set<number>;\n /** Whether this cell is currently selected */\n isSelected: boolean;\n /** Whether this cell is highlighted (same row/col/block as selected) */\n isHighlighted: boolean;\n /** Whether this cell has the same value as selected cell */\n isSameValue: boolean;\n}\n\n/**\n * A 9x9 grid of cells\n */\nexport type GameBoard = CellState[][];\n\n/**\n * A single move in the game (for undo/redo)\n */\nexport interface GameMove {\n /** The row of the cell */\n row: number;\n /** The column of the cell */\n column: number;\n /** Previous value (null if was empty) */\n previousValue: number | null;\n /** New value (null if cleared) */\n newValue: number | null;\n /** Previous pencilmarks */\n previousPencilmarks: Set<number>;\n /** New pencilmarks */\n newPencilmarks: Set<number>;\n /** Type of move */\n type: 'value' | 'pencilmark';\n}\n\n/**\n * Game settings\n */\nexport interface GameSettings {\n /** Whether to highlight errors immediately */\n showErrors: boolean;\n /** Whether to highlight same numbers */\n highlightSameNumbers: boolean;\n /** Whether to highlight related cells (same row/col/block) */\n highlightRelatedCells: boolean;\n /** Whether to auto-remove pencilmarks when placing a value */\n autoRemovePencilmarks: boolean;\n /** Whether to use auto pencilmarks */\n autoPencilmarks: boolean;\n}\n\n/**\n * Default game settings\n */\nexport const DEFAULT_GAME_SETTINGS: GameSettings = {\n showErrors: true,\n highlightSameNumbers: true,\n highlightRelatedCells: true,\n autoRemovePencilmarks: true,\n autoPencilmarks: false,\n};\n\n/**\n * Game status\n */\nexport type GameStatus =\n | 'idle'\n | 'entering'\n | 'playing'\n | 'paused'\n | 'completed'\n | 'failed';\n\n/**\n * The complete game state\n */\nexport interface GameState {\n /** The current board state */\n board: GameBoard;\n /** The original puzzle string (81 chars) */\n originalPuzzle: string;\n /** The solution string (81 chars) */\n solution: string;\n /** The scrambled puzzle string (81 chars) */\n scrambledPuzzle: string;\n /** The scrambled solution string (81 chars) */\n scrambledSolution: string;\n /** Scramble mapping for digits (original -> scrambled) */\n digitMapping: Map<number, number>;\n /** Undo stack */\n undoStack: GameMove[];\n /** Redo stack */\n redoStack: GameMove[];\n /** Currently selected cell position */\n selectedCell: { row: number; column: number } | null;\n /** Game settings */\n settings: GameSettings;\n /** Current game status */\n status: GameStatus;\n /** Number of mistakes made */\n mistakeCount: number;\n /** Maximum mistakes allowed (0 = unlimited) */\n maxMistakes: number;\n /** Time elapsed in seconds */\n elapsedTime: number;\n /** Whether hint mode is active */\n hintMode: boolean;\n /** Board UUID (if loaded from server) */\n boardUuid: string | null;\n /** Level UUID (if associated with a level) */\n levelUuid: string | null;\n /** Whether in board entering mode (entering original puzzle) */\n entering: boolean;\n /** Error message (e.g., validation error during enter mode) */\n errorMessage: string | null;\n}\n\n/**\n * Position in the grid\n */\nexport interface CellPosition {\n row: number;\n column: number;\n}\n\n/**\n * Hint information from the solver\n */\nexport interface GameHint {\n /** Technique name */\n title: string;\n /** Explanation text */\n text: string;\n /** Cells involved in this hint */\n cells: Array<{\n row: number;\n column: number;\n color: string;\n action?: {\n select?: number;\n addPencilmarks?: number[];\n removePencilmarks?: number[];\n };\n }>;\n /** Areas involved (rows, columns, blocks) */\n areas: Array<{\n type: 'row' | 'column' | 'block';\n index: number;\n color: string;\n }>;\n}\n\n/**\n * Teaching state for step-by-step solving\n */\nexport interface TeachingState {\n /** Whether teaching mode is active */\n isActive: boolean;\n /** Current hint being shown */\n currentHint: GameHint | null;\n /** Index of current step in multi-step hint */\n currentStep: number;\n /** Total number of steps in current hint */\n totalSteps: number;\n /** Whether loading hints */\n isLoading: boolean;\n /** Error message if hint loading failed */\n error: string | null;\n}\n"]}
|