@sudobility/sudojo_lib 0.0.70 → 0.0.73
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.d.ts +18 -0
- package/dist/config/authProviders.d.ts.map +1 -0
- package/dist/config/authProviders.js +12 -0
- package/dist/config/authProviders.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useBoardEntry.d.ts +45 -0
- package/dist/hooks/useBoardEntry.d.ts.map +1 -0
- package/dist/hooks/useBoardEntry.js +197 -0
- package/dist/hooks/useBoardEntry.js.map +1 -0
- package/dist/hooks/useGameSession.d.ts +45 -0
- package/dist/hooks/useGameSession.d.ts.map +1 -0
- package/dist/hooks/useGameSession.js +108 -0
- package/dist/hooks/useGameSession.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/hintExplanation.d.ts +17 -0
- package/dist/utils/hintExplanation.d.ts.map +1 -0
- package/dist/utils/hintExplanation.js +882 -0
- package/dist/utils/hintExplanation.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/localizedHint.d.ts +17 -0
- package/dist/utils/localizedHint.d.ts.map +1 -0
- package/dist/utils/localizedHint.js +35 -0
- package/dist/utils/localizedHint.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared auth provider configuration
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for which authentication providers are enabled
|
|
5
|
+
* across all Sudojo apps (web and mobile).
|
|
6
|
+
*/
|
|
7
|
+
/** Available authentication provider types */
|
|
8
|
+
export type AuthProviderType = 'google' | 'apple' | 'email';
|
|
9
|
+
/** Configuration for enabled auth providers */
|
|
10
|
+
export interface AuthProvidersConfig {
|
|
11
|
+
/** Which providers to enable */
|
|
12
|
+
providers: AuthProviderType[];
|
|
13
|
+
/** Enable anonymous sign-in fallback */
|
|
14
|
+
enableAnonymous?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Default auth providers config used by all apps */
|
|
17
|
+
export declare const DEFAULT_AUTH_PROVIDERS: AuthProvidersConfig;
|
|
18
|
+
//# sourceMappingURL=authProviders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authProviders.d.ts","sourceRoot":"","sources":["../../src/config/authProviders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAE5D,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qDAAqD;AACrD,eAAO,MAAM,sBAAsB,EAAE,mBAGpC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared auth provider configuration
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for which authentication providers are enabled
|
|
5
|
+
* across all Sudojo apps (web and mobile).
|
|
6
|
+
*/
|
|
7
|
+
/** Default auth providers config used by all apps */
|
|
8
|
+
export const DEFAULT_AUTH_PROVIDERS = {
|
|
9
|
+
providers: ['google', 'email'],
|
|
10
|
+
enableAnonymous: true,
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=authProviders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authProviders.js","sourceRoot":"","sources":["../../src/config/authProviders.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,qDAAqD;AACrD,MAAM,CAAC,MAAM,sBAAsB,GAAwB;IACzD,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9B,eAAe,EAAE,IAAI;CACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -26,4 +26,8 @@ export { useHint } from './useHint';
|
|
|
26
26
|
export type { UseHintOptions, UseHintResult, HintBoardData, HintReceivedData, HintAccessError, } from './useHint';
|
|
27
27
|
export { useGamePlay } from './useGamePlay';
|
|
28
28
|
export type { UseGamePlayOptions, UseGamePlayResult } from './useGamePlay';
|
|
29
|
+
export { useBoardEntry } from './useBoardEntry';
|
|
30
|
+
export type { UseBoardEntryOptions, UseBoardEntryReturn, ValidatedPuzzle, } from './useBoardEntry';
|
|
31
|
+
export { useGameSession } from './useGameSession';
|
|
32
|
+
export type { UseGameSessionOptions, GameSessionResult, GameFinishResult, } from './useGameSession';
|
|
29
33
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EACV,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EACV,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EACV,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -26,4 +26,8 @@ export { useLocalStorage } from './useLocalStorage';
|
|
|
26
26
|
export { useHint } from './useHint';
|
|
27
27
|
// Game play hook (current game management)
|
|
28
28
|
export { useGamePlay } from './useGamePlay';
|
|
29
|
+
// Board entry hook
|
|
30
|
+
export { useBoardEntry } from './useBoardEntry';
|
|
31
|
+
// Game session hook
|
|
32
|
+
export { useGameSession } from './useGameSession';
|
|
29
33
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQlD,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQ9D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ7D,sBAAsB;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,wCAAwC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMvE,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,2CAA2C;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQlD,mBAAmB;AACnB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQ9D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQ7D,sBAAsB;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,wCAAwC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,wDAAwD;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMvE,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,2CAA2C;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,mBAAmB;AACnB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for managing Sudoku board entry mode state
|
|
3
|
+
* Allows users to enter given clues for a custom puzzle
|
|
4
|
+
*/
|
|
5
|
+
import type { SudokuCell } from '../types';
|
|
6
|
+
import type { NetworkClient } from '@sudobility/types';
|
|
7
|
+
export interface ValidatedPuzzle {
|
|
8
|
+
puzzle: string;
|
|
9
|
+
solution: string;
|
|
10
|
+
}
|
|
11
|
+
export interface UseBoardEntryOptions {
|
|
12
|
+
networkClient: NetworkClient;
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
token: string;
|
|
15
|
+
}
|
|
16
|
+
export interface UseBoardEntryReturn {
|
|
17
|
+
/** 81 cells with given values only */
|
|
18
|
+
cells: SudokuCell[];
|
|
19
|
+
/** Currently selected cell index */
|
|
20
|
+
selectedIndex: number | null;
|
|
21
|
+
/** Whether validation is in progress */
|
|
22
|
+
isValidating: boolean;
|
|
23
|
+
/** Validation error message key */
|
|
24
|
+
validationError: string | null;
|
|
25
|
+
/** Validated puzzle data (puzzle + solution) */
|
|
26
|
+
validatedPuzzle: ValidatedPuzzle | null;
|
|
27
|
+
/** Select a cell by index */
|
|
28
|
+
selectCell: (index: number) => void;
|
|
29
|
+
/** Set a given value at the selected cell */
|
|
30
|
+
setGiven: (value: number) => void;
|
|
31
|
+
/** Erase the selected cell */
|
|
32
|
+
erase: () => void;
|
|
33
|
+
/** Get the puzzle as an 81-character string */
|
|
34
|
+
getPuzzleString: () => string;
|
|
35
|
+
/** Trigger validation */
|
|
36
|
+
validate: () => void;
|
|
37
|
+
/** Reset to empty board */
|
|
38
|
+
reset: () => void;
|
|
39
|
+
/** Number of clues entered */
|
|
40
|
+
clueCount: number;
|
|
41
|
+
/** Set cells from an 81-character puzzle string */
|
|
42
|
+
setCellsFromPuzzle: (puzzle: string) => void;
|
|
43
|
+
}
|
|
44
|
+
export declare function useBoardEntry({ networkClient, baseUrl, token, }: UseBoardEntryOptions): UseBoardEntryReturn;
|
|
45
|
+
//# sourceMappingURL=useBoardEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBoardEntry.d.ts","sourceRoot":"","sources":["../../src/hooks/useBoardEntry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,oCAAoC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wCAAwC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gDAAgD;IAChD,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,6BAA6B;IAC7B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6CAA6C;IAC7C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,8BAA8B;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,+CAA+C;IAC/C,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAsDD,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,OAAO,EACP,KAAK,GACN,EAAE,oBAAoB,GAAG,mBAAmB,CAoK5C"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for managing Sudoku board entry mode state
|
|
3
|
+
* Allows users to enter given clues for a custom puzzle
|
|
4
|
+
*/
|
|
5
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
|
+
import { useSolverValidate } from '@sudobility/sudojo_client';
|
|
7
|
+
/**
|
|
8
|
+
* Create an empty 81-cell board for entry mode
|
|
9
|
+
*/
|
|
10
|
+
function createEmptyBoard() {
|
|
11
|
+
return Array.from({ length: 81 }, (_, index) => ({
|
|
12
|
+
index,
|
|
13
|
+
solution: null,
|
|
14
|
+
given: null,
|
|
15
|
+
input: null,
|
|
16
|
+
pencilmarks: null,
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert cells to 81-character puzzle string
|
|
21
|
+
* '0' for empty, '1'-'9' for given values
|
|
22
|
+
*/
|
|
23
|
+
function cellsToPuzzleString(cells) {
|
|
24
|
+
return cells.map(cell => cell.given?.toString() ?? '0').join('');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Count the number of non-empty cells (clues)
|
|
28
|
+
*/
|
|
29
|
+
function countClues(cells) {
|
|
30
|
+
return cells.filter(cell => cell.given !== null).length;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a board from an 81-character puzzle string
|
|
34
|
+
* '0' or '.' for empty, '1'-'9' for given values
|
|
35
|
+
*/
|
|
36
|
+
function puzzleStringToCells(puzzle) {
|
|
37
|
+
if (puzzle.length !== 81) {
|
|
38
|
+
return createEmptyBoard();
|
|
39
|
+
}
|
|
40
|
+
return Array.from({ length: 81 }, (_, index) => {
|
|
41
|
+
const char = puzzle.charAt(index);
|
|
42
|
+
const value = parseInt(char, 10);
|
|
43
|
+
const given = value >= 1 && value <= 9 ? value : null;
|
|
44
|
+
return {
|
|
45
|
+
index,
|
|
46
|
+
solution: null,
|
|
47
|
+
given,
|
|
48
|
+
input: null,
|
|
49
|
+
pencilmarks: null,
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function useBoardEntry({ networkClient, baseUrl, token, }) {
|
|
54
|
+
const [cells, setCells] = useState(createEmptyBoard);
|
|
55
|
+
const [selectedIndex, setSelectedIndex] = useState(null);
|
|
56
|
+
const [validationError, setValidationError] = useState(null);
|
|
57
|
+
const [validatedPuzzle, setValidatedPuzzle] = useState(null);
|
|
58
|
+
const [shouldValidate, setShouldValidate] = useState(false);
|
|
59
|
+
// Compute puzzle string for validation
|
|
60
|
+
const puzzleString = useMemo(() => cellsToPuzzleString(cells), [cells]);
|
|
61
|
+
const clueCount = useMemo(() => countClues(cells), [cells]);
|
|
62
|
+
// Use the solver validate hook
|
|
63
|
+
const { data: validateData, isLoading: isValidating } = useSolverValidate(networkClient, baseUrl, token, { original: puzzleString }, {
|
|
64
|
+
enabled: shouldValidate && clueCount >= 17,
|
|
65
|
+
retry: false,
|
|
66
|
+
});
|
|
67
|
+
// Track whether we've already processed this validation result
|
|
68
|
+
const processedDataRef = useRef(null);
|
|
69
|
+
// Handle validation result
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (!shouldValidate || isValidating)
|
|
72
|
+
return;
|
|
73
|
+
if (!validateData)
|
|
74
|
+
return;
|
|
75
|
+
// Avoid re-processing the same result
|
|
76
|
+
if (processedDataRef.current === validateData)
|
|
77
|
+
return;
|
|
78
|
+
processedDataRef.current = validateData;
|
|
79
|
+
// ValidateData has board.solution
|
|
80
|
+
const solution = validateData.data?.board?.solution;
|
|
81
|
+
if (validateData.success && solution) {
|
|
82
|
+
setValidatedPuzzle({
|
|
83
|
+
puzzle: puzzleString,
|
|
84
|
+
solution,
|
|
85
|
+
});
|
|
86
|
+
setValidationError(null);
|
|
87
|
+
}
|
|
88
|
+
else if (validateData.error) {
|
|
89
|
+
// Validation failed with specific error
|
|
90
|
+
const errorMsg = validateData.error.toLowerCase();
|
|
91
|
+
if (errorMsg.includes('multiple') || errorMsg.includes('not unique')) {
|
|
92
|
+
setValidationError('enter.errors.multipleSolutions');
|
|
93
|
+
}
|
|
94
|
+
else if (errorMsg.includes('cannot solve') ||
|
|
95
|
+
errorMsg.includes('no solution')) {
|
|
96
|
+
setValidationError('enter.errors.noSolution');
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
setValidationError('enter.errors.validationFailed');
|
|
100
|
+
}
|
|
101
|
+
setValidatedPuzzle(null);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Unexpected response - success but no solution
|
|
105
|
+
console.error('Unexpected validation response:', validateData);
|
|
106
|
+
setValidationError('enter.errors.validationFailed');
|
|
107
|
+
setValidatedPuzzle(null);
|
|
108
|
+
}
|
|
109
|
+
setShouldValidate(false);
|
|
110
|
+
}, [validateData, shouldValidate, isValidating, puzzleString]);
|
|
111
|
+
// Select a cell
|
|
112
|
+
const selectCell = useCallback((index) => {
|
|
113
|
+
if (index >= 0 && index < 81) {
|
|
114
|
+
setSelectedIndex(index);
|
|
115
|
+
}
|
|
116
|
+
}, []);
|
|
117
|
+
// Set a given value at the selected cell
|
|
118
|
+
const setGiven = useCallback((value) => {
|
|
119
|
+
if (selectedIndex === null || value < 1 || value > 9)
|
|
120
|
+
return;
|
|
121
|
+
setCells(prevCells => {
|
|
122
|
+
const newCells = [...prevCells];
|
|
123
|
+
const existing = newCells[selectedIndex];
|
|
124
|
+
if (existing) {
|
|
125
|
+
newCells[selectedIndex] = { ...existing, given: value };
|
|
126
|
+
}
|
|
127
|
+
return newCells;
|
|
128
|
+
});
|
|
129
|
+
// Clear validation state when board changes
|
|
130
|
+
setValidationError(null);
|
|
131
|
+
setValidatedPuzzle(null);
|
|
132
|
+
}, [selectedIndex]);
|
|
133
|
+
// Erase the selected cell
|
|
134
|
+
const erase = useCallback(() => {
|
|
135
|
+
if (selectedIndex === null)
|
|
136
|
+
return;
|
|
137
|
+
setCells(prevCells => {
|
|
138
|
+
const newCells = [...prevCells];
|
|
139
|
+
const existing = newCells[selectedIndex];
|
|
140
|
+
if (existing) {
|
|
141
|
+
newCells[selectedIndex] = { ...existing, given: null };
|
|
142
|
+
}
|
|
143
|
+
return newCells;
|
|
144
|
+
});
|
|
145
|
+
// Clear validation state when board changes
|
|
146
|
+
setValidationError(null);
|
|
147
|
+
setValidatedPuzzle(null);
|
|
148
|
+
}, [selectedIndex]);
|
|
149
|
+
// Get puzzle string
|
|
150
|
+
const getPuzzleString = useCallback(() => {
|
|
151
|
+
return puzzleString;
|
|
152
|
+
}, [puzzleString]);
|
|
153
|
+
// Trigger validation
|
|
154
|
+
const validate = useCallback(() => {
|
|
155
|
+
// Check minimum clues
|
|
156
|
+
if (clueCount < 17) {
|
|
157
|
+
setValidationError('enter.errors.notEnoughClues');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Clear previous state and trigger validation
|
|
161
|
+
setValidationError(null);
|
|
162
|
+
setValidatedPuzzle(null);
|
|
163
|
+
setShouldValidate(true);
|
|
164
|
+
}, [clueCount]);
|
|
165
|
+
// Reset to empty board
|
|
166
|
+
const reset = useCallback(() => {
|
|
167
|
+
setCells(createEmptyBoard());
|
|
168
|
+
setSelectedIndex(null);
|
|
169
|
+
setValidationError(null);
|
|
170
|
+
setValidatedPuzzle(null);
|
|
171
|
+
setShouldValidate(false);
|
|
172
|
+
}, []);
|
|
173
|
+
// Set cells from puzzle string
|
|
174
|
+
const setCellsFromPuzzle = useCallback((puzzle) => {
|
|
175
|
+
setCells(puzzleStringToCells(puzzle));
|
|
176
|
+
setSelectedIndex(null);
|
|
177
|
+
setValidationError(null);
|
|
178
|
+
setValidatedPuzzle(null);
|
|
179
|
+
setShouldValidate(false);
|
|
180
|
+
}, []);
|
|
181
|
+
return {
|
|
182
|
+
cells,
|
|
183
|
+
selectedIndex,
|
|
184
|
+
isValidating,
|
|
185
|
+
validationError,
|
|
186
|
+
validatedPuzzle,
|
|
187
|
+
selectCell,
|
|
188
|
+
setGiven,
|
|
189
|
+
erase,
|
|
190
|
+
getPuzzleString,
|
|
191
|
+
validate,
|
|
192
|
+
reset,
|
|
193
|
+
clueCount,
|
|
194
|
+
setCellsFromPuzzle,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=useBoardEntry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBoardEntry.js","sourceRoot":"","sources":["../../src/hooks/useBoardEntry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for managing game sessions with gamification
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Starting game sessions on the server
|
|
6
|
+
* - Finishing game sessions and receiving rewards
|
|
7
|
+
* - Tracking achievement results for display
|
|
8
|
+
*/
|
|
9
|
+
import type { GameFinishResponse, GameStartRequest } from '@sudobility/sudojo_types';
|
|
10
|
+
import type { NetworkClient } from '@sudobility/types';
|
|
11
|
+
export interface UseGameSessionOptions {
|
|
12
|
+
networkClient: NetworkClient;
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
token: string | null;
|
|
15
|
+
userId: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface GameSessionResult {
|
|
18
|
+
/** Whether a server session was started */
|
|
19
|
+
sessionStarted: boolean;
|
|
20
|
+
/** Session ID from server (if started) */
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface GameFinishResult {
|
|
24
|
+
/** The full response from the server */
|
|
25
|
+
response?: GameFinishResponse;
|
|
26
|
+
/** Whether the user leveled up */
|
|
27
|
+
leveledUp: boolean;
|
|
28
|
+
/** New badges earned */
|
|
29
|
+
newBadges: Array<{
|
|
30
|
+
badgeKey: string;
|
|
31
|
+
title: string;
|
|
32
|
+
description: string | null;
|
|
33
|
+
}>;
|
|
34
|
+
/** Total points earned */
|
|
35
|
+
totalPointsEarned: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function useGameSession({ networkClient, baseUrl, token, userId, }: UseGameSessionOptions): {
|
|
38
|
+
startSession: (data: GameStartRequest) => Promise<GameSessionResult>;
|
|
39
|
+
finishSession: (elapsedTime: number) => Promise<GameFinishResult>;
|
|
40
|
+
isStarting: boolean;
|
|
41
|
+
isFinishing: boolean;
|
|
42
|
+
isAuthenticated: boolean;
|
|
43
|
+
sessionId: string | null;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=useGameSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameSession.d.ts","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,aAAa,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,cAAc,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB;IACxB,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,0BAA0B;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE,qBAAqB;yBAaP,gBAAgB,KAAG,OAAO,CAAC,iBAAiB,CAAC;iCAqCtC,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAAC;;;;;EA4DzD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook for managing game sessions with gamification
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Starting game sessions on the server
|
|
6
|
+
* - Finishing game sessions and receiving rewards
|
|
7
|
+
* - Tracking achievement results for display
|
|
8
|
+
*/
|
|
9
|
+
import { useCallback, useRef, useState } from 'react';
|
|
10
|
+
import { useSudojoPlayFinish, useSudojoPlayStart, } from '@sudobility/sudojo_client';
|
|
11
|
+
export function useGameSession({ networkClient, baseUrl, token, userId, }) {
|
|
12
|
+
const [isStarting, setIsStarting] = useState(false);
|
|
13
|
+
const [isFinishing, setIsFinishing] = useState(false);
|
|
14
|
+
const sessionIdRef = useRef(null);
|
|
15
|
+
const playStartMutation = useSudojoPlayStart(networkClient, baseUrl);
|
|
16
|
+
const playFinishMutation = useSudojoPlayFinish(networkClient, baseUrl);
|
|
17
|
+
/**
|
|
18
|
+
* Start a game session on the server
|
|
19
|
+
* Only works if user is authenticated
|
|
20
|
+
*/
|
|
21
|
+
const startSession = useCallback(async (data) => {
|
|
22
|
+
// Skip if not authenticated
|
|
23
|
+
if (!userId || !token) {
|
|
24
|
+
return { sessionStarted: false };
|
|
25
|
+
}
|
|
26
|
+
setIsStarting(true);
|
|
27
|
+
try {
|
|
28
|
+
const response = await playStartMutation.mutateAsync({
|
|
29
|
+
token,
|
|
30
|
+
data,
|
|
31
|
+
});
|
|
32
|
+
if (response.success && response.data) {
|
|
33
|
+
sessionIdRef.current = response.data.sessionId;
|
|
34
|
+
return {
|
|
35
|
+
sessionStarted: true,
|
|
36
|
+
sessionId: response.data.sessionId,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return { sessionStarted: false };
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('Failed to start game session:', error);
|
|
43
|
+
return { sessionStarted: false };
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
setIsStarting(false);
|
|
47
|
+
}
|
|
48
|
+
}, [userId, token, playStartMutation]);
|
|
49
|
+
/**
|
|
50
|
+
* Finish the game session and get rewards
|
|
51
|
+
* Only works if user is authenticated and session was started
|
|
52
|
+
*/
|
|
53
|
+
const finishSession = useCallback(async (elapsedTime) => {
|
|
54
|
+
// Skip if not authenticated
|
|
55
|
+
if (!userId || !token) {
|
|
56
|
+
return {
|
|
57
|
+
leveledUp: false,
|
|
58
|
+
newBadges: [],
|
|
59
|
+
totalPointsEarned: 0,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
setIsFinishing(true);
|
|
63
|
+
try {
|
|
64
|
+
const response = await playFinishMutation.mutateAsync({
|
|
65
|
+
token,
|
|
66
|
+
data: { elapsedTime },
|
|
67
|
+
});
|
|
68
|
+
sessionIdRef.current = null;
|
|
69
|
+
if (response.success && response.data) {
|
|
70
|
+
return {
|
|
71
|
+
response: response.data,
|
|
72
|
+
leveledUp: !!response.data.level,
|
|
73
|
+
newBadges: response.data.badges ?? [],
|
|
74
|
+
totalPointsEarned: response.data.points.totalPoints,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
leveledUp: false,
|
|
79
|
+
newBadges: [],
|
|
80
|
+
totalPointsEarned: 0,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Failed to finish game session:', error);
|
|
85
|
+
return {
|
|
86
|
+
leveledUp: false,
|
|
87
|
+
newBadges: [],
|
|
88
|
+
totalPointsEarned: 0,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
setIsFinishing(false);
|
|
93
|
+
}
|
|
94
|
+
}, [userId, token, playFinishMutation]);
|
|
95
|
+
/**
|
|
96
|
+
* Check if user is authenticated (can use gamification)
|
|
97
|
+
*/
|
|
98
|
+
const isAuthenticated = !!userId && !!token;
|
|
99
|
+
return {
|
|
100
|
+
startSession,
|
|
101
|
+
finishSession,
|
|
102
|
+
isStarting,
|
|
103
|
+
isFinishing,
|
|
104
|
+
isAuthenticated,
|
|
105
|
+
sessionId: sessionIdRef.current,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=useGameSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGameSession.js","sourceRoot":"","sources":["../../src/hooks/useGameSession.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -35,8 +35,13 @@ export type { ThemePreference, ResolvedTheme } from './utils';
|
|
|
35
35
|
export { THEME_STORAGE_KEY, getSystemTheme, resolveTheme, isValidThemePreference, } from './utils';
|
|
36
36
|
export { convertPackageToProduct, parseCustomerInfo, getPeriodDisplayName, isBestValuePlan, getRevenueCatErrorMessage, } from './utils';
|
|
37
37
|
export { getTechniqueIconUrl, TECHNIQUE_TO_HELP_FILE, HELP_FILE_TO_TECHNIQUE, getHelpFileUrl, getTechniqueFromHelpFile, extractBodyContent, } from './utils';
|
|
38
|
-
export {
|
|
39
|
-
export type {
|
|
38
|
+
export { generateDetailedExplanation, getHintActionSummary } from './utils';
|
|
39
|
+
export type { TranslateFunction } from './utils';
|
|
40
|
+
export { getLocalizedHintText } from './utils';
|
|
41
|
+
export { useLevel, useLevels, useTechnique, useTechniques, useLearning, useLearningItem, useGame, useSudoku, useGameTeaching, useLevelGame, useDailyGame, useGameTimer, useGamePersistence, useAutoSave, useLocalStorage, useHint, useGamePlay, useBoardEntry, useGameSession, } from './hooks';
|
|
42
|
+
export type { UseLevelOptions, UseLevelResult, UseLevelsOptions, UseLevelsResult, UseTechniqueOptions, UseTechniqueResult, UseTechniquesOptions, UseTechniquesResult, UseLearningItemOptions, UseLearningItemResult, UseLearningOptions, UseLearningResult, UseGameOptions, UseGameResult, UseSudokuOptions, UseSudokuResult, UseGameTeachingOptions, UseGameTeachingResult, UseLevelGameOptions, UseLevelGameResult, UseDailyGameOptions, UseDailyGameResult, GameFetchStatus, UseGameTimerOptions, UseGameTimerResult, UseGamePersistenceOptions, UseGamePersistenceResult, UseHintOptions, UseHintResult, HintBoardData, HintReceivedData, HintAccessError, UseGamePlayOptions, UseGamePlayResult, UseBoardEntryOptions, UseBoardEntryReturn, ValidatedPuzzle, UseGameSessionOptions, GameSessionResult, GameFinishResult, } from './hooks';
|
|
40
43
|
export { useGamePlayStore } from './stores/gamePlayStore';
|
|
41
44
|
export type { GamePlayState } from './stores/gamePlayStore';
|
|
45
|
+
export type { AuthProviderType, AuthProvidersConfig } from './config';
|
|
46
|
+
export { DEFAULT_AUTH_PROVIDERS } from './config';
|
|
42
47
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -33,6 +33,9 @@ export { THEME_STORAGE_KEY, getSystemTheme, resolveTheme, isValidThemePreference
|
|
|
33
33
|
export { convertPackageToProduct, parseCustomerInfo, getPeriodDisplayName, isBestValuePlan, getRevenueCatErrorMessage, } from './utils';
|
|
34
34
|
// Technique Utilities
|
|
35
35
|
export { getTechniqueIconUrl, TECHNIQUE_TO_HELP_FILE, HELP_FILE_TO_TECHNIQUE, getHelpFileUrl, getTechniqueFromHelpFile, extractBodyContent, } from './utils';
|
|
36
|
+
// Hint Explanation Utilities
|
|
37
|
+
export { generateDetailedExplanation, getHintActionSummary } from './utils';
|
|
38
|
+
export { getLocalizedHintText } from './utils';
|
|
36
39
|
// Hooks
|
|
37
40
|
export {
|
|
38
41
|
// Levels
|
|
@@ -58,7 +61,12 @@ useLocalStorage,
|
|
|
58
61
|
// Hint
|
|
59
62
|
useHint,
|
|
60
63
|
// Game play (current game management)
|
|
61
|
-
useGamePlay,
|
|
64
|
+
useGamePlay,
|
|
65
|
+
// Board entry
|
|
66
|
+
useBoardEntry,
|
|
67
|
+
// Game session
|
|
68
|
+
useGameSession, } from './hooks';
|
|
62
69
|
// Stores
|
|
63
70
|
export { useGamePlayStore } from './stores/gamePlayStore';
|
|
71
|
+
export { DEFAULT_AUTH_PROVIDERS } from './config';
|
|
64
72
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAchD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAiBjB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI7E,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAIjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAIjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAI/C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAUjE,kCAAkC;AAClC,OAAO;AACL,kBAAkB;AAClB,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,gBAAgB;AAChB,uBAAuB;AACvB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,qBAAqB;AACrB,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAIjB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,sBAAsB,GACvB,MAAM,SAAS,CAAC;AAEjB,yBAAyB;AACzB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AAEjB,sBAAsB;AACtB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,QAAQ;AACR,OAAO;AACL,SAAS;AACT,QAAQ,EACR,SAAS;AACT,aAAa;AACb,YAAY,EACZ,aAAa;AACb,WAAW;AACX,WAAW,EACX,eAAe;AACf,gBAAgB;AAChB,OAAO;AACP,kCAAkC;AAClC,SAAS;AACT,WAAW;AACX,eAAe;AACf,kDAAkD;AAClD,YAAY,EACZ,YAAY;AACZ,aAAa;AACb,YAAY;AACZ,mBAAmB;AACnB,kBAAkB,EAClB,WAAW;AACX,gBAAgB;AAChB,eAAe;AACf,OAAO;AACP,OAAO;AACP,sCAAsC;AACtC,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate detailed hint explanations based on the hint payload
|
|
3
|
+
* Similar to tutorial explanations but for live hints
|
|
4
|
+
*
|
|
5
|
+
* Each explanation is designed to teach the user WHY the technique works,
|
|
6
|
+
* not just WHAT to do.
|
|
7
|
+
*/
|
|
8
|
+
import type { SolverHintStep } from '@sudobility/sudojo_types';
|
|
9
|
+
/**
|
|
10
|
+
* Generate detailed explanation for a hint
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateDetailedExplanation(hint: SolverHintStep): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get a summary of the hint action (what to do)
|
|
15
|
+
*/
|
|
16
|
+
export declare function getHintActionSummary(hint: SolverHintStep): string;
|
|
17
|
+
//# sourceMappingURL=hintExplanation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hintExplanation.d.ts","sourceRoot":"","sources":["../../src/utils/hintExplanation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmM/E;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAkFxE;AAqzBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAsBjE"}
|