@growsober/sdk 1.0.0

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 (129) hide show
  1. package/README.md +276 -0
  2. package/dist/__tests__/e2e.test.d.ts +7 -0
  3. package/dist/__tests__/e2e.test.js +472 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.js +61 -0
  6. package/dist/api/mutations/admin.d.ts +167 -0
  7. package/dist/api/mutations/admin.js +326 -0
  8. package/dist/api/mutations/ambassadors.d.ts +52 -0
  9. package/dist/api/mutations/ambassadors.js +148 -0
  10. package/dist/api/mutations/auth.d.ts +267 -0
  11. package/dist/api/mutations/auth.js +332 -0
  12. package/dist/api/mutations/bookings.d.ts +59 -0
  13. package/dist/api/mutations/bookings.js +143 -0
  14. package/dist/api/mutations/event-chat.d.ts +35 -0
  15. package/dist/api/mutations/event-chat.js +147 -0
  16. package/dist/api/mutations/events.d.ts +87 -0
  17. package/dist/api/mutations/events.js +205 -0
  18. package/dist/api/mutations/grow90.d.ts +36 -0
  19. package/dist/api/mutations/grow90.js +132 -0
  20. package/dist/api/mutations/hubs.d.ts +111 -0
  21. package/dist/api/mutations/hubs.js +240 -0
  22. package/dist/api/mutations/index.d.ts +22 -0
  23. package/dist/api/mutations/index.js +39 -0
  24. package/dist/api/mutations/jack.d.ts +61 -0
  25. package/dist/api/mutations/jack.js +104 -0
  26. package/dist/api/mutations/library.d.ts +67 -0
  27. package/dist/api/mutations/library.js +168 -0
  28. package/dist/api/mutations/map.d.ts +153 -0
  29. package/dist/api/mutations/map.js +181 -0
  30. package/dist/api/mutations/matching.d.ts +130 -0
  31. package/dist/api/mutations/matching.js +204 -0
  32. package/dist/api/mutations/notifications.d.ts +63 -0
  33. package/dist/api/mutations/notifications.js +106 -0
  34. package/dist/api/mutations/offers.d.ts +26 -0
  35. package/dist/api/mutations/offers.js +47 -0
  36. package/dist/api/mutations/subscriptions.d.ts +127 -0
  37. package/dist/api/mutations/subscriptions.js +140 -0
  38. package/dist/api/mutations/support.d.ts +165 -0
  39. package/dist/api/mutations/support.js +307 -0
  40. package/dist/api/mutations/users.d.ts +211 -0
  41. package/dist/api/mutations/users.js +261 -0
  42. package/dist/api/queries/admin.d.ts +257 -0
  43. package/dist/api/queries/admin.js +320 -0
  44. package/dist/api/queries/ambassadors.d.ts +53 -0
  45. package/dist/api/queries/ambassadors.js +98 -0
  46. package/dist/api/queries/auth.d.ts +16 -0
  47. package/dist/api/queries/auth.js +25 -0
  48. package/dist/api/queries/bookings.d.ts +91 -0
  49. package/dist/api/queries/bookings.js +102 -0
  50. package/dist/api/queries/businesses.d.ts +212 -0
  51. package/dist/api/queries/businesses.js +154 -0
  52. package/dist/api/queries/event-chat.d.ts +19 -0
  53. package/dist/api/queries/event-chat.js +75 -0
  54. package/dist/api/queries/events.d.ts +322 -0
  55. package/dist/api/queries/events.js +221 -0
  56. package/dist/api/queries/grow90.d.ts +26 -0
  57. package/dist/api/queries/grow90.js +85 -0
  58. package/dist/api/queries/hubs.d.ts +165 -0
  59. package/dist/api/queries/hubs.js +143 -0
  60. package/dist/api/queries/index.d.ts +23 -0
  61. package/dist/api/queries/index.js +40 -0
  62. package/dist/api/queries/jack.d.ts +63 -0
  63. package/dist/api/queries/jack.js +92 -0
  64. package/dist/api/queries/library.d.ts +132 -0
  65. package/dist/api/queries/library.js +120 -0
  66. package/dist/api/queries/map.d.ts +216 -0
  67. package/dist/api/queries/map.js +278 -0
  68. package/dist/api/queries/matching.d.ts +136 -0
  69. package/dist/api/queries/matching.js +161 -0
  70. package/dist/api/queries/notifications.d.ts +78 -0
  71. package/dist/api/queries/notifications.js +88 -0
  72. package/dist/api/queries/offers.d.ts +91 -0
  73. package/dist/api/queries/offers.js +103 -0
  74. package/dist/api/queries/subscriptions.d.ts +56 -0
  75. package/dist/api/queries/subscriptions.js +73 -0
  76. package/dist/api/queries/support.d.ts +106 -0
  77. package/dist/api/queries/support.js +202 -0
  78. package/dist/api/queries/users.d.ts +293 -0
  79. package/dist/api/queries/users.js +370 -0
  80. package/dist/api/types.d.ts +464 -0
  81. package/dist/api/types.js +9 -0
  82. package/dist/hooks/useAuth.d.ts +5 -0
  83. package/dist/hooks/useAuth.js +39 -0
  84. package/dist/hooks/useUser.d.ts +43 -0
  85. package/dist/hooks/useUser.js +44 -0
  86. package/dist/index.d.ts +36 -0
  87. package/dist/index.js +67 -0
  88. package/package.json +62 -0
  89. package/src/__tests__/e2e.test.ts +502 -0
  90. package/src/api/client.ts +71 -0
  91. package/src/api/mutations/admin.ts +531 -0
  92. package/src/api/mutations/ambassadors.ts +185 -0
  93. package/src/api/mutations/auth.ts +350 -0
  94. package/src/api/mutations/bookings.ts +190 -0
  95. package/src/api/mutations/event-chat.ts +177 -0
  96. package/src/api/mutations/events.ts +273 -0
  97. package/src/api/mutations/grow90.ts +169 -0
  98. package/src/api/mutations/hubs.ts +385 -0
  99. package/src/api/mutations/index.ts +23 -0
  100. package/src/api/mutations/jack.ts +130 -0
  101. package/src/api/mutations/library.ts +212 -0
  102. package/src/api/mutations/map.ts +230 -0
  103. package/src/api/mutations/matching.ts +271 -0
  104. package/src/api/mutations/notifications.ts +114 -0
  105. package/src/api/mutations/offers.ts +73 -0
  106. package/src/api/mutations/subscriptions.ts +162 -0
  107. package/src/api/mutations/support.ts +390 -0
  108. package/src/api/mutations/users.ts +271 -0
  109. package/src/api/queries/admin.ts +480 -0
  110. package/src/api/queries/ambassadors.ts +139 -0
  111. package/src/api/queries/auth.ts +24 -0
  112. package/src/api/queries/bookings.ts +135 -0
  113. package/src/api/queries/businesses.ts +203 -0
  114. package/src/api/queries/event-chat.ts +78 -0
  115. package/src/api/queries/events.ts +272 -0
  116. package/src/api/queries/grow90.ts +98 -0
  117. package/src/api/queries/hubs.ts +211 -0
  118. package/src/api/queries/index.ts +24 -0
  119. package/src/api/queries/jack.ts +127 -0
  120. package/src/api/queries/library.ts +166 -0
  121. package/src/api/queries/map.ts +331 -0
  122. package/src/api/queries/matching.ts +238 -0
  123. package/src/api/queries/notifications.ts +103 -0
  124. package/src/api/queries/offers.ts +136 -0
  125. package/src/api/queries/subscriptions.ts +91 -0
  126. package/src/api/queries/support.ts +235 -0
  127. package/src/api/queries/users.ts +393 -0
  128. package/src/api/types.ts +596 -0
  129. package/src/index.ts +57 -0
@@ -0,0 +1,78 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { NotificationResponse } from '../types';
3
+ export declare const notificationKeys: {
4
+ all: readonly ["notifications"];
5
+ list: () => readonly ["notifications", "list"];
6
+ unreadCount: () => readonly ["notifications", "unread-count"];
7
+ detail: (id: string) => readonly ["notifications", string];
8
+ };
9
+ export interface UnreadCount {
10
+ count: number;
11
+ }
12
+ /**
13
+ * Get user's notifications
14
+ *
15
+ * @param options - TanStack Query options
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * const { data: notifications, isLoading } = useNotifications();
20
+ * ```
21
+ */
22
+ export declare function useNotifications(options?: Omit<UseQueryOptions<NotificationResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
23
+ id: string;
24
+ userId: string;
25
+ type: "EVENT_REMINDER" | "EVENT_CANCELLED" | "EVENT_UPDATED" | "NEW_EVENT" | "HUB_WELCOME" | "NEW_MEMBER" | "STREAK_MILESTONE" | "DAILY_REMINDER" | "JACK_RESPONSE" | "WEEKLY_REFLECTION" | "BADGE_EARNED" | "SYSTEM_UPDATE";
26
+ title: string;
27
+ body?: Record<string, never>;
28
+ data?: Record<string, never>;
29
+ imageUrl?: Record<string, never>;
30
+ channel: "APP" | "EMAIL" | "PUSH" | "SMS" | "WHATSAPP";
31
+ isRead: boolean;
32
+ sentAt?: Record<string, never>;
33
+ readAt?: Record<string, never>;
34
+ actionUrl?: Record<string, never>;
35
+ deliveryStatus: "PENDING" | "SENT" | "DELIVERED" | "FAILED";
36
+ errorMessage?: Record<string, never>;
37
+ createdAt: string;
38
+ }[], Error>;
39
+ /**
40
+ * Get unread notification count
41
+ *
42
+ * @param options - TanStack Query options
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * const { data } = useUnreadNotificationCount();
47
+ * console.log(`You have ${data?.count} unread notifications`);
48
+ * ```
49
+ */
50
+ export declare function useUnreadNotificationCount(options?: Omit<UseQueryOptions<UnreadCount>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<UnreadCount, Error>;
51
+ /**
52
+ * Get a specific notification by ID
53
+ *
54
+ * @param id - Notification ID
55
+ * @param options - TanStack Query options
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * const { data: notification, isLoading } = useNotification('notification-123');
60
+ * ```
61
+ */
62
+ export declare function useNotification(id: string, options?: Omit<UseQueryOptions<NotificationResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
63
+ id: string;
64
+ userId: string;
65
+ type: "EVENT_REMINDER" | "EVENT_CANCELLED" | "EVENT_UPDATED" | "NEW_EVENT" | "HUB_WELCOME" | "NEW_MEMBER" | "STREAK_MILESTONE" | "DAILY_REMINDER" | "JACK_RESPONSE" | "WEEKLY_REFLECTION" | "BADGE_EARNED" | "SYSTEM_UPDATE";
66
+ title: string;
67
+ body?: Record<string, never>;
68
+ data?: Record<string, never>;
69
+ imageUrl?: Record<string, never>;
70
+ channel: "APP" | "EMAIL" | "PUSH" | "SMS" | "WHATSAPP";
71
+ isRead: boolean;
72
+ sentAt?: Record<string, never>;
73
+ readAt?: Record<string, never>;
74
+ actionUrl?: Record<string, never>;
75
+ deliveryStatus: "PENDING" | "SENT" | "DELIVERED" | "FAILED";
76
+ errorMessage?: Record<string, never>;
77
+ createdAt: string;
78
+ }, Error>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.notificationKeys = void 0;
4
+ exports.useNotifications = useNotifications;
5
+ exports.useUnreadNotificationCount = useUnreadNotificationCount;
6
+ exports.useNotification = useNotification;
7
+ const react_query_1 = require("@tanstack/react-query");
8
+ const client_1 = require("../client");
9
+ // ============================================================================
10
+ // QUERY KEY FACTORY
11
+ // ============================================================================
12
+ exports.notificationKeys = {
13
+ all: ['notifications'],
14
+ list: () => [...exports.notificationKeys.all, 'list'],
15
+ unreadCount: () => [...exports.notificationKeys.all, 'unread-count'],
16
+ detail: (id) => [...exports.notificationKeys.all, id],
17
+ };
18
+ // ============================================================================
19
+ // QUERY HOOKS
20
+ // ============================================================================
21
+ /**
22
+ * Get user's notifications
23
+ *
24
+ * @param options - TanStack Query options
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * const { data: notifications, isLoading } = useNotifications();
29
+ * ```
30
+ */
31
+ function useNotifications(options) {
32
+ return (0, react_query_1.useQuery)({
33
+ queryKey: exports.notificationKeys.list(),
34
+ queryFn: async () => {
35
+ const client = (0, client_1.getApiClient)();
36
+ const response = await client.get('/api/v1/notifications');
37
+ return response.data;
38
+ },
39
+ ...options,
40
+ });
41
+ }
42
+ /**
43
+ * Get unread notification count
44
+ *
45
+ * @param options - TanStack Query options
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const { data } = useUnreadNotificationCount();
50
+ * console.log(`You have ${data?.count} unread notifications`);
51
+ * ```
52
+ */
53
+ function useUnreadNotificationCount(options) {
54
+ return (0, react_query_1.useQuery)({
55
+ queryKey: exports.notificationKeys.unreadCount(),
56
+ queryFn: async () => {
57
+ const client = (0, client_1.getApiClient)();
58
+ const response = await client.get('/api/v1/notifications/unread-count');
59
+ return response.data;
60
+ },
61
+ refetchInterval: 30000, // Refetch every 30 seconds
62
+ ...options,
63
+ });
64
+ }
65
+ /**
66
+ * Get a specific notification by ID
67
+ *
68
+ * @param id - Notification ID
69
+ * @param options - TanStack Query options
70
+ *
71
+ * @example
72
+ * ```tsx
73
+ * const { data: notification, isLoading } = useNotification('notification-123');
74
+ * ```
75
+ */
76
+ function useNotification(id, options) {
77
+ return (0, react_query_1.useQuery)({
78
+ queryKey: exports.notificationKeys.detail(id),
79
+ queryFn: async () => {
80
+ const client = (0, client_1.getApiClient)();
81
+ const response = await client.get(`/api/v1/notifications/${id}`);
82
+ return response.data;
83
+ },
84
+ enabled: !!id,
85
+ ...options,
86
+ });
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9ub3RpZmljYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFDQSw0Q0FZQztBQWFELGdFQWFDO0FBYUQsMENBY0M7QUF0R0QsdURBQWtFO0FBQ2xFLHNDQUF5QztBQUd6QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUVsRSxRQUFBLGdCQUFnQixHQUFHO0lBQzlCLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBVTtJQUMvQixJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLHdCQUFnQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQVU7SUFDdEQsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyx3QkFBZ0IsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFVO0lBQ3JFLE1BQU0sRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLHdCQUFnQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQVU7Q0FDL0QsQ0FBQztBQVVGLCtFQUErRTtBQUMvRSxjQUFjO0FBQ2QsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQUErRTtJQUUvRSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSx3QkFBZ0IsQ0FBQyxJQUFJLEVBQUU7UUFDakMsT0FBTyxFQUFFLEtBQUssSUFBcUMsRUFBRTtZQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUMzRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLE9BQW9FO0lBRXBFLE9BQU8sSUFBQSxzQkFBUSxFQUFDO1FBQ2QsUUFBUSxFQUFFLHdCQUFnQixDQUFDLFdBQVcsRUFBRTtRQUN4QyxPQUFPLEVBQUUsS0FBSyxJQUEwQixFQUFFO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ3hFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsZUFBZSxFQUFFLEtBQUssRUFBRSwyQkFBMkI7UUFDbkQsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixlQUFlLENBQzdCLEVBQVUsRUFDVixPQUE2RTtJQUU3RSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSx3QkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sRUFBRSxLQUFLLElBQW1DLEVBQUU7WUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ2IsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgTm90aWZpY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWSBGQUNUT1JZXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBub3RpZmljYXRpb25LZXlzID0ge1xuICBhbGw6IFsnbm90aWZpY2F0aW9ucyddIGFzIGNvbnN0LFxuICBsaXN0OiAoKSA9PiBbLi4ubm90aWZpY2F0aW9uS2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIHVucmVhZENvdW50OiAoKSA9PiBbLi4ubm90aWZpY2F0aW9uS2V5cy5hbGwsICd1bnJlYWQtY291bnQnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLm5vdGlmaWNhdGlvbktleXMuYWxsLCBpZF0gYXMgY29uc3QsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFVucmVhZENvdW50IHtcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUVVFUlkgSE9PS1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZXQgdXNlcidzIG5vdGlmaWNhdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGE6IG5vdGlmaWNhdGlvbnMsIGlzTG9hZGluZyB9ID0gdXNlTm90aWZpY2F0aW9ucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VOb3RpZmljYXRpb25zKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Tm90aWZpY2F0aW9uUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogbm90aWZpY2F0aW9uS2V5cy5saXN0KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVzcG9uc2VbXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvbm90aWZpY2F0aW9ucycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdW5yZWFkIG5vdGlmaWNhdGlvbiBjb3VudFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSB9ID0gdXNlVW5yZWFkTm90aWZpY2F0aW9uQ291bnQoKTtcbiAqIGNvbnNvbGUubG9nKGBZb3UgaGF2ZSAke2RhdGE/LmNvdW50fSB1bnJlYWQgbm90aWZpY2F0aW9uc2ApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VVbnJlYWROb3RpZmljYXRpb25Db3VudChcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFVucmVhZENvdW50PiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBub3RpZmljYXRpb25LZXlzLnVucmVhZENvdW50KCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8VW5yZWFkQ291bnQ+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvdW5yZWFkLWNvdW50Jyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIHJlZmV0Y2hJbnRlcnZhbDogMzAwMDAsIC8vIFJlZmV0Y2ggZXZlcnkgMzAgc2Vjb25kc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhIHNwZWNpZmljIG5vdGlmaWNhdGlvbiBieSBJRFxuICpcbiAqIEBwYXJhbSBpZCAtIE5vdGlmaWNhdGlvbiBJRFxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBub3RpZmljYXRpb24sIGlzTG9hZGluZyB9ID0gdXNlTm90aWZpY2F0aW9uKCdub3RpZmljYXRpb24tMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5vdGlmaWNhdGlvbihcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPE5vdGlmaWNhdGlvblJlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBub3RpZmljYXRpb25LZXlzLmRldGFpbChpZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Tm90aWZpY2F0aW9uUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL25vdGlmaWNhdGlvbnMvJHtpZH1gKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFpZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,91 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { OfferResponse } from '../types';
3
+ export declare const offerKeys: {
4
+ all: readonly ["offers"];
5
+ lists: () => readonly ["offers", "list"];
6
+ list: (filters?: OfferFilters) => readonly ["offers", "list", OfferFilters | undefined];
7
+ details: () => readonly ["offers", "detail"];
8
+ detail: (id: string) => readonly ["offers", "detail", string];
9
+ canRedeem: (id: string) => readonly ["offers", "detail", string, "can-redeem"];
10
+ };
11
+ export interface OfferFilters {
12
+ page?: number;
13
+ limit?: number;
14
+ businessId?: string;
15
+ isActive?: boolean;
16
+ }
17
+ export interface PaginatedOffersResponse {
18
+ offers: OfferResponse[];
19
+ total: number;
20
+ page: number;
21
+ limit: number;
22
+ totalPages: number;
23
+ }
24
+ export interface CanRedeemOfferResponse {
25
+ canRedeem: boolean;
26
+ reason?: string;
27
+ }
28
+ /**
29
+ * Get paginated list of offers with optional filters
30
+ *
31
+ * @param filters - Query parameters for filtering and pagination
32
+ * @param options - TanStack Query options
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const { data, isLoading } = useOffers({
37
+ * page: 1,
38
+ * limit: 20,
39
+ * businessId: 'business-123',
40
+ * isActive: true
41
+ * });
42
+ * ```
43
+ */
44
+ export declare function useOffers(filters?: OfferFilters, options?: Omit<UseQueryOptions<PaginatedOffersResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedOffersResponse, Error>;
45
+ /**
46
+ * Get a single offer by ID
47
+ *
48
+ * @param id - Offer ID
49
+ * @param options - TanStack Query options
50
+ *
51
+ * @example
52
+ * ```tsx
53
+ * const { data, isLoading } = useOffer('offer-123');
54
+ * ```
55
+ */
56
+ export declare function useOffer(id: string, options?: Omit<UseQueryOptions<OfferResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
57
+ id: string;
58
+ businessId: string;
59
+ title: string;
60
+ description?: Record<string, never>;
61
+ discountType?: "PERCENTAGE" | "FIXED_AMOUNT" | "FREE_ITEM" | "BOGO";
62
+ discountValue?: Record<string, never>;
63
+ discountCode?: Record<string, never>;
64
+ validFrom: string;
65
+ validTo?: Record<string, never>;
66
+ terms?: Record<string, never>;
67
+ maxRedemptions?: Record<string, never>;
68
+ redemptionCount: number;
69
+ perUserLimit?: Record<string, never>;
70
+ premiumOnly: boolean;
71
+ isActive: boolean;
72
+ createdAt: string;
73
+ updatedAt: string;
74
+ }, Error>;
75
+ /**
76
+ * Check if a user can redeem a specific offer
77
+ *
78
+ * @param id - Offer ID
79
+ * @param options - TanStack Query options
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * const { data, isLoading } = useCanRedeemOffer('offer-123');
84
+ * if (data?.canRedeem) {
85
+ * // User can redeem the offer
86
+ * } else {
87
+ * console.log('Cannot redeem:', data?.reason);
88
+ * }
89
+ * ```
90
+ */
91
+ export declare function useCanRedeemOffer(id: string, options?: Omit<UseQueryOptions<CanRedeemOfferResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<CanRedeemOfferResponse, Error>;
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.offerKeys = void 0;
4
+ exports.useOffers = useOffers;
5
+ exports.useOffer = useOffer;
6
+ exports.useCanRedeemOffer = useCanRedeemOffer;
7
+ const react_query_1 = require("@tanstack/react-query");
8
+ const client_1 = require("../client");
9
+ // ============================================================================
10
+ // QUERY KEY FACTORY
11
+ // ============================================================================
12
+ exports.offerKeys = {
13
+ all: ['offers'],
14
+ lists: () => [...exports.offerKeys.all, 'list'],
15
+ list: (filters) => [...exports.offerKeys.lists(), filters],
16
+ details: () => [...exports.offerKeys.all, 'detail'],
17
+ detail: (id) => [...exports.offerKeys.details(), id],
18
+ canRedeem: (id) => [...exports.offerKeys.detail(id), 'can-redeem'],
19
+ };
20
+ // ============================================================================
21
+ // QUERY HOOKS
22
+ // ============================================================================
23
+ /**
24
+ * Get paginated list of offers with optional filters
25
+ *
26
+ * @param filters - Query parameters for filtering and pagination
27
+ * @param options - TanStack Query options
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * const { data, isLoading } = useOffers({
32
+ * page: 1,
33
+ * limit: 20,
34
+ * businessId: 'business-123',
35
+ * isActive: true
36
+ * });
37
+ * ```
38
+ */
39
+ function useOffers(filters, options) {
40
+ return (0, react_query_1.useQuery)({
41
+ queryKey: exports.offerKeys.list(filters),
42
+ queryFn: async () => {
43
+ const client = (0, client_1.getApiClient)();
44
+ const response = await client.get('/api/v1/offers', {
45
+ params: filters,
46
+ });
47
+ return response.data;
48
+ },
49
+ ...options,
50
+ });
51
+ }
52
+ /**
53
+ * Get a single offer by ID
54
+ *
55
+ * @param id - Offer ID
56
+ * @param options - TanStack Query options
57
+ *
58
+ * @example
59
+ * ```tsx
60
+ * const { data, isLoading } = useOffer('offer-123');
61
+ * ```
62
+ */
63
+ function useOffer(id, options) {
64
+ return (0, react_query_1.useQuery)({
65
+ queryKey: exports.offerKeys.detail(id),
66
+ queryFn: async () => {
67
+ const client = (0, client_1.getApiClient)();
68
+ const response = await client.get(`/api/v1/offers/${id}`);
69
+ return response.data;
70
+ },
71
+ enabled: !!id,
72
+ ...options,
73
+ });
74
+ }
75
+ /**
76
+ * Check if a user can redeem a specific offer
77
+ *
78
+ * @param id - Offer ID
79
+ * @param options - TanStack Query options
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * const { data, isLoading } = useCanRedeemOffer('offer-123');
84
+ * if (data?.canRedeem) {
85
+ * // User can redeem the offer
86
+ * } else {
87
+ * console.log('Cannot redeem:', data?.reason);
88
+ * }
89
+ * ```
90
+ */
91
+ function useCanRedeemOffer(id, options) {
92
+ return (0, react_query_1.useQuery)({
93
+ queryKey: exports.offerKeys.canRedeem(id),
94
+ queryFn: async () => {
95
+ const client = (0, client_1.getApiClient)();
96
+ const response = await client.get(`/api/v1/offers/${id}/can-redeem`);
97
+ return response.data;
98
+ },
99
+ enabled: !!id,
100
+ ...options,
101
+ });
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9xdWVyaWVzL29mZmVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2REEsOEJBZUM7QUFhRCw0QkFjQztBQWtCRCw4Q0FjQztBQXZJRCx1REFBa0U7QUFDbEUsc0NBQXlDO0FBR3pDLCtFQUErRTtBQUMvRSxvQkFBb0I7QUFDcEIsK0VBQStFO0FBRWxFLFFBQUEsU0FBUyxHQUFHO0lBQ3ZCLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBVTtJQUN4QixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLGlCQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBVTtJQUNoRCxJQUFJLEVBQUUsQ0FBQyxPQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQVU7SUFDMUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxpQkFBUyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQVU7SUFDcEQsTUFBTSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQVU7SUFDN0QsU0FBUyxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsaUJBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFVO0NBQzVFLENBQUM7QUEwQkYsK0VBQStFO0FBQy9FLGNBQWM7QUFDZCwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixPQUFzQixFQUN0QixPQUFnRjtJQUVoRixPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxpQkFBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDakMsT0FBTyxFQUFFLEtBQUssSUFBc0MsRUFBRTtZQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ2xELE1BQU0sRUFBRSxPQUFPO2FBQ2hCLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixRQUFRLENBQ3RCLEVBQVUsRUFDVixPQUFzRTtJQUV0RSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxpQkFBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxFQUFFLEtBQUssSUFBNEIsRUFBRTtZQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDYixHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLEVBQVUsRUFDVixPQUErRTtJQUUvRSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxpQkFBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDakMsT0FBTyxFQUFFLEtBQUssSUFBcUMsRUFBRTtZQUNuRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDckUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDYixHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlUXVlcnksIFVzZVF1ZXJ5T3B0aW9ucyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBPZmZlclJlc3BvbnNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVkgRkFDVE9SWVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3Qgb2ZmZXJLZXlzID0ge1xuICBhbGw6IFsnb2ZmZXJzJ10gYXMgY29uc3QsXG4gIGxpc3RzOiAoKSA9PiBbLi4ub2ZmZXJLZXlzLmFsbCwgJ2xpc3QnXSBhcyBjb25zdCxcbiAgbGlzdDogKGZpbHRlcnM/OiBPZmZlckZpbHRlcnMpID0+IFsuLi5vZmZlcktleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5vZmZlcktleXMuYWxsLCAnZGV0YWlsJ10gYXMgY29uc3QsXG4gIGRldGFpbDogKGlkOiBzdHJpbmcpID0+IFsuLi5vZmZlcktleXMuZGV0YWlscygpLCBpZF0gYXMgY29uc3QsXG4gIGNhblJlZGVlbTogKGlkOiBzdHJpbmcpID0+IFsuLi5vZmZlcktleXMuZGV0YWlsKGlkKSwgJ2Nhbi1yZWRlZW0nXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZmZXJGaWx0ZXJzIHtcbiAgcGFnZT86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIGJ1c2luZXNzSWQ/OiBzdHJpbmc7XG4gIGlzQWN0aXZlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRPZmZlcnNSZXNwb25zZSB7XG4gIG9mZmVyczogT2ZmZXJSZXNwb25zZVtdO1xuICB0b3RhbDogbnVtYmVyO1xuICBwYWdlOiBudW1iZXI7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHRvdGFsUGFnZXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYW5SZWRlZW1PZmZlclJlc3BvbnNlIHtcbiAgY2FuUmVkZWVtOiBib29sZWFuO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IHBhZ2luYXRlZCBsaXN0IG9mIG9mZmVycyB3aXRoIG9wdGlvbmFsIGZpbHRlcnNcbiAqXG4gKiBAcGFyYW0gZmlsdGVycyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZU9mZmVycyh7XG4gKiAgIHBhZ2U6IDEsXG4gKiAgIGxpbWl0OiAyMCxcbiAqICAgYnVzaW5lc3NJZDogJ2J1c2luZXNzLTEyMycsXG4gKiAgIGlzQWN0aXZlOiB0cnVlXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT2ZmZXJzKFxuICBmaWx0ZXJzPzogT2ZmZXJGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UGFnaW5hdGVkT2ZmZXJzUmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IG9mZmVyS2V5cy5saXN0KGZpbHRlcnMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFBhZ2luYXRlZE9mZmVyc1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS9vZmZlcnMnLCB7XG4gICAgICAgIHBhcmFtczogZmlsdGVycyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgb2ZmZXIgYnkgSURcbiAqXG4gKiBAcGFyYW0gaWQgLSBPZmZlciBJRFxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZU9mZmVyKCdvZmZlci0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT2ZmZXIoXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxPZmZlclJlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBvZmZlcktleXMuZGV0YWlsKGlkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxPZmZlclJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldChgL2FwaS92MS9vZmZlcnMvJHtpZH1gKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFpZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHVzZXIgY2FuIHJlZGVlbSBhIHNwZWNpZmljIG9mZmVyXG4gKlxuICogQHBhcmFtIGlkIC0gT2ZmZXIgSURcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VDYW5SZWRlZW1PZmZlcignb2ZmZXItMTIzJyk7XG4gKiBpZiAoZGF0YT8uY2FuUmVkZWVtKSB7XG4gKiAgIC8vIFVzZXIgY2FuIHJlZGVlbSB0aGUgb2ZmZXJcbiAqIH0gZWxzZSB7XG4gKiAgIGNvbnNvbGUubG9nKCdDYW5ub3QgcmVkZWVtOicsIGRhdGE/LnJlYXNvbik7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhblJlZGVlbU9mZmVyKFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8Q2FuUmVkZWVtT2ZmZXJSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogb2ZmZXJLZXlzLmNhblJlZGVlbShpZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2FuUmVkZWVtT2ZmZXJSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoYC9hcGkvdjEvb2ZmZXJzLyR7aWR9L2Nhbi1yZWRlZW1gKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFpZCxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,56 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { SubscriptionResponse } from '../types';
3
+ export declare const subscriptionKeys: {
4
+ all: readonly ["subscriptions"];
5
+ plans: () => readonly ["subscriptions", "plans"];
6
+ mine: () => readonly ["subscriptions", "me"];
7
+ };
8
+ export interface SubscriptionPlan {
9
+ id: string;
10
+ name: string;
11
+ tier: 'FREE' | 'PREMIUM';
12
+ price: number;
13
+ currency: string;
14
+ interval: 'month' | 'year';
15
+ features: string[];
16
+ stripePriceId?: string;
17
+ }
18
+ /**
19
+ * Get available subscription plans
20
+ *
21
+ * @param options - TanStack Query options
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * const { data: plans, isLoading } = useSubscriptionPlans();
26
+ * ```
27
+ */
28
+ export declare function useSubscriptionPlans(options?: Omit<UseQueryOptions<SubscriptionPlan[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<SubscriptionPlan[], Error>;
29
+ /**
30
+ * Get current user's subscription
31
+ *
32
+ * @param options - TanStack Query options
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * const { data: subscription, isLoading } = useMySubscription();
37
+ * ```
38
+ */
39
+ export declare function useMySubscription(options?: Omit<UseQueryOptions<SubscriptionResponse | null>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
40
+ id: string;
41
+ userId: string;
42
+ tier: "FREE" | "PREMIUM";
43
+ status: "ACTIVE" | "TRIALING" | "PAST_DUE" | "CANCELLED" | "PAUSED";
44
+ stripeCustomerId?: Record<string, never>;
45
+ stripeSubscriptionId?: Record<string, never>;
46
+ stripePriceId?: Record<string, never>;
47
+ currentPeriodStart?: Record<string, never>;
48
+ currentPeriodEnd?: Record<string, never>;
49
+ cancelAtPeriodEnd: boolean;
50
+ cancelledAt?: Record<string, never>;
51
+ trialStart?: Record<string, never>;
52
+ trialEnd?: Record<string, never>;
53
+ hadTrial: boolean;
54
+ createdAt: string;
55
+ updatedAt: string;
56
+ } | null, Error>;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subscriptionKeys = void 0;
4
+ exports.useSubscriptionPlans = useSubscriptionPlans;
5
+ exports.useMySubscription = useMySubscription;
6
+ const react_query_1 = require("@tanstack/react-query");
7
+ const client_1 = require("../client");
8
+ // ============================================================================
9
+ // QUERY KEY FACTORY
10
+ // ============================================================================
11
+ exports.subscriptionKeys = {
12
+ all: ['subscriptions'],
13
+ plans: () => [...exports.subscriptionKeys.all, 'plans'],
14
+ mine: () => [...exports.subscriptionKeys.all, 'me'],
15
+ };
16
+ // ============================================================================
17
+ // QUERY HOOKS
18
+ // ============================================================================
19
+ /**
20
+ * Get available subscription plans
21
+ *
22
+ * @param options - TanStack Query options
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { data: plans, isLoading } = useSubscriptionPlans();
27
+ * ```
28
+ */
29
+ function useSubscriptionPlans(options) {
30
+ return (0, react_query_1.useQuery)({
31
+ queryKey: exports.subscriptionKeys.plans(),
32
+ queryFn: async () => {
33
+ const client = (0, client_1.getApiClient)();
34
+ const response = await client.get('/api/v1/subscriptions/plans');
35
+ return response.data;
36
+ },
37
+ ...options,
38
+ });
39
+ }
40
+ /**
41
+ * Get current user's subscription
42
+ *
43
+ * @param options - TanStack Query options
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * const { data: subscription, isLoading } = useMySubscription();
48
+ * ```
49
+ */
50
+ function useMySubscription(options) {
51
+ return (0, react_query_1.useQuery)({
52
+ queryKey: exports.subscriptionKeys.mine(),
53
+ queryFn: async () => {
54
+ const client = (0, client_1.getApiClient)();
55
+ try {
56
+ const response = await client.get('/api/v1/subscriptions/me');
57
+ return response.data;
58
+ }
59
+ catch (error) {
60
+ // 404 means no subscription - return null instead of throwing
61
+ if (error && typeof error === 'object' && 'response' in error) {
62
+ const axiosError = error;
63
+ if (axiosError.response?.status === 404) {
64
+ return null;
65
+ }
66
+ }
67
+ throw error;
68
+ }
69
+ },
70
+ ...options,
71
+ });
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9zdWJzY3JpcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJDQSxvREFZQztBQVlELDhDQXVCQztBQTFGRCx1REFBa0U7QUFDbEUsc0NBQXlDO0FBR3pDLCtFQUErRTtBQUMvRSxvQkFBb0I7QUFDcEIsK0VBQStFO0FBRWxFLFFBQUEsZ0JBQWdCLEdBQUc7SUFDOUIsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFVO0lBQy9CLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsd0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBVTtJQUN4RCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLHdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQVU7Q0FDckQsQ0FBQztBQWlCRiwrRUFBK0U7QUFDL0UsY0FBYztBQUNkLCtFQUErRTtBQUUvRTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsT0FBMkU7SUFFM0UsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsd0JBQWdCLENBQUMsS0FBSyxFQUFFO1FBQ2xDLE9BQU8sRUFBRSxLQUFLLElBQWlDLEVBQUU7WUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDakUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE9BQW9GO0lBRXBGLE9BQU8sSUFBQSxzQkFBUSxFQUFDO1FBQ2QsUUFBUSxFQUFFLHdCQUFnQixDQUFDLElBQUksRUFBRTtRQUNqQyxPQUFPLEVBQUUsS0FBSyxJQUEwQyxFQUFFO1lBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO2dCQUN4Qiw4REFBOEQ7Z0JBQzlELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7b0JBQzlELE1BQU0sVUFBVSxHQUFHLEtBQTJDLENBQUM7b0JBQy9ELElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQ3hDLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgU3Vic2NyaXB0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWSBGQUNUT1JZXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBzdWJzY3JpcHRpb25LZXlzID0ge1xuICBhbGw6IFsnc3Vic2NyaXB0aW9ucyddIGFzIGNvbnN0LFxuICBwbGFuczogKCkgPT4gWy4uLnN1YnNjcmlwdGlvbktleXMuYWxsLCAncGxhbnMnXSBhcyBjb25zdCxcbiAgbWluZTogKCkgPT4gWy4uLnN1YnNjcmlwdGlvbktleXMuYWxsLCAnbWUnXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uUGxhbiB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGllcjogJ0ZSRUUnIHwgJ1BSRU1JVU0nO1xuICBwcmljZTogbnVtYmVyO1xuICBjdXJyZW5jeTogc3RyaW5nO1xuICBpbnRlcnZhbDogJ21vbnRoJyB8ICd5ZWFyJztcbiAgZmVhdHVyZXM6IHN0cmluZ1tdO1xuICBzdHJpcGVQcmljZUlkPzogc3RyaW5nO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBhdmFpbGFibGUgc3Vic2NyaXB0aW9uIHBsYW5zXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBwbGFucywgaXNMb2FkaW5nIH0gPSB1c2VTdWJzY3JpcHRpb25QbGFucygpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdWJzY3JpcHRpb25QbGFucyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFN1YnNjcmlwdGlvblBsYW5bXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogc3Vic2NyaXB0aW9uS2V5cy5wbGFucygpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFN1YnNjcmlwdGlvblBsYW5bXT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3Vic2NyaXB0aW9ucy9wbGFucycpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgY3VycmVudCB1c2VyJ3Mgc3Vic2NyaXB0aW9uXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBzdWJzY3JpcHRpb24sIGlzTG9hZGluZyB9ID0gdXNlTXlTdWJzY3JpcHRpb24oKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTXlTdWJzY3JpcHRpb24oXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxTdWJzY3JpcHRpb25SZXNwb25zZSB8IG51bGw+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IHN1YnNjcmlwdGlvbktleXMubWluZSgpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFN1YnNjcmlwdGlvblJlc3BvbnNlIHwgbnVsbD4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9hcGkvdjEvc3Vic2NyaXB0aW9ucy9tZScpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIC8vIDQwNCBtZWFucyBubyBzdWJzY3JpcHRpb24gLSByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nXG4gICAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdyZXNwb25zZScgaW4gZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBheGlvc0Vycm9yID0gZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfTtcbiAgICAgICAgICBpZiAoYXhpb3NFcnJvci5yZXNwb25zZT8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,106 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { DailyCheckInResponse, MoodLogResponse, WinResponse, HabitResponse, ReflectionResponse, UserStreakResponse } from '../types';
3
+ export declare const supportKeys: {
4
+ all: readonly ["support"];
5
+ checkIns: () => readonly ["support", "check-ins"];
6
+ checkInToday: () => readonly ["support", "check-ins", "today"];
7
+ checkInStreak: () => readonly ["support", "check-ins", "streak"];
8
+ moodLogs: () => readonly ["support", "mood"];
9
+ wins: () => readonly ["support", "wins"];
10
+ winsByCategory: () => readonly ["support", "wins", "by-category"];
11
+ habits: () => readonly ["support", "habits"];
12
+ reflections: () => readonly ["support", "reflections"];
13
+ };
14
+ export interface WinsByCategory {
15
+ category: string;
16
+ wins: WinResponse[];
17
+ count: number;
18
+ }
19
+ /**
20
+ * Get user's daily check-ins
21
+ *
22
+ * @param options - TanStack Query options
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * const { data, isLoading } = useCheckIns();
27
+ * ```
28
+ */
29
+ export declare function useCheckIns(options?: Omit<UseQueryOptions<DailyCheckInResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<DailyCheckInResponse[], Error>;
30
+ /**
31
+ * Get today's check-in
32
+ *
33
+ * @param options - TanStack Query options
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * const { data, isLoading } = useTodayCheckIn();
38
+ * ```
39
+ */
40
+ export declare function useTodayCheckIn(options?: Omit<UseQueryOptions<DailyCheckInResponse | null>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<DailyCheckInResponse | null, Error>;
41
+ /**
42
+ * Get user's check-in streak
43
+ *
44
+ * @param options - TanStack Query options
45
+ *
46
+ * @example
47
+ * ```tsx
48
+ * const { data, isLoading } = useCheckInStreak();
49
+ * ```
50
+ */
51
+ export declare function useCheckInStreak(options?: Omit<UseQueryOptions<UserStreakResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<UserStreakResponse, Error>;
52
+ /**
53
+ * Get user's mood logs
54
+ *
55
+ * @param options - TanStack Query options
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * const { data, isLoading } = useMoodLogs();
60
+ * ```
61
+ */
62
+ export declare function useMoodLogs(options?: Omit<UseQueryOptions<MoodLogResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<MoodLogResponse[], Error>;
63
+ /**
64
+ * Get user's wins
65
+ *
66
+ * @param options - TanStack Query options
67
+ *
68
+ * @example
69
+ * ```tsx
70
+ * const { data, isLoading } = useWins();
71
+ * ```
72
+ */
73
+ export declare function useWins(options?: Omit<UseQueryOptions<WinResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<WinResponse[], Error>;
74
+ /**
75
+ * Get user's wins grouped by category
76
+ *
77
+ * @param options - TanStack Query options
78
+ *
79
+ * @example
80
+ * ```tsx
81
+ * const { data, isLoading } = useWinsByCategory();
82
+ * ```
83
+ */
84
+ export declare function useWinsByCategory(options?: Omit<UseQueryOptions<WinsByCategory[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<WinsByCategory[], Error>;
85
+ /**
86
+ * Get user's habits
87
+ *
88
+ * @param options - TanStack Query options
89
+ *
90
+ * @example
91
+ * ```tsx
92
+ * const { data, isLoading } = useHabits();
93
+ * ```
94
+ */
95
+ export declare function useHabits(options?: Omit<UseQueryOptions<HabitResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<HabitResponse[], Error>;
96
+ /**
97
+ * Get user's reflections
98
+ *
99
+ * @param options - TanStack Query options
100
+ *
101
+ * @example
102
+ * ```tsx
103
+ * const { data, isLoading } = useReflections();
104
+ * ```
105
+ */
106
+ export declare function useReflections(options?: Omit<UseQueryOptions<ReflectionResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<ReflectionResponse[], Error>;