@sudobility/sudojo_lib 0.0.4

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.
Files changed (141) hide show
  1. package/dist/hooks/index.d.ts +27 -0
  2. package/dist/hooks/index.d.ts.map +1 -0
  3. package/dist/hooks/index.js +27 -0
  4. package/dist/hooks/index.js.map +1 -0
  5. package/dist/hooks/useDailyGame.d.ts +64 -0
  6. package/dist/hooks/useDailyGame.d.ts.map +1 -0
  7. package/dist/hooks/useDailyGame.js +120 -0
  8. package/dist/hooks/useDailyGame.js.map +1 -0
  9. package/dist/hooks/useGame.d.ts +104 -0
  10. package/dist/hooks/useGame.d.ts.map +1 -0
  11. package/dist/hooks/useGame.js +546 -0
  12. package/dist/hooks/useGame.js.map +1 -0
  13. package/dist/hooks/useGamePersistence.d.ts +63 -0
  14. package/dist/hooks/useGamePersistence.d.ts.map +1 -0
  15. package/dist/hooks/useGamePersistence.js +124 -0
  16. package/dist/hooks/useGamePersistence.js.map +1 -0
  17. package/dist/hooks/useGameTeaching.d.ts +89 -0
  18. package/dist/hooks/useGameTeaching.d.ts.map +1 -0
  19. package/dist/hooks/useGameTeaching.js +230 -0
  20. package/dist/hooks/useGameTeaching.js.map +1 -0
  21. package/dist/hooks/useGameTimer.d.ts +43 -0
  22. package/dist/hooks/useGameTimer.d.ts.map +1 -0
  23. package/dist/hooks/useGameTimer.js +68 -0
  24. package/dist/hooks/useGameTimer.js.map +1 -0
  25. package/dist/hooks/useHint.d.ts +105 -0
  26. package/dist/hooks/useHint.d.ts.map +1 -0
  27. package/dist/hooks/useHint.js +179 -0
  28. package/dist/hooks/useHint.js.map +1 -0
  29. package/dist/hooks/useLearning.d.ts +100 -0
  30. package/dist/hooks/useLearning.d.ts.map +1 -0
  31. package/dist/hooks/useLearning.js +127 -0
  32. package/dist/hooks/useLearning.js.map +1 -0
  33. package/dist/hooks/useLevelGame.d.ts +68 -0
  34. package/dist/hooks/useLevelGame.d.ts.map +1 -0
  35. package/dist/hooks/useLevelGame.js +128 -0
  36. package/dist/hooks/useLevelGame.js.map +1 -0
  37. package/dist/hooks/useLevels.d.ts +93 -0
  38. package/dist/hooks/useLevels.d.ts.map +1 -0
  39. package/dist/hooks/useLevels.js +98 -0
  40. package/dist/hooks/useLevels.js.map +1 -0
  41. package/dist/hooks/useLocalStorage.d.ts +26 -0
  42. package/dist/hooks/useLocalStorage.d.ts.map +1 -0
  43. package/dist/hooks/useLocalStorage.js +75 -0
  44. package/dist/hooks/useLocalStorage.js.map +1 -0
  45. package/dist/hooks/useSudoku.d.ts +125 -0
  46. package/dist/hooks/useSudoku.d.ts.map +1 -0
  47. package/dist/hooks/useSudoku.js +655 -0
  48. package/dist/hooks/useSudoku.js.map +1 -0
  49. package/dist/hooks/useTechniques.d.ts +92 -0
  50. package/dist/hooks/useTechniques.d.ts.map +1 -0
  51. package/dist/hooks/useTechniques.js +108 -0
  52. package/dist/hooks/useTechniques.js.map +1 -0
  53. package/dist/index.d.ts +42 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +64 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/test/setup.d.ts +2 -0
  58. package/dist/test/setup.d.ts.map +1 -0
  59. package/dist/test/setup.js +35 -0
  60. package/dist/test/setup.js.map +1 -0
  61. package/dist/types/display.d.ts +142 -0
  62. package/dist/types/display.d.ts.map +1 -0
  63. package/dist/types/display.js +94 -0
  64. package/dist/types/display.js.map +1 -0
  65. package/dist/types/game.d.ts +201 -0
  66. package/dist/types/game.d.ts.map +1 -0
  67. package/dist/types/game.js +26 -0
  68. package/dist/types/game.js.map +1 -0
  69. package/dist/types/gamePersistence.d.ts +31 -0
  70. package/dist/types/gamePersistence.d.ts.map +1 -0
  71. package/dist/types/gamePersistence.js +15 -0
  72. package/dist/types/gamePersistence.js.map +1 -0
  73. package/dist/types/index.d.ts +18 -0
  74. package/dist/types/index.d.ts.map +1 -0
  75. package/dist/types/index.js +11 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/dist/types/progress.d.ts +43 -0
  78. package/dist/types/progress.d.ts.map +1 -0
  79. package/dist/types/progress.js +19 -0
  80. package/dist/types/progress.js.map +1 -0
  81. package/dist/types/settings.d.ts +19 -0
  82. package/dist/types/settings.d.ts.map +1 -0
  83. package/dist/types/settings.js +12 -0
  84. package/dist/types/settings.js.map +1 -0
  85. package/dist/types/subscription.d.ts +27 -0
  86. package/dist/types/subscription.d.ts.map +1 -0
  87. package/dist/types/subscription.js +8 -0
  88. package/dist/types/subscription.js.map +1 -0
  89. package/dist/types/sudoku.d.ts +147 -0
  90. package/dist/types/sudoku.d.ts.map +1 -0
  91. package/dist/types/sudoku.js +125 -0
  92. package/dist/types/sudoku.js.map +1 -0
  93. package/dist/utils/auth.d.ts +25 -0
  94. package/dist/utils/auth.d.ts.map +1 -0
  95. package/dist/utils/auth.js +47 -0
  96. package/dist/utils/auth.js.map +1 -0
  97. package/dist/utils/board.d.ts +116 -0
  98. package/dist/utils/board.d.ts.map +1 -0
  99. package/dist/utils/board.js +291 -0
  100. package/dist/utils/board.js.map +1 -0
  101. package/dist/utils/index.d.ts +18 -0
  102. package/dist/utils/index.d.ts.map +1 -0
  103. package/dist/utils/index.js +23 -0
  104. package/dist/utils/index.js.map +1 -0
  105. package/dist/utils/progress.d.ts +44 -0
  106. package/dist/utils/progress.d.ts.map +1 -0
  107. package/dist/utils/progress.js +104 -0
  108. package/dist/utils/progress.js.map +1 -0
  109. package/dist/utils/scramble.d.ts +35 -0
  110. package/dist/utils/scramble.d.ts.map +1 -0
  111. package/dist/utils/scramble.js +270 -0
  112. package/dist/utils/scramble.js.map +1 -0
  113. package/dist/utils/subscription.d.ts +82 -0
  114. package/dist/utils/subscription.d.ts.map +1 -0
  115. package/dist/utils/subscription.js +117 -0
  116. package/dist/utils/subscription.js.map +1 -0
  117. package/dist/utils/sudokuPresenter.d.ts +62 -0
  118. package/dist/utils/sudokuPresenter.d.ts.map +1 -0
  119. package/dist/utils/sudokuPresenter.js +403 -0
  120. package/dist/utils/sudokuPresenter.js.map +1 -0
  121. package/dist/utils/sudokuScrambler.d.ts +61 -0
  122. package/dist/utils/sudokuScrambler.d.ts.map +1 -0
  123. package/dist/utils/sudokuScrambler.js +223 -0
  124. package/dist/utils/sudokuScrambler.js.map +1 -0
  125. package/dist/utils/technique.d.ts +41 -0
  126. package/dist/utils/technique.d.ts.map +1 -0
  127. package/dist/utils/technique.js +106 -0
  128. package/dist/utils/technique.js.map +1 -0
  129. package/dist/utils/theme.d.ts +31 -0
  130. package/dist/utils/theme.d.ts.map +1 -0
  131. package/dist/utils/theme.js +40 -0
  132. package/dist/utils/theme.js.map +1 -0
  133. package/dist/utils/time.d.ts +22 -0
  134. package/dist/utils/time.d.ts.map +1 -0
  135. package/dist/utils/time.js +41 -0
  136. package/dist/utils/time.js.map +1 -0
  137. package/dist/utils/validation.d.ts +107 -0
  138. package/dist/utils/validation.d.ts.map +1 -0
  139. package/dist/utils/validation.js +248 -0
  140. package/dist/utils/validation.js.map +1 -0
  141. package/package.json +79 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Hook for fetching and managing game board for a specific level
3
+ * Handles auth and subscription status with automatic refresh
4
+ */
5
+ import { useEffect, useMemo, useRef } from 'react';
6
+ import { useSudojoRandomBoard, } from '@sudobility/sudojo_client';
7
+ import { useQueryClient } from '@tanstack/react-query';
8
+ /** Check if response indicates auth is required */
9
+ function isAuthRequired(response, error) {
10
+ if (response?.success === false &&
11
+ response.action?.type === 'auth_required') {
12
+ return true;
13
+ }
14
+ if (error && typeof error === 'object') {
15
+ const err = error;
16
+ if (err.message?.includes('Account required'))
17
+ return true;
18
+ }
19
+ return false;
20
+ }
21
+ /** Check if response indicates subscription is required */
22
+ function isSubscriptionRequired(response, error) {
23
+ if (response?.success === false &&
24
+ response.action?.type === 'subscription_required') {
25
+ return true;
26
+ }
27
+ if (error && typeof error === 'object') {
28
+ const err = error;
29
+ if (err.message?.includes('Daily limit reached') ||
30
+ err.message?.includes('subscription')) {
31
+ return true;
32
+ }
33
+ }
34
+ return false;
35
+ }
36
+ /**
37
+ * Hook for fetching a game board for a specific level
38
+ *
39
+ * Automatically refetches when auth token or subscription status changes.
40
+ * Returns status indicating whether auth or subscription is required.
41
+ *
42
+ * @param options - Hook options
43
+ * @returns Game board data and status
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * function LevelPlayPage({ levelId }: { levelId: string }) {
48
+ * const { board, status, refetch, nextPuzzle } = useLevelGame({
49
+ * networkClient,
50
+ * config,
51
+ * auth,
52
+ * levelId,
53
+ * subscriptionActive: subscription.isActive,
54
+ * });
55
+ *
56
+ * if (status === 'loading') return <Loading />;
57
+ * if (status === 'auth_required') return <AuthRequired onLogin={openAuthModal} />;
58
+ * if (status === 'subscription_required') return <SubscriptionPaywall onSuccess={refetch} />;
59
+ * if (status === 'error') return <Error />;
60
+ *
61
+ * return <SudokuGame puzzle={board.board} solution={board.solution} />;
62
+ * }
63
+ * ```
64
+ */
65
+ export function useLevelGame(options) {
66
+ const { networkClient, config, auth, levelId, subscriptionActive = false, enabled = true, } = options;
67
+ const queryClient = useQueryClient();
68
+ // Track previous state to detect changes
69
+ const prevStateRef = useRef({
70
+ authToken: auth.accessToken,
71
+ subscriptionActive,
72
+ });
73
+ const queryParams = useMemo(() => ({ level_uuid: levelId }), [levelId]);
74
+ const { data, isLoading, error, refetch } = useSudojoRandomBoard(networkClient, config, auth, queryParams, { enabled: enabled && !!levelId });
75
+ // Determine status based on response
76
+ // Cast to SudojoApiResponse to check for action field
77
+ const apiResponse = data;
78
+ const status = useMemo(() => {
79
+ if (isLoading)
80
+ return 'loading';
81
+ if (isAuthRequired(apiResponse, error))
82
+ return 'auth_required';
83
+ if (isSubscriptionRequired(apiResponse, error))
84
+ return 'subscription_required';
85
+ if (error)
86
+ return 'error';
87
+ if (apiResponse?.success && apiResponse.data)
88
+ return 'success';
89
+ return 'loading';
90
+ }, [isLoading, apiResponse, error]);
91
+ const board = useMemo(() => {
92
+ if (data?.success && data.data) {
93
+ return data.data;
94
+ }
95
+ return null;
96
+ }, [data]);
97
+ // Auto-refresh when auth token or subscription status changes
98
+ useEffect(() => {
99
+ const prev = prevStateRef.current;
100
+ const authChanged = prev.authToken !== auth.accessToken;
101
+ const subscriptionChanged = !prev.subscriptionActive && subscriptionActive;
102
+ if (authChanged || subscriptionChanged) {
103
+ queryClient.invalidateQueries({
104
+ queryKey: ['sudojo', 'boards', 'random'],
105
+ });
106
+ refetch();
107
+ }
108
+ // Update ref for next comparison
109
+ prevStateRef.current = { authToken: auth.accessToken, subscriptionActive };
110
+ }, [auth.accessToken, subscriptionActive, queryClient, refetch]);
111
+ const nextPuzzle = useMemo(() => {
112
+ return () => {
113
+ queryClient.invalidateQueries({
114
+ queryKey: ['sudojo', 'boards', 'random'],
115
+ });
116
+ refetch();
117
+ };
118
+ }, [queryClient, refetch]);
119
+ return {
120
+ board,
121
+ status,
122
+ isLoading,
123
+ error: error ?? null,
124
+ refetch: () => refetch(),
125
+ nextPuzzle,
126
+ };
127
+ }
128
+ //# sourceMappingURL=useLevelGame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLevelGame.js","sourceRoot":"","sources":["../../src/hooks/useLevelGame.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAGnD,OAAO,EAGL,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAsBvD,mDAAmD;AACnD,SAAS,cAAc,CACrB,QAAgD,EAChD,KAAc;IAEd,IACE,QAAQ,EAAE,OAAO,KAAK,KAAK;QAC3B,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,eAAe,EACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAA6B,CAAC;QAC1C,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2DAA2D;AAC3D,SAAS,sBAAsB,CAC7B,QAAgD,EAChD,KAAc;IAEd,IACE,QAAQ,EAAE,OAAO,KAAK,KAAK;QAC3B,QAAQ,CAAC,MAAM,EAAE,IAAI,KAAK,uBAAuB,EACjD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAA6B,CAAC;QAC1C,IACE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,qBAAqB,CAAC;YAC5C,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,EACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EACJ,aAAa,EACb,MAAM,EACN,IAAI,EACJ,OAAO,EACP,kBAAkB,GAAG,KAAK,EAC1B,OAAO,GAAG,IAAI,GACf,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,yCAAyC;IACzC,MAAM,YAAY,GAAG,MAAM,CAAC;QAC1B,SAAS,EAAE,IAAI,CAAC,WAAW;QAC3B,kBAAkB;KACnB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAExE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAC9D,aAAa,EACb,MAAM,EACN,IAAI,EACJ,WAAW,EACX,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,EAAE,CAClC,CAAC;IAEF,qCAAqC;IACrC,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAA4C,CAAC;IAEjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAoB,EAAE;QAC3C,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC;YAAE,OAAO,eAAe,CAAC;QAC/D,IAAI,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC;YAC5C,OAAO,uBAAuB,CAAC;QACjC,IAAI,KAAK;YAAE,OAAO,OAAO,CAAC;QAC1B,IAAI,WAAW,EAAE,OAAO,IAAI,WAAW,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC/D,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAEpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,8DAA8D;IAC9D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC;QACxD,MAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,kBAAkB,CAAC;QAE3E,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAAC;YACvC,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACzC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,iCAAiC;QACjC,YAAY,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC7E,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;aACzC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3B,OAAO;QACL,KAAK;QACL,MAAM;QACN,SAAS;QACT,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;QACxB,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Hook for fetching and managing Sudoku difficulty levels
3
+ */
4
+ import type { Level } from '@sudobility/sudojo_types';
5
+ import type { NetworkClient } from '@sudobility/types';
6
+ import { type SudojoAuth, type SudojoConfig } from '@sudobility/sudojo_client';
7
+ export interface UseLevelsOptions {
8
+ /** Network client for API calls */
9
+ networkClient: NetworkClient;
10
+ /** Sudojo API configuration */
11
+ config: SudojoConfig;
12
+ /** Auth credentials (optional for public data) */
13
+ auth?: SudojoAuth;
14
+ /** Whether to enable the query */
15
+ enabled?: boolean;
16
+ }
17
+ export interface UseLevelsResult {
18
+ /** All available levels */
19
+ levels: Level[];
20
+ /** Whether levels are loading */
21
+ isLoading: boolean;
22
+ /** Error if loading failed */
23
+ error: Error | null;
24
+ /** Refetch levels */
25
+ refetch: () => void;
26
+ /** Get level by UUID */
27
+ getLevelByUuid: (uuid: string) => Level | undefined;
28
+ /** Get level by index */
29
+ getLevelByIndex: (index: number) => Level | undefined;
30
+ /** Levels sorted by index */
31
+ sortedLevels: Level[];
32
+ /** Free levels (no subscription required) */
33
+ freeLevels: Level[];
34
+ /** Premium levels (subscription required) */
35
+ premiumLevels: Level[];
36
+ }
37
+ /**
38
+ * Hook for fetching and managing difficulty levels
39
+ *
40
+ * @param options - Hook options
41
+ * @returns Levels data and utilities
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * function LevelSelector() {
46
+ * const { levels, isLoading, sortedLevels } = useLevels({
47
+ * networkClient,
48
+ * config: { baseUrl: 'https://api.sudojo.com' },
49
+ * });
50
+ *
51
+ * if (isLoading) return <Loading />;
52
+ *
53
+ * return (
54
+ * <ul>
55
+ * {sortedLevels.map(level => (
56
+ * <li key={level.uuid}>{level.title}</li>
57
+ * ))}
58
+ * </ul>
59
+ * );
60
+ * }
61
+ * ```
62
+ */
63
+ export declare function useLevels(options: UseLevelsOptions): UseLevelsResult;
64
+ export interface UseLevelOptions {
65
+ /** Network client for API calls */
66
+ networkClient: NetworkClient;
67
+ /** Sudojo API configuration */
68
+ config: SudojoConfig;
69
+ /** Auth credentials (optional for public data) */
70
+ auth?: SudojoAuth;
71
+ /** Level UUID to fetch */
72
+ levelUuid: string;
73
+ /** Whether to enable the query */
74
+ enabled?: boolean;
75
+ }
76
+ export interface UseLevelResult {
77
+ /** The fetched level */
78
+ level: Level | null;
79
+ /** Whether level is loading */
80
+ isLoading: boolean;
81
+ /** Error if loading failed */
82
+ error: Error | null;
83
+ /** Refetch level */
84
+ refetch: () => void;
85
+ }
86
+ /**
87
+ * Hook for fetching a single level by UUID
88
+ *
89
+ * @param options - Hook options
90
+ * @returns Level data
91
+ */
92
+ export declare function useLevel(options: UseLevelOptions): UseLevelResult;
93
+ //# sourceMappingURL=useLevels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLevels.d.ts","sourceRoot":"","sources":["../../src/hooks/useLevels.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EAGlB,MAAM,2BAA2B,CAAC;AAKnC,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,iCAAiC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,wBAAwB;IACxB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAC;IACpD,yBAAyB;IACzB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,KAAK,GAAG,SAAS,CAAC;IACtD,6BAA6B;IAC7B,YAAY,EAAE,KAAK,EAAE,CAAC;IACtB,6CAA6C;IAC7C,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,6CAA6C;IAC7C,aAAa,EAAE,KAAK,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,eAAe,CAuDpE;AAED,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,+BAA+B;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,+BAA+B;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAgCjE"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Hook for fetching and managing Sudoku difficulty levels
3
+ */
4
+ import { useMemo } from 'react';
5
+ import { useSudojoLevel, useSudojoLevels, } from '@sudobility/sudojo_client';
6
+ /** Default empty auth for public endpoints */
7
+ const DEFAULT_AUTH = { accessToken: '' };
8
+ /**
9
+ * Hook for fetching and managing difficulty levels
10
+ *
11
+ * @param options - Hook options
12
+ * @returns Levels data and utilities
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * function LevelSelector() {
17
+ * const { levels, isLoading, sortedLevels } = useLevels({
18
+ * networkClient,
19
+ * config: { baseUrl: 'https://api.sudojo.com' },
20
+ * });
21
+ *
22
+ * if (isLoading) return <Loading />;
23
+ *
24
+ * return (
25
+ * <ul>
26
+ * {sortedLevels.map(level => (
27
+ * <li key={level.uuid}>{level.title}</li>
28
+ * ))}
29
+ * </ul>
30
+ * );
31
+ * }
32
+ * ```
33
+ */
34
+ export function useLevels(options) {
35
+ const { networkClient, config, auth = DEFAULT_AUTH, enabled = true, } = options;
36
+ const { data, isLoading, error, refetch } = useSudojoLevels(networkClient, config, auth, { enabled });
37
+ const levels = useMemo(() => {
38
+ if (!data?.success || !data.data)
39
+ return [];
40
+ return data.data;
41
+ }, [data]);
42
+ const sortedLevels = useMemo(() => {
43
+ return [...levels].sort((a, b) => a.index - b.index);
44
+ }, [levels]);
45
+ const freeLevels = useMemo(() => {
46
+ return sortedLevels.filter(level => !level.requires_subscription);
47
+ }, [sortedLevels]);
48
+ const premiumLevels = useMemo(() => {
49
+ return sortedLevels.filter(level => level.requires_subscription);
50
+ }, [sortedLevels]);
51
+ const getLevelByUuid = useMemo(() => {
52
+ const levelMap = new Map(levels.map(l => [l.uuid, l]));
53
+ return (uuid) => levelMap.get(uuid);
54
+ }, [levels]);
55
+ const getLevelByIndex = useMemo(() => {
56
+ const indexMap = new Map(levels.map(l => [l.index, l]));
57
+ return (index) => indexMap.get(index);
58
+ }, [levels]);
59
+ return {
60
+ levels,
61
+ isLoading,
62
+ error: error ?? null,
63
+ refetch: () => {
64
+ refetch();
65
+ },
66
+ getLevelByUuid,
67
+ getLevelByIndex,
68
+ sortedLevels,
69
+ freeLevels,
70
+ premiumLevels,
71
+ };
72
+ }
73
+ /**
74
+ * Hook for fetching a single level by UUID
75
+ *
76
+ * @param options - Hook options
77
+ * @returns Level data
78
+ */
79
+ export function useLevel(options) {
80
+ const { networkClient, config, auth = DEFAULT_AUTH, levelUuid, enabled = true, } = options;
81
+ const { data, isLoading, error, refetch } = useSudojoLevel(networkClient, config, auth, levelUuid, {
82
+ enabled: enabled && !!levelUuid,
83
+ });
84
+ const level = useMemo(() => {
85
+ if (!data?.success || !data.data)
86
+ return null;
87
+ return data.data;
88
+ }, [data]);
89
+ return {
90
+ level,
91
+ isLoading,
92
+ error: error ?? null,
93
+ refetch: () => {
94
+ refetch();
95
+ },
96
+ };
97
+ }
98
+ //# sourceMappingURL=useLevels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLevels.js","sourceRoot":"","sources":["../../src/hooks/useLevels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Generic localStorage hook with type safety
3
+ */
4
+ /**
5
+ * Hook for persisting state to localStorage
6
+ *
7
+ * @param key - localStorage key
8
+ * @param initialValue - Default value if nothing in storage
9
+ * @returns [value, setValue, removeValue]
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * const [settings, setSettings, removeSettings] = useLocalStorage('app-settings', defaultSettings);
14
+ *
15
+ * // Update settings
16
+ * setSettings({ ...settings, theme: 'dark' });
17
+ *
18
+ * // Or use updater function
19
+ * setSettings(prev => ({ ...prev, theme: 'dark' }));
20
+ *
21
+ * // Clear settings
22
+ * removeSettings();
23
+ * ```
24
+ */
25
+ export declare function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T | ((prev: T) => T)) => void, () => void];
26
+ //# sourceMappingURL=useLocalStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,GACd,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC,CAoDxD"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Generic localStorage hook with type safety
3
+ */
4
+ import { useCallback, useEffect, useState } from 'react';
5
+ /**
6
+ * Hook for persisting state to localStorage
7
+ *
8
+ * @param key - localStorage key
9
+ * @param initialValue - Default value if nothing in storage
10
+ * @returns [value, setValue, removeValue]
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * const [settings, setSettings, removeSettings] = useLocalStorage('app-settings', defaultSettings);
15
+ *
16
+ * // Update settings
17
+ * setSettings({ ...settings, theme: 'dark' });
18
+ *
19
+ * // Or use updater function
20
+ * setSettings(prev => ({ ...prev, theme: 'dark' }));
21
+ *
22
+ * // Clear settings
23
+ * removeSettings();
24
+ * ```
25
+ */
26
+ export function useLocalStorage(key, initialValue) {
27
+ // Get initial value from localStorage or use default
28
+ const [storedValue, setStoredValue] = useState(() => {
29
+ if (typeof window === 'undefined') {
30
+ return initialValue;
31
+ }
32
+ try {
33
+ const item = window.localStorage.getItem(key);
34
+ return item ? JSON.parse(item) : initialValue;
35
+ }
36
+ catch (error) {
37
+ console.warn(`Error reading localStorage key "${key}":`, error);
38
+ return initialValue;
39
+ }
40
+ });
41
+ // Update localStorage when value changes
42
+ useEffect(() => {
43
+ if (typeof window === 'undefined') {
44
+ return;
45
+ }
46
+ try {
47
+ window.localStorage.setItem(key, JSON.stringify(storedValue));
48
+ }
49
+ catch (error) {
50
+ console.warn(`Error writing localStorage key "${key}":`, error);
51
+ }
52
+ }, [key, storedValue]);
53
+ // Set value (supports updater function pattern)
54
+ const setValue = useCallback((value) => {
55
+ setStoredValue(prev => {
56
+ const newValue = value instanceof Function ? value(prev) : value;
57
+ return newValue;
58
+ });
59
+ }, []);
60
+ // Remove from localStorage
61
+ const removeValue = useCallback(() => {
62
+ if (typeof window === 'undefined') {
63
+ return;
64
+ }
65
+ try {
66
+ window.localStorage.removeItem(key);
67
+ setStoredValue(initialValue);
68
+ }
69
+ catch (error) {
70
+ console.warn(`Error removing localStorage key "${key}":`, error);
71
+ }
72
+ }, [key, initialValue]);
73
+ return [storedValue, setValue, removeValue];
74
+ }
75
+ //# sourceMappingURL=useLocalStorage.js.map
@@ -0,0 +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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * useSudoku hook - Main game state management
3
+ *
4
+ * Ported from renderable/sudokuschool/interactors/sudoku/SudokuInteractor.kt
5
+ *
6
+ * Handles:
7
+ * - Board initialization with scrambling
8
+ * - Cell selection
9
+ * - Value input (normal and pencil modes)
10
+ * - Error detection
11
+ * - Game completion detection
12
+ * - Undo functionality
13
+ * - Auto pencilmarks generation
14
+ */
15
+ import { PlayingSource, SudokuAppSettings, SudokuBoard, SudokuCell, SudokuPlay } from '../types/sudoku';
16
+ export interface UseSudokuOptions {
17
+ /** Initial app settings */
18
+ appSettings?: Partial<SudokuAppSettings>;
19
+ }
20
+ export interface UseSudokuResult {
21
+ /** Current play state (null if no board loaded) */
22
+ play: SudokuPlay | null;
23
+ /** Current board (shortcut to play.board) */
24
+ board: SudokuBoard | null;
25
+ /** Currently selected cell */
26
+ selectedCell: SudokuCell | null;
27
+ /** Selected cell index */
28
+ selectedIndex: number | null;
29
+ /** Whether pencil mode is active */
30
+ isPencilMode: boolean;
31
+ /** Whether game is completed */
32
+ isCompleted: boolean;
33
+ /** Whether undo is available */
34
+ canUndo: boolean;
35
+ /** App settings */
36
+ appSettings: SudokuAppSettings;
37
+ /** Digit mapping (original -> scrambled) */
38
+ digitMapping: Map<number, number>;
39
+ /** Reverse digit mapping (scrambled -> original) */
40
+ reverseDigitMapping: Map<number, number>;
41
+ /** Cells with errors (when showErrors is enabled) */
42
+ errorCells: SudokuCell[];
43
+ /** Count of errors */
44
+ errorCount: number;
45
+ /** Progress percentage (0-100) */
46
+ progress: number;
47
+ /** Cells with the same value as selected cell */
48
+ sameValueCells: SudokuCell[];
49
+ /** Related cells (same row, column, block) */
50
+ relatedCells: SudokuCell[];
51
+ /** Load a new board */
52
+ loadBoard: (puzzle: string, solution: string, options?: {
53
+ scramble?: boolean;
54
+ symmetrical?: boolean;
55
+ source?: PlayingSource;
56
+ levelUuid?: string;
57
+ boardUuid?: string;
58
+ }) => void;
59
+ /** Select a cell by index */
60
+ selectCell: (index: number) => void;
61
+ /** Select a cell by row and column */
62
+ selectCellAt: (row: number, column: number) => void;
63
+ /** Deselect the current cell */
64
+ deselectCell: () => void;
65
+ /** Input a value (1-9) into the selected cell */
66
+ input: (value: number) => void;
67
+ /** Erase the selected cell */
68
+ erase: () => void;
69
+ /** Toggle pencil mode */
70
+ togglePencilMode: () => void;
71
+ /** Set pencil mode */
72
+ setPencilMode: (enabled: boolean) => void;
73
+ /** Undo the last action */
74
+ undo: () => void;
75
+ /** Generate auto pencilmarks */
76
+ autoPencilmarks: () => void;
77
+ /** Update app settings */
78
+ updateSettings: (settings: Partial<SudokuAppSettings>) => void;
79
+ /** Reset the game to initial state */
80
+ reset: () => void;
81
+ /** Apply hint data from solver API response */
82
+ applyHintData: (userInput: string, pencilmarks: string | null, autoPencilmarks: boolean) => void;
83
+ /** Get board state as string */
84
+ getBoardString: () => string;
85
+ /** Get original puzzle string */
86
+ getOriginalPuzzle: () => string;
87
+ /** Get input string (user entries only) */
88
+ getInputString: () => string;
89
+ /** Get pencilmarks string */
90
+ getPencilmarksString: () => string;
91
+ }
92
+ /**
93
+ * Main Sudoku game hook
94
+ *
95
+ * @example
96
+ * ```tsx
97
+ * const {
98
+ * play,
99
+ * board,
100
+ * selectedCell,
101
+ * isPencilMode,
102
+ * isCompleted,
103
+ * loadBoard,
104
+ * selectCell,
105
+ * input,
106
+ * togglePencilMode,
107
+ * undo,
108
+ * } = useSudoku();
109
+ *
110
+ * // Load a puzzle
111
+ * loadBoard(puzzleString, solutionString, { scramble: true });
112
+ *
113
+ * // Select a cell and enter a value
114
+ * selectCell(0);
115
+ * input(5);
116
+ *
117
+ * // Toggle pencil mode
118
+ * togglePencilMode();
119
+ * input(1); // Adds 1 as pencilmark
120
+ * input(2); // Adds 2 as pencilmark
121
+ * input(1); // Removes 1 from pencilmarks
122
+ * ```
123
+ */
124
+ export declare function useSudoku(options?: UseSudokuOptions): UseSudokuResult;
125
+ //# sourceMappingURL=useSudoku.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSudoku.d.ts","sourceRoot":"","sources":["../../src/hooks/useSudoku.ts"],"names":[],"mappings":"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"}