@sudobility/sudojo_client 0.0.80 → 0.0.82

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 (45) hide show
  1. package/dist/errors/hint-access-denied.d.ts.map +1 -1
  2. package/dist/errors/hint-access-denied.js.map +1 -1
  3. package/dist/hooks/index.d.ts +1 -0
  4. package/dist/hooks/index.d.ts.map +1 -1
  5. package/dist/hooks/index.js +1 -0
  6. package/dist/hooks/index.js.map +1 -1
  7. package/dist/hooks/query-config.d.ts.map +1 -1
  8. package/dist/hooks/query-config.js.map +1 -1
  9. package/dist/hooks/query-keys.d.ts.map +1 -1
  10. package/dist/hooks/query-keys.js.map +1 -1
  11. package/dist/hooks/use-sudojo-boards.d.ts.map +1 -1
  12. package/dist/hooks/use-sudojo-boards.js.map +1 -1
  13. package/dist/hooks/use-sudojo-challenges.d.ts.map +1 -1
  14. package/dist/hooks/use-sudojo-challenges.js.map +1 -1
  15. package/dist/hooks/use-sudojo-dailies.d.ts.map +1 -1
  16. package/dist/hooks/use-sudojo-dailies.js.map +1 -1
  17. package/dist/hooks/use-sudojo-gamification.d.ts.map +1 -1
  18. package/dist/hooks/use-sudojo-gamification.js.map +1 -1
  19. package/dist/hooks/use-sudojo-health.d.ts.map +1 -1
  20. package/dist/hooks/use-sudojo-health.js.map +1 -1
  21. package/dist/hooks/use-sudojo-invalidation.d.ts +13 -0
  22. package/dist/hooks/use-sudojo-invalidation.d.ts.map +1 -0
  23. package/dist/hooks/use-sudojo-invalidation.js +69 -0
  24. package/dist/hooks/use-sudojo-invalidation.js.map +1 -0
  25. package/dist/hooks/use-sudojo-learning.d.ts.map +1 -1
  26. package/dist/hooks/use-sudojo-learning.js.map +1 -1
  27. package/dist/hooks/use-sudojo-levels.d.ts.map +1 -1
  28. package/dist/hooks/use-sudojo-levels.js.map +1 -1
  29. package/dist/hooks/use-sudojo-practices.d.ts.map +1 -1
  30. package/dist/hooks/use-sudojo-practices.js.map +1 -1
  31. package/dist/hooks/use-sudojo-techniques.d.ts.map +1 -1
  32. package/dist/hooks/use-sudojo-techniques.js.map +1 -1
  33. package/dist/hooks/use-sudojo-users.d.ts.map +1 -1
  34. package/dist/hooks/use-sudojo-users.js.map +1 -1
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/network/sudojo-client.d.ts.map +1 -1
  40. package/dist/network/sudojo-client.js.map +1 -1
  41. package/dist/solver/hooks/query-config.d.ts.map +1 -1
  42. package/dist/solver/hooks/query-config.js.map +1 -1
  43. package/dist/solver/hooks/query-keys.d.ts.map +1 -1
  44. package/dist/solver/hooks/query-keys.js.map +1 -1
  45. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"hint-access-denied.d.ts","sourceRoot":"","sources":["../../src/errors/hint-access-denied.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,qBAAqB,IAAI,yBAAyB,EAClD,mBAAmB,EACnB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;gBAE5B,IAAI,EAAE,yBAAyB;IAW3C,MAAM,CAAC,uBAAuB,CAC5B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB;CAGlC"}
1
+ {"version":3,"file":"hint-access-denied.d.ts","sourceRoot":"","sources":["../../src/errors/hint-access-denied.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EACV,qBAAqB,IAAI,yBAAyB,EAClD,mBAAmB,EACnB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AASlC,qBAAa,qBAAsB,SAAQ,KAAK;IAE9C,QAAQ,CAAC,IAAI,EAAG,oBAAoB,CAAU;IAG9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAG3B,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAG9C,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;gBAO5B,IAAI,EAAE,yBAAyB;IAiB3C,MAAM,CAAC,uBAAuB,CAC5B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB;CAGlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hint-access-denied.js","sourceRoot":"","sources":["../../src/errors/hint-access-denied.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAM9C,YAAY,IAA+B;QACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QANb,SAAI,GAAG,oBAA6B,CAAC;QAO5C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;IAKD,MAAM,CAAC,uBAAuB,CAC5B,KAAc;QAEd,OAAO,KAAK,YAAY,qBAAqB,CAAC;IAChD,CAAC;CACF","sourcesContent":["/**\n * Error thrown when hint access is denied due to subscription tier\n */\n\nimport type {\n HintAccessDeniedError as HintAccessDeniedErrorData,\n HintAccessUserState,\n HintEntitlement,\n} from \"@sudobility/sudojo_types\";\n\nexport class HintAccessDeniedError extends Error {\n readonly code = \"HINT_ACCESS_DENIED\" as const;\n readonly hintLevel: number;\n readonly requiredEntitlement: HintEntitlement;\n readonly userState: HintAccessUserState;\n\n constructor(data: HintAccessDeniedErrorData) {\n super(data.message);\n this.name = \"HintAccessDeniedError\";\n this.hintLevel = data.hintLevel;\n this.requiredEntitlement = data.requiredEntitlement;\n this.userState = data.userState;\n }\n\n /**\n * Check if an error is a HintAccessDeniedError\n */\n static isHintAccessDeniedError(\n error: unknown,\n ): error is HintAccessDeniedError {\n return error instanceof HintAccessDeniedError;\n }\n}\n"]}
1
+ {"version":3,"file":"hint-access-denied.js","sourceRoot":"","sources":["../../src/errors/hint-access-denied.ts"],"names":[],"mappings":"AA8CA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAkB9C,YAAY,IAA+B;QACzC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAjBb,SAAI,GAAG,oBAA6B,CAAC;QAkB5C,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;IAWD,MAAM,CAAC,uBAAuB,CAC5B,KAAc;QAEd,OAAO,KAAK,YAAY,qBAAqB,CAAC;IAChD,CAAC;CACF","sourcesContent":["/**\n * Custom error for hint access denial due to subscription tier restrictions.\n *\n * ## When This Error Is Thrown\n *\n * The Sudojo solver API returns HTTP 402 (Payment Required) when a user\n * requests hints that require a higher subscription tier than they have.\n * The `SudojoClient.solverSolve()` method catches this response and throws\n * a `HintAccessDeniedError` with structured data about the denial.\n *\n * ## Error Properties\n *\n * - `code` - Always `\"HINT_ACCESS_DENIED\"` for programmatic identification\n * - `hintLevel` - The numeric hint level that was requested\n * - `requiredEntitlement` - The subscription tier needed to access this hint\n * - `userState` - The user's current subscription state\n *\n * ## Handling This Error\n *\n * ```typescript\n * try {\n * const hints = await client.solverSolve(token, options);\n * } catch (error) {\n * if (HintAccessDeniedError.isHintAccessDeniedError(error)) {\n * // Show paywall or upgrade prompt\n * showUpgradeDialog(error.requiredEntitlement);\n * }\n * }\n * ```\n *\n * @module\n */\n\nimport type {\n HintAccessDeniedError as HintAccessDeniedErrorData,\n HintAccessUserState,\n HintEntitlement,\n} from \"@sudobility/sudojo_types\";\n\n/**\n * Error thrown when hint access is denied due to the user's subscription tier.\n *\n * This is the only custom error class in the library. All other API errors\n * (network failures, 401/403, 500s, validation errors) are thrown as generic\n * `Error` instances with descriptive messages.\n */\nexport class HintAccessDeniedError extends Error {\n /** Constant error code for programmatic identification. */\n readonly code = \"HINT_ACCESS_DENIED\" as const;\n\n /** The hint level that was requested but denied. */\n readonly hintLevel: number;\n\n /** The subscription tier required to access the requested hint level. */\n readonly requiredEntitlement: HintEntitlement;\n\n /** The user's current subscription state at the time of the request. */\n readonly userState: HintAccessUserState;\n\n /**\n * Create a HintAccessDeniedError from the API error response data.\n *\n * @param data - The structured error data from the API's 402 response\n */\n constructor(data: HintAccessDeniedErrorData) {\n super(data.message);\n this.name = \"HintAccessDeniedError\";\n this.hintLevel = data.hintLevel;\n this.requiredEntitlement = data.requiredEntitlement;\n this.userState = data.userState;\n }\n\n /**\n * Type guard to check if an unknown error is a HintAccessDeniedError.\n *\n * Prefer this over `instanceof` checks when the error may come from\n * a different module bundling context.\n *\n * @param error - The error to check\n * @returns True if the error is a HintAccessDeniedError\n */\n static isHintAccessDeniedError(\n error: unknown,\n ): error is HintAccessDeniedError {\n return error instanceof HintAccessDeniedError;\n }\n}\n"]}
@@ -11,4 +11,5 @@ export { useSudojoChallenge, useSudojoChallenges, useSudojoCreateChallenge, useS
11
11
  export { useSudojoUser, useSudojoUserSubscription } from "./use-sudojo-users";
12
12
  export { useSudojoCreatePractice, useSudojoDeleteAllPractices, useSudojoPracticeCounts, useSudojoRandomPractice, } from "./use-sudojo-practices";
13
13
  export { useSudojoBadgeDefinitions, useSudojoGamificationStats, useSudojoPlayFinish, useSudojoPlayStart, useSudojoPointHistory, } from "./use-sudojo-gamification";
14
+ export { useSudojoInvalidation } from "./use-sudojo-invalidation";
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9E,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9E,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAMnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -10,4 +10,5 @@ export { useSudojoChallenge, useSudojoChallenges, useSudojoCreateChallenge, useS
10
10
  export { useSudojoUser, useSudojoUserSubscription } from "./use-sudojo-users";
11
11
  export { useSudojoCreatePractice, useSudojoDeleteAllPractices, useSudojoPracticeCounts, useSudojoRandomPractice, } from "./use-sudojo-practices";
12
12
  export { useSudojoBadgeDefinitions, useSudojoGamificationStats, useSudojoPlayFinish, useSudojoPlayStart, useSudojoPointHistory, } from "./use-sudojo-gamification";
13
+ export { useSudojoInvalidation } from "./use-sudojo-invalidation";
13
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9E,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Sudojo API hooks for React\n */\n\n// ============================================================================\n// Query utilities\n// ============================================================================\n\nexport { createQueryKey, getServiceKeys, queryKeys } from \"./query-keys\";\nexport type { QueryKey } from \"./query-keys\";\nexport { STALE_TIMES } from \"./query-config\";\n\n// ============================================================================\n// Health hook\n// ============================================================================\n\nexport { useSudojoHealth } from \"./use-sudojo-health\";\n\n// ============================================================================\n// Level hooks\n// ============================================================================\n\nexport {\n useSudojoCreateLevel,\n useSudojoDeleteLevel,\n useSudojoLevel,\n useSudojoLevels,\n useSudojoUpdateLevel,\n} from \"./use-sudojo-levels\";\n\n// ============================================================================\n// Technique hooks\n// ============================================================================\n\nexport {\n useSudojoCreateTechnique,\n useSudojoDeleteTechnique,\n useSudojoTechnique,\n useSudojoTechniques,\n useSudojoUpdateTechnique,\n} from \"./use-sudojo-techniques\";\n\n// ============================================================================\n// Learning hooks\n// ============================================================================\n\nexport {\n useSudojoCreateLearning,\n useSudojoDeleteLearning,\n useSudojoLearning,\n useSudojoLearningItem,\n useSudojoUpdateLearning,\n} from \"./use-sudojo-learning\";\n\n// ============================================================================\n// Board hooks\n// ============================================================================\n\nexport {\n useSudojoBoard,\n useSudojoBoards,\n useSudojoCreateBoard,\n useSudojoDeleteBoard,\n useSudojoRandomBoard,\n useSudojoUpdateBoard,\n} from \"./use-sudojo-boards\";\n\n// ============================================================================\n// Daily hooks\n// ============================================================================\n\nexport {\n useSudojoCreateDaily,\n useSudojoDailies,\n useSudojoDaily,\n useSudojoDailyByDate,\n useSudojoDeleteDaily,\n useSudojoRandomDaily,\n useSudojoTodayDaily,\n useSudojoUpdateDaily,\n} from \"./use-sudojo-dailies\";\n\n// ============================================================================\n// Challenge hooks\n// ============================================================================\n\nexport {\n useSudojoChallenge,\n useSudojoChallenges,\n useSudojoCreateChallenge,\n useSudojoDeleteChallenge,\n useSudojoRandomChallenge,\n useSudojoUpdateChallenge,\n} from \"./use-sudojo-challenges\";\n\n// ============================================================================\n// User hooks\n// ============================================================================\n\nexport { useSudojoUser, useSudojoUserSubscription } from \"./use-sudojo-users\";\n\n// ============================================================================\n// Practice hooks\n// ============================================================================\n\nexport {\n useSudojoCreatePractice,\n useSudojoDeleteAllPractices,\n useSudojoPracticeCounts,\n useSudojoRandomPractice,\n} from \"./use-sudojo-practices\";\n\n// ============================================================================\n// Gamification hooks (points, badges, levels, game sessions)\n// ============================================================================\n\nexport {\n useSudojoBadgeDefinitions,\n useSudojoGamificationStats,\n useSudojoPlayFinish,\n useSudojoPlayStart,\n useSudojoPointHistory,\n} from \"./use-sudojo-gamification\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAM/B,OAAO,EACL,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAM9E,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAMnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Sudojo API hooks for React\n */\n\n// ============================================================================\n// Query utilities\n// ============================================================================\n\nexport { createQueryKey, getServiceKeys, queryKeys } from \"./query-keys\";\nexport type { QueryKey } from \"./query-keys\";\nexport { STALE_TIMES } from \"./query-config\";\n\n// ============================================================================\n// Health hook\n// ============================================================================\n\nexport { useSudojoHealth } from \"./use-sudojo-health\";\n\n// ============================================================================\n// Level hooks\n// ============================================================================\n\nexport {\n useSudojoCreateLevel,\n useSudojoDeleteLevel,\n useSudojoLevel,\n useSudojoLevels,\n useSudojoUpdateLevel,\n} from \"./use-sudojo-levels\";\n\n// ============================================================================\n// Technique hooks\n// ============================================================================\n\nexport {\n useSudojoCreateTechnique,\n useSudojoDeleteTechnique,\n useSudojoTechnique,\n useSudojoTechniques,\n useSudojoUpdateTechnique,\n} from \"./use-sudojo-techniques\";\n\n// ============================================================================\n// Learning hooks\n// ============================================================================\n\nexport {\n useSudojoCreateLearning,\n useSudojoDeleteLearning,\n useSudojoLearning,\n useSudojoLearningItem,\n useSudojoUpdateLearning,\n} from \"./use-sudojo-learning\";\n\n// ============================================================================\n// Board hooks\n// ============================================================================\n\nexport {\n useSudojoBoard,\n useSudojoBoards,\n useSudojoCreateBoard,\n useSudojoDeleteBoard,\n useSudojoRandomBoard,\n useSudojoUpdateBoard,\n} from \"./use-sudojo-boards\";\n\n// ============================================================================\n// Daily hooks\n// ============================================================================\n\nexport {\n useSudojoCreateDaily,\n useSudojoDailies,\n useSudojoDaily,\n useSudojoDailyByDate,\n useSudojoDeleteDaily,\n useSudojoRandomDaily,\n useSudojoTodayDaily,\n useSudojoUpdateDaily,\n} from \"./use-sudojo-dailies\";\n\n// ============================================================================\n// Challenge hooks\n// ============================================================================\n\nexport {\n useSudojoChallenge,\n useSudojoChallenges,\n useSudojoCreateChallenge,\n useSudojoDeleteChallenge,\n useSudojoRandomChallenge,\n useSudojoUpdateChallenge,\n} from \"./use-sudojo-challenges\";\n\n// ============================================================================\n// User hooks\n// ============================================================================\n\nexport { useSudojoUser, useSudojoUserSubscription } from \"./use-sudojo-users\";\n\n// ============================================================================\n// Practice hooks\n// ============================================================================\n\nexport {\n useSudojoCreatePractice,\n useSudojoDeleteAllPractices,\n useSudojoPracticeCounts,\n useSudojoRandomPractice,\n} from \"./use-sudojo-practices\";\n\n// ============================================================================\n// Gamification hooks (points, badges, levels, game sessions)\n// ============================================================================\n\nexport {\n useSudojoBadgeDefinitions,\n useSudojoGamificationStats,\n useSudojoPlayFinish,\n useSudojoPlayStart,\n useSudojoPointHistory,\n} from \"./use-sudojo-gamification\";\n\n// ============================================================================\n// Invalidation utilities\n// ============================================================================\n\nexport { useSudojoInvalidation } from \"./use-sudojo-invalidation\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"query-config.d.ts","sourceRoot":"","sources":["../../src/hooks/query-config.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW;;;;;;;;;;CA2Bd,CAAC"}
1
+ {"version":3,"file":"query-config.d.ts","sourceRoot":"","sources":["../../src/hooks/query-config.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,WAAW;;;;;;;;;;CA2Bd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-config.js","sourceRoot":"","sources":["../../src/hooks/query-config.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,WAAW,GAAG;IAEzB,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAG5B,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAGtB,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAG1B,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAGxB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGtB,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGzB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGnB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;CACxB,CAAC","sourcesContent":["/**\n * Sudojo TanStack Query Configuration\n *\n * Provides stale time constants for Sudojo queries.\n */\n\n/**\n * Default stale times for different types of Sudojo queries\n */\nexport const STALE_TIMES = {\n // Health status - check frequently\n HEALTH_STATUS: 1 * 60 * 1000, // 1 minute\n\n // Levels - rarely change\n LEVELS: 10 * 60 * 1000, // 10 minutes\n\n // Techniques - rarely change\n TECHNIQUES: 10 * 60 * 1000, // 10 minutes\n\n // Learning content - rarely change\n LEARNING: 10 * 60 * 1000, // 10 minutes\n\n // Boards - stable once created\n BOARDS: 5 * 60 * 1000, // 5 minutes\n\n // Daily puzzles - changes once per day\n DAILIES: 5 * 60 * 1000, // 5 minutes\n\n // Challenges - stable once created\n CHALLENGES: 5 * 60 * 1000, // 5 minutes\n\n // User info - cache for a while (admin status rarely changes)\n USER: 5 * 60 * 1000, // 5 minutes\n\n // User subscription - cache for a short time\n USER_SUBSCRIPTION: 2 * 60 * 1000, // 2 minutes\n} as const;\n"]}
1
+ {"version":3,"file":"query-config.js","sourceRoot":"","sources":["../../src/hooks/query-config.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,WAAW,GAAG;IAEzB,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAG5B,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAGtB,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAG1B,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IAGxB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGrB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGtB,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGzB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAGnB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;CACxB,CAAC","sourcesContent":["/**\n * Sudojo TanStack Query Configuration\n *\n * Provides stale time constants for Sudojo queries. Stale time determines how\n * long cached data is considered fresh before TanStack Query will refetch it\n * in the background on the next access.\n *\n * ## Design Rationale\n *\n * Stale times are chosen based on how frequently each resource type changes:\n * - **Static reference data** (levels, techniques, learning): 10 minutes.\n * These are admin-managed and rarely change during a user session.\n * - **Content data** (boards, dailies, challenges): 5 minutes.\n * Stable once created but new content may be added by admins.\n * - **User-specific data** (user info, subscriptions): 2-5 minutes.\n * Subscription status may change via in-app purchase flows.\n * - **Volatile data** (health): 1 minute. Used for connectivity checks.\n *\n * Some hooks override these defaults (e.g., random endpoints use `staleTime: 0`\n * to always fetch fresh data, and `useSudojoRandomBoard` uses `Infinity` to\n * only refetch on explicit user action).\n */\n\n/**\n * Default stale times (in milliseconds) for different types of Sudojo queries.\n * These values are used as the `staleTime` option in TanStack Query hooks.\n */\nexport const STALE_TIMES = {\n /** Health check - short cache since it monitors server availability (1 min). */\n HEALTH_STATUS: 1 * 60 * 1000, // 1 minute\n\n /** Levels list - admin-managed reference data that rarely changes (10 min). */\n LEVELS: 10 * 60 * 1000, // 10 minutes\n\n /** Techniques list - admin-managed reference data that rarely changes (10 min). */\n TECHNIQUES: 10 * 60 * 1000, // 10 minutes\n\n /** Learning content - admin-managed educational content that rarely changes (10 min). */\n LEARNING: 10 * 60 * 1000, // 10 minutes\n\n /** Boards - stable once created; new boards may be added by admins (5 min). */\n BOARDS: 5 * 60 * 1000, // 5 minutes\n\n /** Daily puzzles - one new puzzle per day; moderate cache (5 min). */\n DAILIES: 5 * 60 * 1000, // 5 minutes\n\n /** Challenges - stable once created; new challenges may be added (5 min). */\n CHALLENGES: 5 * 60 * 1000, // 5 minutes\n\n /** User info - admin status rarely changes during a session (5 min). */\n USER: 5 * 60 * 1000, // 5 minutes\n\n /** User subscription - may change via in-app purchase; shorter cache (2 min). */\n USER_SUBSCRIPTION: 2 * 60 * 1000, // 2 minutes\n} as const;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"query-keys.d.ts","sourceRoot":"","sources":["../../src/hooks/query-keys.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,SAAS;;;;;gCASH,MAAM;wCAGE;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;wCAE5B,MAAM;sCAIR;YACnB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACpC;wBAFa,MAAM,GAAG,SAAS;4BACd,MAAM,GAAG,SAAS;;sCAEf,MAAM;oCAIR;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;yCAEvB;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;+BAEtC,MAAM;;;;qCAMA,MAAM;+BAEZ,MAAM;wCAGG;YACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACjC;oBAFS,MAAM,GAAG,SAAS;yBACb,MAAM,GAAG,SAAS;;6CAEL;YAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACjC;oBAFS,MAAM,GAAG,SAAS;yBACb,MAAM,GAAG,SAAS;;mCAEf,MAAM;gCAGT,MAAM;4CACM,MAAM;;6CAKL,MAAM;;;iDAQF;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;oBAAzB,MAAM;qBAAW,MAAM;;;CAG3D,CAAC;AAKX,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAC;AAK1C,eAAO,MAAM,cAAc,GACzB,SAAS,MAAM,EACf,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,KACrC,SAAS,OAAO,EAElB,CAAC;AAKF,eAAO,MAAM,cAAc,2BAE1B,CAAC"}
1
+ {"version":3,"file":"query-keys.d.ts","sourceRoot":"","sources":["../../src/hooks/query-keys.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,SAAS;;;;;gCAaH,MAAM;wCAIE;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;wCAG5B,MAAM;sCAKR;YACnB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACpC;wBAFa,MAAM,GAAG,SAAS;4BACd,MAAM,GAAG,SAAS;;sCAGf,MAAM;oCAKR;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;yCAGvB;YAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAAE;oBAApB,MAAM,GAAG,SAAS;;+BAGtC,MAAM;;;;qCAUA,MAAM;+BAGZ,MAAM;wCAIG;YACrB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACjC;oBAFS,MAAM,GAAG,SAAS;yBACb,MAAM,GAAG,SAAS;;6CAGL;YAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;SACjC;oBAFS,MAAM,GAAG,SAAS;yBACb,MAAM,GAAG,SAAS;;mCAGf,MAAM;gCAIT,MAAM;4CAEM,MAAM;;6CAOL,MAAM;;;iDAWF;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;oBAAzB,MAAM;qBAAW,MAAM;;;CAG3D,CAAC;AAMX,MAAM,MAAM,QAAQ,GAAG,SAAS,OAAO,EAAE,CAAC;AAgB1C,eAAO,MAAM,cAAc,GACzB,SAAS,MAAM,EACf,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,KACrC,SAAS,OAAO,EAElB,CAAC;AAcF,eAAO,MAAM,cAAc,2BAE1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../../src/hooks/query-keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Query Key Factory for Sudojo TanStack Query\n *\n * Provides type-safe, consistent query keys for Sudojo API endpoints.\n * Following TanStack Query best practices for key structure.\n */\n\nconst sudojoBase = () => [\"sudojo\"] as const;\n\nexport const queryKeys = {\n sudojo: {\n all: sudojoBase,\n\n // Health\n health: () => [...sudojoBase(), \"health\"] as const,\n\n // Levels\n levels: () => [...sudojoBase(), \"levels\"] as const,\n level: (level: number) => [...sudojoBase(), \"levels\", level] as const,\n\n // Techniques\n techniques: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"techniques\", filters] as const,\n technique: (technique: number) =>\n [...sudojoBase(), \"techniques\", technique] as const,\n\n // Learning\n learning: (filters?: {\n technique?: number | undefined;\n language_code?: string | undefined;\n }) => [...sudojoBase(), \"learning\", filters] as const,\n learningItem: (uuid: string) =>\n [...sudojoBase(), \"learning\", uuid] as const,\n\n // Boards\n boards: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"boards\", filters] as const,\n boardRandom: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"boards\", \"random\", filters] as const,\n board: (uuid: string) => [...sudojoBase(), \"boards\", uuid] as const,\n\n // Dailies\n dailies: () => [...sudojoBase(), \"dailies\"] as const,\n dailyRandom: () => [...sudojoBase(), \"dailies\", \"random\"] as const,\n dailyToday: () => [...sudojoBase(), \"dailies\", \"today\"] as const,\n dailyByDate: (date: string) =>\n [...sudojoBase(), \"dailies\", \"date\", date] as const,\n daily: (uuid: string) => [...sudojoBase(), \"dailies\", uuid] as const,\n\n // Challenges\n challenges: (filters?: {\n level?: number | undefined;\n difficulty?: string | undefined;\n }) => [...sudojoBase(), \"challenges\", filters] as const,\n challengeRandom: (filters?: {\n level?: number | undefined;\n difficulty?: string | undefined;\n }) => [...sudojoBase(), \"challenges\", \"random\", filters] as const,\n challenge: (uuid: string) => [...sudojoBase(), \"challenges\", uuid] as const,\n\n // Users\n user: (userId: string) => [...sudojoBase(), \"users\", userId] as const,\n userSubscription: (userId: string) =>\n [...sudojoBase(), \"users\", userId, \"subscription\"] as const,\n\n // Practices\n practiceCounts: () => [...sudojoBase(), \"practices\", \"counts\"] as const,\n practiceRandom: (technique: number) =>\n [...sudojoBase(), \"practices\", \"random\", technique] as const,\n\n // Gamification\n gamificationStats: () =>\n [...sudojoBase(), \"gamification\", \"stats\"] as const,\n gamificationBadges: () =>\n [...sudojoBase(), \"gamification\", \"badges\"] as const,\n gamificationHistory: (options?: { limit?: number; offset?: number }) =>\n [...sudojoBase(), \"gamification\", \"history\", options] as const,\n },\n} as const;\n\n/**\n * Utility type to extract query key from the factory\n */\nexport type QueryKey = readonly unknown[];\n\n/**\n * Helper function to create a query key for custom endpoints\n */\nexport const createQueryKey = (\n service: string,\n ...parts: (string | number | object)[]\n): readonly unknown[] => {\n return [service, ...parts] as const;\n};\n\n/**\n * Helper to get all keys for sudojo service (useful for invalidation)\n */\nexport const getServiceKeys = () => {\n return queryKeys.sudojo.all();\n};\n"]}
1
+ {"version":3,"file":"query-keys.js","sourceRoot":"","sources":["../../src/hooks/query-keys.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Query Key Factory for Sudojo TanStack Query\n *\n * Provides type-safe, consistent query keys for all Sudojo API endpoints.\n * Follows TanStack Query best practices for hierarchical key structure.\n *\n * ## Key Hierarchy\n *\n * All keys start with `[\"sudojo\"]` as the root, then branch by resource:\n * - `[\"sudojo\", \"levels\"]` - all levels\n * - `[\"sudojo\", \"levels\", 1]` - specific level\n * - `[\"sudojo\", \"boards\", { level: 3 }]` - boards filtered by level\n *\n * ## Invalidation Patterns\n *\n * Use the hierarchical structure for targeted invalidation:\n * - `queryKeys.sudojo.all()` invalidates ALL sudojo queries\n * - `queryKeys.sudojo.levels()` invalidates the levels list\n * - `queryKeys.sudojo.level(1)` invalidates only level 1\n *\n * For broader invalidation (e.g., all board queries including random):\n * ```ts\n * queryClient.invalidateQueries({ queryKey: [...queryKeys.sudojo.all(), \"boards\"] })\n * ```\n *\n * ## Filter Parameters\n *\n * Keys that accept filter objects (e.g., `boards`, `techniques`, `challenges`)\n * include the filter in the key so that different filter combinations produce\n * distinct cache entries.\n */\n\nconst sudojoBase = () => [\"sudojo\"] as const;\n\nexport const queryKeys = {\n sudojo: {\n /** Root key for all sudojo queries. Use for bulk invalidation. */\n all: sudojoBase,\n\n // Health\n /** Key for the server health check endpoint. */\n health: () => [...sudojoBase(), \"health\"] as const,\n\n // Levels\n /** Key for the levels list query. */\n levels: () => [...sudojoBase(), \"levels\"] as const,\n /** Key for a specific level query. @param level - Level number (1-12) */\n level: (level: number) => [...sudojoBase(), \"levels\", level] as const,\n\n // Techniques\n /** Key for the techniques list query, optionally filtered by level. */\n techniques: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"techniques\", filters] as const,\n /** Key for a specific technique query. @param technique - Technique number (>= 1) */\n technique: (technique: number) =>\n [...sudojoBase(), \"techniques\", technique] as const,\n\n // Learning\n /** Key for the learning entries list, optionally filtered by technique and/or language. */\n learning: (filters?: {\n technique?: number | undefined;\n language_code?: string | undefined;\n }) => [...sudojoBase(), \"learning\", filters] as const,\n /** Key for a specific learning item by UUID. */\n learningItem: (uuid: string) =>\n [...sudojoBase(), \"learning\", uuid] as const,\n\n // Boards\n /** Key for the boards list query, optionally filtered by level. */\n boards: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"boards\", filters] as const,\n /** Key for the random board query, optionally filtered by level. */\n boardRandom: (filters?: { level?: number | undefined }) =>\n [...sudojoBase(), \"boards\", \"random\", filters] as const,\n /** Key for a specific board by UUID. */\n board: (uuid: string) => [...sudojoBase(), \"boards\", uuid] as const,\n\n // Dailies\n /** Key for the dailies list query. */\n dailies: () => [...sudojoBase(), \"dailies\"] as const,\n /** Key for the random daily query. */\n dailyRandom: () => [...sudojoBase(), \"dailies\", \"random\"] as const,\n /** Key for today's daily puzzle query. */\n dailyToday: () => [...sudojoBase(), \"dailies\", \"today\"] as const,\n /** Key for a daily puzzle by date. @param date - Date string in YYYY-MM-DD format */\n dailyByDate: (date: string) =>\n [...sudojoBase(), \"dailies\", \"date\", date] as const,\n /** Key for a specific daily by UUID. */\n daily: (uuid: string) => [...sudojoBase(), \"dailies\", uuid] as const,\n\n // Challenges\n /** Key for the challenges list, optionally filtered by level and/or difficulty. */\n challenges: (filters?: {\n level?: number | undefined;\n difficulty?: string | undefined;\n }) => [...sudojoBase(), \"challenges\", filters] as const,\n /** Key for the random challenge query, optionally filtered. */\n challengeRandom: (filters?: {\n level?: number | undefined;\n difficulty?: string | undefined;\n }) => [...sudojoBase(), \"challenges\", \"random\", filters] as const,\n /** Key for a specific challenge by UUID. */\n challenge: (uuid: string) => [...sudojoBase(), \"challenges\", uuid] as const,\n\n // Users\n /** Key for a user info query. @param userId - Firebase UID */\n user: (userId: string) => [...sudojoBase(), \"users\", userId] as const,\n /** Key for a user's subscription status query. @param userId - Firebase UID */\n userSubscription: (userId: string) =>\n [...sudojoBase(), \"users\", userId, \"subscription\"] as const,\n\n // Practices\n /** Key for practice counts across all techniques. */\n practiceCounts: () => [...sudojoBase(), \"practices\", \"counts\"] as const,\n /** Key for a random practice for a specific technique. */\n practiceRandom: (technique: number) =>\n [...sudojoBase(), \"practices\", \"random\", technique] as const,\n\n // Gamification\n /** Key for the user's gamification stats (points, level, badges). */\n gamificationStats: () =>\n [...sudojoBase(), \"gamification\", \"stats\"] as const,\n /** Key for badge definitions (public, no auth required). */\n gamificationBadges: () =>\n [...sudojoBase(), \"gamification\", \"badges\"] as const,\n /** Key for point transaction history with optional pagination. */\n gamificationHistory: (options?: { limit?: number; offset?: number }) =>\n [...sudojoBase(), \"gamification\", \"history\", options] as const,\n },\n} as const;\n\n/**\n * Utility type to extract query key from the factory.\n * All query keys are readonly arrays of unknown values.\n */\nexport type QueryKey = readonly unknown[];\n\n/**\n * Helper function to create a query key for custom or ad-hoc endpoints\n * that are not covered by the standard `queryKeys` factory.\n *\n * @param service - The service name (e.g., \"sudojo\", \"solver\")\n * @param parts - Additional key segments (strings, numbers, or filter objects)\n * @returns A readonly query key tuple\n *\n * @example\n * ```ts\n * const key = createQueryKey(\"sudojo\", \"custom-endpoint\", { filter: \"value\" });\n * // => [\"sudojo\", \"custom-endpoint\", { filter: \"value\" }]\n * ```\n */\nexport const createQueryKey = (\n service: string,\n ...parts: (string | number | object)[]\n): readonly unknown[] => {\n return [service, ...parts] as const;\n};\n\n/**\n * Helper to get the root key for all sudojo service queries.\n * Useful for bulk invalidation of the entire sudojo cache.\n *\n * @returns The root query key `[\"sudojo\"]`\n *\n * @example\n * ```ts\n * // Invalidate all sudojo queries at once\n * queryClient.invalidateQueries({ queryKey: getServiceKeys() });\n * ```\n */\nexport const getServiceKeys = () => {\n return queryKeys.sudojo.all();\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-boards.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-boards.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,KAAK,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AASlC,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,gBAAgB,EAC9B,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EACtC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAqCtC,CAAC;AAMF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,gBAAgB,EAC9B,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CA0CpC,CAAC;AAMF,eAAO,MAAM,cAAc,GACzB,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAwB5C,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CA6B1D,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
1
+ {"version":3,"file":"use-sudojo-boards.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-boards.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,KAAK,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAqBlC,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,gBAAgB,EAC9B,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EACtC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAqCtC,CAAC;AAmBF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,gBAAgB,EAC9B,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CA0CpC,CAAC;AAiBF,eAAO,MAAM,cAAc,GACzB,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAWF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAwB5C,CAAC;AAWF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CA6B1D,CAAC;AAYF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-boards.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-boards.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for Sudojo boards endpoints\n */\n\nimport { useCallback, useMemo, useRef } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Board,\n BoardCreateRequest,\n BoardQueryParams,\n BoardUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to get all boards with optional filtering\n * Note: This is a public endpoint - token is optional\n */\nexport const useSudojoBoards = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: BoardQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Board[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Board[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n // Extract values for stable dependencies\n const level = queryParams?.level;\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board[]>> => {\n return client.getBoards(\n token,\n level !== undefined\n ? {\n level,\n symmetrical: undefined,\n limit: undefined,\n offset: undefined,\n techniques: undefined,\n technique_bit: undefined,\n }\n : undefined,\n );\n }, [client, token, level]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.boards({\n level: level ?? undefined,\n }),\n queryFn,\n staleTime: STALE_TIMES.BOARDS,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a random board with optional filtering\n * Note: This is a public endpoint - token is optional\n */\nexport const useSudojoRandomBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: BoardQueryParams,\n options?: Omit<UseQueryOptions<BaseResponse<Board>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Board>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n // Extract values for stable dependencies\n const level = queryParams?.level;\n\n // Use a ref for token so queryFn reference stays stable across token refreshes\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board>> => {\n return client.getRandomBoard(\n tokenRef.current,\n level !== undefined\n ? {\n level,\n symmetrical: undefined,\n limit: undefined,\n offset: undefined,\n techniques: undefined,\n technique_bit: undefined,\n }\n : undefined,\n );\n }, [client, level]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.boardRandom({\n level: level ?? undefined,\n }),\n queryFn,\n staleTime: Infinity, // Only refetch via explicit nextPuzzle() / refetch()\n refetchOnWindowFocus: false,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a specific board by UUID\n * Note: This is a public endpoint - token is optional\n */\nexport const useSudojoBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<UseQueryOptions<BaseResponse<Board>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Board>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board>> => {\n return client.getBoard(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.board(uuid),\n queryFn,\n staleTime: STALE_TIMES.BOARDS,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a board\n */\nexport const useSudojoCreateBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; data: BoardCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: BoardCreateRequest;\n }) => {\n return client.createBoard(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n },\n });\n};\n\n/**\n * Hook to update a board\n */\nexport const useSudojoUpdateBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; uuid: string; data: BoardUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: BoardUpdateRequest;\n }) => {\n return client.updateBoard(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.board(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a board\n */\nexport const useSudojoDeleteBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteBoard(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.board(variables.uuid),\n });\n },\n });\n};\n"]}
1
+ {"version":3,"file":"use-sudojo-boards.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-boards.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for Sudojo boards endpoints\n */\n\nimport { useCallback, useMemo, useRef } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Board,\n BoardCreateRequest,\n BoardQueryParams,\n BoardUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to fetch all Sudoku boards with optional filtering by level.\n *\n * Boards represent Sudoku puzzles with their original clues, solution, and\n * metadata. This is a public endpoint - token is accepted for consistency\n * but not required.\n *\n * Stale time: {@link STALE_TIMES.BOARDS} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param queryParams - Optional filter parameters (e.g., `{ level: 3 }`)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing an array of Board objects\n */\nexport const useSudojoBoards = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: BoardQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Board[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Board[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n // Extract values for stable dependencies\n const level = queryParams?.level;\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board[]>> => {\n return client.getBoards(\n token,\n level !== undefined\n ? {\n level,\n symmetrical: undefined,\n limit: undefined,\n offset: undefined,\n techniques: undefined,\n technique_bit: undefined,\n }\n : undefined,\n );\n }, [client, token, level]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.boards({\n level: level ?? undefined,\n }),\n queryFn,\n staleTime: STALE_TIMES.BOARDS,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a random Sudoku board, optionally filtered by level.\n *\n * Uses `staleTime: Infinity` so the puzzle is never automatically refetched.\n * To get a new random puzzle, call `refetch()` on the returned query result.\n * Also disables `refetchOnWindowFocus` to prevent unintended puzzle changes.\n *\n * Uses a ref for the token to keep the queryFn reference stable across\n * token refreshes, preventing unnecessary refetches.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param queryParams - Optional filter parameters (e.g., `{ level: 3 }`)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Board object. Call `refetch()` for a new puzzle.\n */\nexport const useSudojoRandomBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: BoardQueryParams,\n options?: Omit<UseQueryOptions<BaseResponse<Board>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Board>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n // Extract values for stable dependencies\n const level = queryParams?.level;\n\n // Use a ref for token so queryFn reference stays stable across token refreshes\n const tokenRef = useRef(token);\n tokenRef.current = token;\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board>> => {\n return client.getRandomBoard(\n tokenRef.current,\n level !== undefined\n ? {\n level,\n symmetrical: undefined,\n limit: undefined,\n offset: undefined,\n techniques: undefined,\n technique_bit: undefined,\n }\n : undefined,\n );\n }, [client, level]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.boardRandom({\n level: level ?? undefined,\n }),\n queryFn,\n staleTime: Infinity, // Only refetch via explicit nextPuzzle() / refetch()\n refetchOnWindowFocus: false,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a specific board by its UUID.\n *\n * The query is automatically disabled when no UUID is provided.\n * This is a public endpoint - token is accepted but not required.\n *\n * Stale time: {@link STALE_TIMES.BOARDS} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param uuid - Board UUID. Query is disabled if empty.\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Board object\n */\nexport const useSudojoBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<UseQueryOptions<BaseResponse<Board>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Board>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Board>> => {\n return client.getBoard(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.board(uuid),\n queryFn,\n staleTime: STALE_TIMES.BOARDS,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a new board. Requires admin authentication.\n *\n * On success, invalidates all board list queries (including random and filtered).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, data })` to execute.\n */\nexport const useSudojoCreateBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; data: BoardCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: BoardCreateRequest;\n }) => {\n return client.createBoard(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n },\n });\n};\n\n/**\n * Hook to update an existing board. Requires admin authentication.\n *\n * On success, invalidates all board list queries and the specific board query.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid, data })` to execute.\n */\nexport const useSudojoUpdateBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; uuid: string; data: BoardUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: BoardUpdateRequest;\n }) => {\n return client.updateBoard(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.board(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a board. Requires admin authentication.\n *\n * On success, invalidates all board list queries and removes the specific\n * board from the query cache entirely.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid })` to execute.\n */\nexport const useSudojoDeleteBoard = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Board>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteBoard(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"boards\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.board(variables.uuid),\n });\n },\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-challenges.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-challenges.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAQlC,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,oBAAoB,EAClC,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,EAC1C,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAuB1C,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,oBAAoB,EAClC,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EACxC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAuBxC,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EACxC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAqBxC,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAwBhD,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,CA6B9D,CAAC;AAKF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
1
+ {"version":3,"file":"use-sudojo-challenges.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-challenges.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAoBlC,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,oBAAoB,EAClC,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,EAC1C,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAuB1C,CAAC;AAcF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,cAAc,oBAAoB,EAClC,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EACxC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAuBxC,CAAC;AAgBF,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EACxC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC,CAqBxC,CAAC;AAWF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAwBhD,CAAC;AAWF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,CA6B9D,CAAC;AAYF,eAAO,MAAM,wBAAwB,GACnC,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,SAAS,CAAC,EACvB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-challenges.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-challenges.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,WAAW,EAEX,QAAQ,EACR,cAAc,GAGf,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKxD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,aAA4B,EAC5B,OAAe,EACf,KAAa,EACb,WAAkC,EAClC,OAGC,EAC0C,EAAE;IAC7C,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAwC,EAAE;QACzE,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClD,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAGjC,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;YACpC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,SAAS;YACtC,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,SAAS;SACjD,CAAC;QACF,OAAO;QACP,SAAS,EAAE,WAAW,CAAC,UAAU;QACjC,GAAG,OAAO;QACV,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,aAA4B,EAC5B,OAAe,EACf,KAAa,EACb,WAAkC,EAClC,OAGC,EACwC,EAAE;IAC3C,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAsC,EAAE;QACvE,OAAO,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAGjC,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1E,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;YACzC,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,SAAS;YACtC,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,SAAS;SACjD,CAAC;QACF,OAAO;QACP,SAAS,EAAE,CAAC;QACZ,GAAG,OAAO;QACV,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,aAA4B,EAC5B,OAAe,EACf,KAAa,EACb,IAAY,EACZ,OAGC,EACwC,EAAE;IAC3C,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAsC,EAAE;QACvE,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAG1B,MAAM,SAAS,GACb,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEtE,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1C,OAAO;QACP,SAAS,EAAE,WAAW,CAAC,UAAU;QACjC,GAAG,OAAO;QACV,OAAO,EAAE,SAAS;KACnB,CAAC,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,aAA4B,EAC5B,OAAe,EAKf,EAAE;IACF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IACF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,EACjB,KAAK,EACL,IAAI,GAIL,EAAE,EAAE;YACH,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,SAAS,EAAE,GAAG,EAAE;YACd,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,aAA4B,EAC5B,OAAe,EAKf,EAAE;IACF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IACF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,EACjB,KAAK,EACL,IAAI,EACJ,IAAI,GAKL,EAAE,EAAE;YACH,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;aACpD,CAAC,CAAC;YACH,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,aAA4B,EAC5B,OAAe,EAKf,EAAE;IACF,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IACF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,OAAO,WAAW,CAAC;QACjB,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAmC,EAAE,EAAE;YACrE,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC7C,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YAC9B,WAAW,CAAC,iBAAiB,CAAC;gBAC5B,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC;aACpD,CAAC,CAAC;YACH,WAAW,CAAC,aAAa,CAAC;gBACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/**\n * Hook for Sudojo challenges endpoints\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Challenge,\n ChallengeCreateRequest,\n ChallengeQueryParams,\n ChallengeUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to get all challenges with optional filtering\n */\nexport const useSudojoChallenges = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: ChallengeQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge[]>> => {\n return client.getChallenges(token, queryParams);\n }, [client, token, queryParams]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.challenges({\n level: queryParams?.level ?? undefined,\n difficulty: queryParams?.difficulty ?? undefined,\n }),\n queryFn,\n staleTime: STALE_TIMES.CHALLENGES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a random challenge with optional filtering\n */\nexport const useSudojoRandomChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: ChallengeQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge>> => {\n return client.getRandomChallenge(token, queryParams);\n }, [client, token, queryParams]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.challengeRandom({\n level: queryParams?.level ?? undefined,\n difficulty: queryParams?.difficulty ?? undefined,\n }),\n queryFn,\n staleTime: 0, // Always fetch fresh for random\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a specific challenge by UUID\n */\nexport const useSudojoChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge>> => {\n return client.getChallenge(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.challenge(uuid),\n queryFn,\n staleTime: STALE_TIMES.CHALLENGES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a challenge\n */\nexport const useSudojoCreateChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; data: ChallengeCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: ChallengeCreateRequest;\n }) => {\n return client.createChallenge(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n },\n });\n};\n\n/**\n * Hook to update a challenge\n */\nexport const useSudojoUpdateChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; uuid: string; data: ChallengeUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: ChallengeUpdateRequest;\n }) => {\n return client.updateChallenge(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.challenge(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a challenge\n */\nexport const useSudojoDeleteChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteChallenge(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.challenge(variables.uuid),\n });\n },\n });\n};\n"]}
1
+ {"version":3,"file":"use-sudojo-challenges.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-challenges.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for Sudojo challenges endpoints\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Challenge,\n ChallengeCreateRequest,\n ChallengeQueryParams,\n ChallengeUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to fetch all challenges, optionally filtered by level and/or difficulty.\n *\n * Challenges are curated Sudoku puzzles with specific difficulty ratings.\n * This is a public endpoint.\n *\n * Stale time: {@link STALE_TIMES.CHALLENGES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param queryParams - Optional filter parameters (e.g., `{ level: 1, difficulty: 5 }`)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing an array of Challenge objects\n */\nexport const useSudojoChallenges = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: ChallengeQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge[]>> => {\n return client.getChallenges(token, queryParams);\n }, [client, token, queryParams]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.challenges({\n level: queryParams?.level ?? undefined,\n difficulty: queryParams?.difficulty ?? undefined,\n }),\n queryFn,\n staleTime: STALE_TIMES.CHALLENGES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a random challenge, optionally filtered by level and/or difficulty.\n *\n * Uses `staleTime: 0` to always fetch a fresh random challenge.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param queryParams - Optional filter parameters\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Challenge object\n */\nexport const useSudojoRandomChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n queryParams?: ChallengeQueryParams,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge>> => {\n return client.getRandomChallenge(token, queryParams);\n }, [client, token, queryParams]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.challengeRandom({\n level: queryParams?.level ?? undefined,\n difficulty: queryParams?.difficulty ?? undefined,\n }),\n queryFn,\n staleTime: 0, // Always fetch fresh for random\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a specific challenge by its UUID.\n *\n * The query is automatically disabled when no UUID is provided.\n *\n * Stale time: {@link STALE_TIMES.CHALLENGES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param uuid - Challenge UUID. Query is disabled if empty.\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Challenge object\n */\nexport const useSudojoChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<Challenge>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Challenge>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Challenge>> => {\n return client.getChallenge(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.challenge(uuid),\n queryFn,\n staleTime: STALE_TIMES.CHALLENGES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a new challenge. Requires admin authentication.\n *\n * On success, invalidates all challenge list queries.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, data })` to execute.\n */\nexport const useSudojoCreateChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; data: ChallengeCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: ChallengeCreateRequest;\n }) => {\n return client.createChallenge(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n },\n });\n};\n\n/**\n * Hook to update an existing challenge. Requires admin authentication.\n *\n * On success, invalidates all challenge list queries and the specific challenge query.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid, data })` to execute.\n */\nexport const useSudojoUpdateChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; uuid: string; data: ChallengeUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: ChallengeUpdateRequest;\n }) => {\n return client.updateChallenge(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.challenge(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a challenge. Requires admin authentication.\n *\n * On success, invalidates all challenge list queries and removes the specific\n * challenge from the query cache.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid })` to execute.\n */\nexport const useSudojoDeleteChallenge = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Challenge>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteChallenge(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"challenges\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.challenge(variables.uuid),\n });\n },\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-dailies.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-dailies.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,KAAK,EACL,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAQlC,eAAO,MAAM,gBAAgB,GAC3B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EACtC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAoBtC,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAoBpC,CAAC;AAKF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAoBpC,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAKF,eAAO,MAAM,cAAc,GACzB,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAwB5C,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CA6B1D,CAAC;AAKF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
1
+ {"version":3,"file":"use-sudojo-dailies.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-dailies.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,KAAK,EACL,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAkBlC,eAAO,MAAM,gBAAgB,GAC3B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,EACtC,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAoBtC,CAAC;AAaF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAoBpC,CAAC;AAgBF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAoBpC,CAAC;AAiBF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAgBF,eAAO,MAAM,cAAc,GACzB,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,UAAU,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,KAC3E,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAqBpC,CAAC;AAWF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAwB5C,CAAC;AAWF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CA6B1D,CAAC;AAYF,eAAO,MAAM,oBAAoB,GAC/B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,KAAK,CAAC,EACnB,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-dailies.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-dailies.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for Sudojo dailies endpoints\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Daily,\n DailyCreateRequest,\n DailyUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to get all dailies\n */\nexport const useSudojoDailies = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<Daily[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Daily[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily[]>> => {\n return client.getDailies(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailies(),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a random daily\n */\nexport const useSudojoRandomDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getRandomDaily(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyRandom(),\n queryFn,\n staleTime: 0, // Always fetch fresh for random\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get today's daily puzzle\n */\nexport const useSudojoTodayDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getTodayDaily(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyToday(),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get daily puzzle by date\n */\nexport const useSudojoDailyByDate = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n date: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getDailyByDate(token, date);\n }, [client, token, date]);\n\n // Public endpoint - no token required, but date is required\n const isEnabled =\n !!date && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyByDate(date),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get a specific daily by UUID\n */\nexport const useSudojoDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getDaily(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.daily(uuid),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a daily puzzle\n */\nexport const useSudojoCreateDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; data: DailyCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: DailyCreateRequest;\n }) => {\n return client.createDaily(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n },\n });\n};\n\n/**\n * Hook to update a daily puzzle\n */\nexport const useSudojoUpdateDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; uuid: string; data: DailyUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: DailyUpdateRequest;\n }) => {\n return client.updateDaily(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.daily(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a daily puzzle\n */\nexport const useSudojoDeleteDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteDaily(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.daily(variables.uuid),\n });\n },\n });\n};\n"]}
1
+ {"version":3,"file":"use-sudojo-dailies.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-dailies.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hook for Sudojo dailies endpoints\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BaseResponse,\n Daily,\n DailyCreateRequest,\n DailyUpdateRequest,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to fetch all daily puzzles.\n *\n * Daily puzzles are boards assigned to specific dates. This is a public endpoint.\n *\n * Stale time: {@link STALE_TIMES.DAILIES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing an array of Daily objects\n */\nexport const useSudojoDailies = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<Daily[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<Daily[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily[]>> => {\n return client.getDailies(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailies(),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a random daily puzzle.\n *\n * Uses `staleTime: 0` to always fetch a fresh random daily on each access.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Daily object\n */\nexport const useSudojoRandomDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getRandomDaily(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyRandom(),\n queryFn,\n staleTime: 0, // Always fetch fresh for random\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch today's daily puzzle.\n *\n * The server determines \"today\" based on its timezone configuration.\n * This is the primary hook for showing the daily puzzle to users.\n *\n * Stale time: {@link STALE_TIMES.DAILIES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing today's Daily object\n */\nexport const useSudojoTodayDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getTodayDaily(token);\n }, [client, token]);\n\n // Public endpoint - no token required\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyToday(),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a daily puzzle for a specific date.\n *\n * The query is automatically disabled when no date is provided.\n * Date must be in YYYY-MM-DD format (validated by the SudojoClient).\n *\n * Stale time: {@link STALE_TIMES.DAILIES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param date - Date string in YYYY-MM-DD format. Query is disabled if empty.\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing the Daily object for the given date\n */\nexport const useSudojoDailyByDate = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n date: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getDailyByDate(token, date);\n }, [client, token, date]);\n\n // Public endpoint - no token required, but date is required\n const isEnabled =\n !!date && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.dailyByDate(date),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch a specific daily puzzle by its UUID.\n *\n * The query is automatically disabled when no UUID is provided.\n *\n * Stale time: {@link STALE_TIMES.DAILIES} (5 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (optional for this public endpoint)\n * @param uuid - Daily UUID. Query is disabled if empty.\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing a single Daily object\n */\nexport const useSudojoDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n uuid: string,\n options?: Omit<UseQueryOptions<BaseResponse<Daily>>, \"queryKey\" | \"queryFn\">,\n): UseQueryResult<BaseResponse<Daily>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<BaseResponse<Daily>> => {\n return client.getDaily(token, uuid);\n }, [client, token, uuid]);\n\n // Public endpoint - no token required, but uuid is required\n const isEnabled =\n !!uuid && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.daily(uuid),\n queryFn,\n staleTime: STALE_TIMES.DAILIES,\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to create a new daily puzzle. Requires admin authentication.\n *\n * On success, invalidates all daily list queries so the UI reflects the new daily.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, data })` to execute.\n */\nexport const useSudojoCreateDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; data: DailyCreateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: DailyCreateRequest;\n }) => {\n return client.createDaily(token, data);\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n },\n });\n};\n\n/**\n * Hook to update an existing daily puzzle. Requires admin authentication.\n *\n * On success, invalidates all daily list queries and the specific daily query.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid, data })` to execute.\n */\nexport const useSudojoUpdateDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; uuid: string; data: DailyUpdateRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n uuid,\n data,\n }: {\n token: string;\n uuid: string;\n data: DailyUpdateRequest;\n }) => {\n return client.updateDaily(token, uuid, data);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.daily(variables.uuid),\n });\n },\n });\n};\n\n/**\n * Hook to delete a daily puzzle. Requires admin authentication.\n *\n * On success, invalidates all daily list queries and removes the specific\n * daily from the query cache.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, uuid })` to execute.\n */\nexport const useSudojoDeleteDaily = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<Daily>,\n Error,\n { token: string; uuid: string }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ token, uuid }: { token: string; uuid: string }) => {\n return client.deleteDaily(token, uuid);\n },\n onSuccess: (_data, variables) => {\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"dailies\"],\n });\n queryClient.removeQueries({\n queryKey: queryKeys.sudojo.daily(variables.uuid),\n });\n },\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-gamification.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-gamification.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAYlC,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,iBAAiB,CAAC,EAC/B,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAkB1C,CAAC;AAKF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,kBAAkB,CAAC,EAChC,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CA4B3C,CAAC;AASF,eAAO,MAAM,0BAA0B,GACrC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,EAChD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAsBhD,CAAC;AAKF,eAAO,MAAM,yBAAyB,GACpC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,EAChD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAqBhD,CAAC;AAKF,eAAO,MAAM,qBAAqB,GAChC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,iBAAiB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC,EACjD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAgCjD,CAAC"}
1
+ {"version":3,"file":"use-sudojo-gamification.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-gamification.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,iBAAiB,EAGjB,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAyBlC,eAAO,MAAM,kBAAkB,GAC7B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,iBAAiB,CAAC,EAC/B,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAkB1C,CAAC;AAaF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,aAAa,EAC5B,SAAS,MAAM,KACd,iBAAiB,CAClB,YAAY,CAAC,kBAAkB,CAAC,EAChC,KAAK,EACL;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,CA4B3C,CAAC;AAqBF,eAAO,MAAM,0BAA0B,GACrC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,EAChD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAsBhD,CAAC;AAeF,eAAO,MAAM,yBAAyB,GACpC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,EAChD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC,CAqBhD,CAAC;AAeF,eAAO,MAAM,qBAAqB,GAChC,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,OAAO,MAAM,EACb,iBAAiB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACpD,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAAC,EACjD,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC,CAgCjD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-gamification.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-gamification.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hooks for Sudojo gamification endpoints\n * Points, badges, levels, and game sessions\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BadgeDefinition,\n BaseResponse,\n GameFinishRequest,\n GameFinishResponse,\n GameStartRequest,\n GameStartResponse,\n GamificationStats,\n PointTransaction,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n// =============================================================================\n// Game Session Hooks\n// =============================================================================\n\n/**\n * Hook to start a new game session\n */\nexport const useSudojoPlayStart = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<GameStartResponse>,\n Error,\n { token: string; data: GameStartRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: GameStartRequest;\n }) => {\n return client.playStart(token, data);\n },\n });\n};\n\n/**\n * Hook to finish a game session and get rewards\n */\nexport const useSudojoPlayFinish = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<GameFinishResponse>,\n Error,\n { token: string; data: GameFinishRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: GameFinishRequest;\n }) => {\n return client.playFinish(token, data);\n },\n onSuccess: () => {\n // Invalidate gamification stats and history\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.gamificationStats(),\n });\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"gamification\", \"history\"],\n });\n },\n });\n};\n\n// =============================================================================\n// Gamification Stats Hooks\n// =============================================================================\n\n/**\n * Hook to get user's gamification stats (points, level, badges)\n */\nexport const useSudojoGamificationStats = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<GamificationStats>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<GamificationStats>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<GamificationStats>\n > => {\n return client.getGamificationStats(token);\n }, [client, token]);\n\n const isEnabled =\n !!token && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationStats(),\n queryFn,\n staleTime: STALE_TIMES.USER_SUBSCRIPTION, // 2 minutes\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get all badge definitions (public endpoint)\n */\nexport const useSudojoBadgeDefinitions = (\n networkClient: NetworkClient,\n baseUrl: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<BadgeDefinition[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<BadgeDefinition[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<BadgeDefinition[]>\n > => {\n return client.getBadgeDefinitions();\n }, [client]);\n\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationBadges(),\n queryFn,\n staleTime: STALE_TIMES.LEVELS, // 10 minutes - badges rarely change\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to get user's point transaction history\n */\nexport const useSudojoPointHistory = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n historyOptions?: { limit?: number; offset?: number },\n options?: Omit<\n UseQueryOptions<BaseResponse<PointTransaction[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<PointTransaction[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const limit = historyOptions?.limit;\n const offset = historyOptions?.offset;\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<PointTransaction[]>\n > => {\n const opts: { limit?: number; offset?: number } = {};\n if (limit !== undefined) opts.limit = limit;\n if (offset !== undefined) opts.offset = offset;\n return client.getPointHistory(token, opts);\n }, [client, token, limit, offset]);\n\n const isEnabled =\n !!token && (options?.enabled !== undefined ? options.enabled : true);\n\n const historyKeyOpts: { limit?: number; offset?: number } = {};\n if (limit !== undefined) historyKeyOpts.limit = limit;\n if (offset !== undefined) historyKeyOpts.offset = offset;\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationHistory(historyKeyOpts),\n queryFn,\n staleTime: 0, // Always fresh\n ...options,\n enabled: isEnabled,\n });\n};\n"]}
1
+ {"version":3,"file":"use-sudojo-gamification.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-gamification.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hooks for Sudojo gamification endpoints\n * Points, badges, levels, and game sessions\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useMutation,\n UseMutationResult,\n useQuery,\n useQueryClient,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type {\n BadgeDefinition,\n BaseResponse,\n GameFinishRequest,\n GameFinishResponse,\n GameStartRequest,\n GameStartResponse,\n GamificationStats,\n PointTransaction,\n} from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n// =============================================================================\n// Game Session Hooks\n// =============================================================================\n\n/**\n * Hook to start a new game session. Requires authentication.\n *\n * Call this when a user begins playing a puzzle. Returns a session ID\n * that must be passed to `useSudojoPlayFinish` when the game ends.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, data })` to execute.\n *\n * @example\n * ```tsx\n * const playStart = useSudojoPlayStart(networkClient, baseUrl);\n * playStart.mutate({ token, data: { board_uuid: \"...\", mode: \"play\" } });\n * ```\n */\nexport const useSudojoPlayStart = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<GameStartResponse>,\n Error,\n { token: string; data: GameStartRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: GameStartRequest;\n }) => {\n return client.playStart(token, data);\n },\n });\n};\n\n/**\n * Hook to finish a game session and receive rewards. Requires authentication.\n *\n * Call this when a user completes or abandons a puzzle. Returns earned points,\n * new badges, and updated gamification stats. On success, automatically\n * invalidates gamification stats and point history queries.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @returns A UseMutationResult. Call `mutate({ token, data })` to execute.\n */\nexport const useSudojoPlayFinish = (\n networkClient: NetworkClient,\n baseUrl: string,\n): UseMutationResult<\n BaseResponse<GameFinishResponse>,\n Error,\n { token: string; data: GameFinishRequest }\n> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n token,\n data,\n }: {\n token: string;\n data: GameFinishRequest;\n }) => {\n return client.playFinish(token, data);\n },\n onSuccess: () => {\n // Invalidate gamification stats and history\n queryClient.invalidateQueries({\n queryKey: queryKeys.sudojo.gamificationStats(),\n });\n queryClient.invalidateQueries({\n queryKey: [...queryKeys.sudojo.all(), \"gamification\", \"history\"],\n });\n },\n });\n};\n\n// =============================================================================\n// Gamification Stats Hooks\n// =============================================================================\n\n/**\n * Hook to fetch the user's gamification stats (total points, level, earned badges).\n *\n * Requires authentication. The query is automatically disabled when no token\n * is provided. Uses the subscription stale time (2 min) since stats change\n * after game sessions.\n *\n * Stale time: {@link STALE_TIMES.USER_SUBSCRIPTION} (2 minutes).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (required). Query is disabled if empty.\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing the GamificationStats\n */\nexport const useSudojoGamificationStats = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<GamificationStats>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<GamificationStats>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<GamificationStats>\n > => {\n return client.getGamificationStats(token);\n }, [client, token]);\n\n const isEnabled =\n !!token && (options?.enabled !== undefined ? options.enabled : true);\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationStats(),\n queryFn,\n staleTime: STALE_TIMES.USER_SUBSCRIPTION, // 2 minutes\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch all badge definitions. **Public endpoint** - no auth required.\n *\n * Badge definitions describe the available badges, their icons, descriptions,\n * and unlock criteria. Does not require a token parameter at all.\n *\n * Stale time: {@link STALE_TIMES.LEVELS} (10 minutes) since badge definitions rarely change.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing an array of BadgeDefinition objects\n */\nexport const useSudojoBadgeDefinitions = (\n networkClient: NetworkClient,\n baseUrl: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<BadgeDefinition[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<BadgeDefinition[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<BadgeDefinition[]>\n > => {\n return client.getBadgeDefinitions();\n }, [client]);\n\n const isEnabled = options?.enabled !== undefined ? options.enabled : true;\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationBadges(),\n queryFn,\n staleTime: STALE_TIMES.LEVELS, // 10 minutes - badges rarely change\n ...options,\n enabled: isEnabled,\n });\n};\n\n/**\n * Hook to fetch the user's point transaction history with optional pagination.\n *\n * Requires authentication. Uses `staleTime: 0` to always fetch fresh history\n * since it changes after every game session.\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API\n * @param token - Firebase access token (required). Query is disabled if empty.\n * @param historyOptions - Pagination options (`{ limit?: number; offset?: number }`)\n * @param options - Additional TanStack Query options\n * @returns A UseQueryResult containing an array of PointTransaction objects\n */\nexport const useSudojoPointHistory = (\n networkClient: NetworkClient,\n baseUrl: string,\n token: string,\n historyOptions?: { limit?: number; offset?: number },\n options?: Omit<\n UseQueryOptions<BaseResponse<PointTransaction[]>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<PointTransaction[]>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const limit = historyOptions?.limit;\n const offset = historyOptions?.offset;\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<PointTransaction[]>\n > => {\n const opts: { limit?: number; offset?: number } = {};\n if (limit !== undefined) opts.limit = limit;\n if (offset !== undefined) opts.offset = offset;\n return client.getPointHistory(token, opts);\n }, [client, token, limit, offset]);\n\n const isEnabled =\n !!token && (options?.enabled !== undefined ? options.enabled : true);\n\n const historyKeyOpts: { limit?: number; offset?: number } = {};\n if (limit !== undefined) historyKeyOpts.limit = limit;\n if (offset !== undefined) historyKeyOpts.offset = offset;\n\n return useQuery({\n queryKey: queryKeys.sudojo.gamificationHistory(historyKeyOpts),\n queryFn,\n staleTime: 0, // Always fresh\n ...options,\n enabled: isEnabled,\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-health.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-health.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAY9E,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAC9C,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,eAAe,CAAC,CAkB9C,CAAC"}
1
+ {"version":3,"file":"use-sudojo-health.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-health.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,eAAe,EACf,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AA0B9E,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,EAC5B,SAAS,MAAM,EACf,UAAU,IAAI,CACZ,eAAe,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,EAC9C,UAAU,GAAG,SAAS,CACvB,KACA,cAAc,CAAC,YAAY,CAAC,eAAe,CAAC,CAkB9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-sudojo-health.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-health.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AASxD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,aAA4B,EAC5B,OAAe,EACf,OAGC,EAC8C,EAAE;IACjD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAE/B,EAAE;QACF,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,OAAO;QACP,SAAS,EAAE,WAAW,CAAC,aAAa;QACpC,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/**\n * Hook for Sudojo health check endpoint\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useQuery,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type { BaseResponse, HealthCheckData } from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to get Sudojo server health status\n *\n * @param networkClient - Network client for API calls\n * @param config - Sudojo configuration\n * @param options - React Query options\n */\nexport const useSudojoHealth = (\n networkClient: NetworkClient,\n baseUrl: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<HealthCheckData>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<HealthCheckData>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<HealthCheckData>\n > => {\n return client.getHealth();\n }, [client]);\n\n return useQuery({\n queryKey: queryKeys.sudojo.health(),\n queryFn,\n staleTime: STALE_TIMES.HEALTH_STATUS,\n ...options,\n });\n};\n"]}
1
+ {"version":3,"file":"use-sudojo-health.js","sourceRoot":"","sources":["../../src/hooks/use-sudojo-health.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,QAAQ,GAGT,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAuBxD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,aAA4B,EAC5B,OAAe,EACf,OAGC,EAC8C,EAAE;IACjD,MAAM,MAAM,GAAG,OAAO,CACpB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,EAC9C,CAAC,aAAa,EAAE,OAAO,CAAC,CACzB,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAE/B,EAAE;QACF,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,QAAQ,CAAC;QACd,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,OAAO;QACP,SAAS,EAAE,WAAW,CAAC,aAAa;QACpC,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/**\n * Hook for Sudojo health check endpoint\n */\n\nimport { useCallback, useMemo } from \"react\";\nimport {\n useQuery,\n UseQueryOptions,\n UseQueryResult,\n} from \"@tanstack/react-query\";\nimport type { NetworkClient } from \"@sudobility/types\";\nimport type { BaseResponse, HealthCheckData } from \"@sudobility/sudojo_types\";\nimport { queryKeys } from \"./query-keys\";\nimport { STALE_TIMES } from \"./query-config\";\nimport { SudojoClient } from \"../network/sudojo-client\";\n\n/**\n * Hook to check the Sudojo API server health status.\n *\n * Returns server name, version, and status. Useful for displaying connection\n * indicators or diagnosing connectivity issues. This is a public endpoint\n * that does not require authentication.\n *\n * Stale time: {@link STALE_TIMES.HEALTH_STATUS} (1 minute).\n *\n * @param networkClient - Network client for making HTTP requests\n * @param baseUrl - Base URL of the Sudojo API (e.g., \"https://api.sudojo.com\")\n * @param options - Additional TanStack Query options (excluding queryKey and queryFn)\n * @returns A UseQueryResult containing the health check data with loading/error states\n *\n * @example\n * ```tsx\n * const { data, isLoading, isError } = useSudojoHealth(networkClient, baseUrl);\n * if (isError) return <Text>Server unreachable</Text>;\n * if (data?.data?.status === \"ok\") return <Text>Connected</Text>;\n * ```\n */\nexport const useSudojoHealth = (\n networkClient: NetworkClient,\n baseUrl: string,\n options?: Omit<\n UseQueryOptions<BaseResponse<HealthCheckData>>,\n \"queryKey\" | \"queryFn\"\n >,\n): UseQueryResult<BaseResponse<HealthCheckData>> => {\n const client = useMemo(\n () => new SudojoClient(networkClient, baseUrl),\n [networkClient, baseUrl],\n );\n\n const queryFn = useCallback(async (): Promise<\n BaseResponse<HealthCheckData>\n > => {\n return client.getHealth();\n }, [client]);\n\n return useQuery({\n queryKey: queryKeys.sudojo.health(),\n queryFn,\n staleTime: STALE_TIMES.HEALTH_STATUS,\n ...options,\n });\n};\n"]}
@@ -0,0 +1,13 @@
1
+ export declare const useSudojoInvalidation: () => {
2
+ invalidateAll: () => Promise<void>;
3
+ invalidateLevels: () => Promise<void>;
4
+ invalidateTechniques: () => Promise<void>;
5
+ invalidateLearning: () => Promise<void>;
6
+ invalidateBoards: () => Promise<void>;
7
+ invalidateDailies: () => Promise<void>;
8
+ invalidateChallenges: () => Promise<void>;
9
+ invalidateUsers: () => Promise<void>;
10
+ invalidatePractices: () => Promise<void>;
11
+ invalidateGamification: () => Promise<void>;
12
+ };
13
+ //# sourceMappingURL=use-sudojo-invalidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sudojo-invalidation.d.ts","sourceRoot":"","sources":["../../src/hooks/use-sudojo-invalidation.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAqFjC,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { useCallback } from "react";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { queryKeys } from "./query-keys";
4
+ export const useSudojoInvalidation = () => {
5
+ const queryClient = useQueryClient();
6
+ const invalidateAll = useCallback(() => {
7
+ return queryClient.invalidateQueries({
8
+ queryKey: queryKeys.sudojo.all(),
9
+ });
10
+ }, [queryClient]);
11
+ const invalidateLevels = useCallback(() => {
12
+ return queryClient.invalidateQueries({
13
+ queryKey: [...queryKeys.sudojo.all(), "levels"],
14
+ });
15
+ }, [queryClient]);
16
+ const invalidateTechniques = useCallback(() => {
17
+ return queryClient.invalidateQueries({
18
+ queryKey: [...queryKeys.sudojo.all(), "techniques"],
19
+ });
20
+ }, [queryClient]);
21
+ const invalidateLearning = useCallback(() => {
22
+ return queryClient.invalidateQueries({
23
+ queryKey: [...queryKeys.sudojo.all(), "learning"],
24
+ });
25
+ }, [queryClient]);
26
+ const invalidateBoards = useCallback(() => {
27
+ return queryClient.invalidateQueries({
28
+ queryKey: [...queryKeys.sudojo.all(), "boards"],
29
+ });
30
+ }, [queryClient]);
31
+ const invalidateDailies = useCallback(() => {
32
+ return queryClient.invalidateQueries({
33
+ queryKey: [...queryKeys.sudojo.all(), "dailies"],
34
+ });
35
+ }, [queryClient]);
36
+ const invalidateChallenges = useCallback(() => {
37
+ return queryClient.invalidateQueries({
38
+ queryKey: [...queryKeys.sudojo.all(), "challenges"],
39
+ });
40
+ }, [queryClient]);
41
+ const invalidateUsers = useCallback(() => {
42
+ return queryClient.invalidateQueries({
43
+ queryKey: [...queryKeys.sudojo.all(), "users"],
44
+ });
45
+ }, [queryClient]);
46
+ const invalidatePractices = useCallback(() => {
47
+ return queryClient.invalidateQueries({
48
+ queryKey: [...queryKeys.sudojo.all(), "practices"],
49
+ });
50
+ }, [queryClient]);
51
+ const invalidateGamification = useCallback(() => {
52
+ return queryClient.invalidateQueries({
53
+ queryKey: [...queryKeys.sudojo.all(), "gamification"],
54
+ });
55
+ }, [queryClient]);
56
+ return {
57
+ invalidateAll,
58
+ invalidateLevels,
59
+ invalidateTechniques,
60
+ invalidateLearning,
61
+ invalidateBoards,
62
+ invalidateDailies,
63
+ invalidateChallenges,
64
+ invalidateUsers,
65
+ invalidatePractices,
66
+ invalidateGamification,
67
+ };
68
+ };
69
+ //# sourceMappingURL=use-sudojo-invalidation.js.map