@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.
- package/README.md +276 -0
- package/dist/__tests__/e2e.test.d.ts +7 -0
- package/dist/__tests__/e2e.test.js +472 -0
- package/dist/api/client.d.ts +11 -0
- package/dist/api/client.js +61 -0
- package/dist/api/mutations/admin.d.ts +167 -0
- package/dist/api/mutations/admin.js +326 -0
- package/dist/api/mutations/ambassadors.d.ts +52 -0
- package/dist/api/mutations/ambassadors.js +148 -0
- package/dist/api/mutations/auth.d.ts +267 -0
- package/dist/api/mutations/auth.js +332 -0
- package/dist/api/mutations/bookings.d.ts +59 -0
- package/dist/api/mutations/bookings.js +143 -0
- package/dist/api/mutations/event-chat.d.ts +35 -0
- package/dist/api/mutations/event-chat.js +147 -0
- package/dist/api/mutations/events.d.ts +87 -0
- package/dist/api/mutations/events.js +205 -0
- package/dist/api/mutations/grow90.d.ts +36 -0
- package/dist/api/mutations/grow90.js +132 -0
- package/dist/api/mutations/hubs.d.ts +111 -0
- package/dist/api/mutations/hubs.js +240 -0
- package/dist/api/mutations/index.d.ts +22 -0
- package/dist/api/mutations/index.js +39 -0
- package/dist/api/mutations/jack.d.ts +61 -0
- package/dist/api/mutations/jack.js +104 -0
- package/dist/api/mutations/library.d.ts +67 -0
- package/dist/api/mutations/library.js +168 -0
- package/dist/api/mutations/map.d.ts +153 -0
- package/dist/api/mutations/map.js +181 -0
- package/dist/api/mutations/matching.d.ts +130 -0
- package/dist/api/mutations/matching.js +204 -0
- package/dist/api/mutations/notifications.d.ts +63 -0
- package/dist/api/mutations/notifications.js +106 -0
- package/dist/api/mutations/offers.d.ts +26 -0
- package/dist/api/mutations/offers.js +47 -0
- package/dist/api/mutations/subscriptions.d.ts +127 -0
- package/dist/api/mutations/subscriptions.js +140 -0
- package/dist/api/mutations/support.d.ts +165 -0
- package/dist/api/mutations/support.js +307 -0
- package/dist/api/mutations/users.d.ts +211 -0
- package/dist/api/mutations/users.js +261 -0
- package/dist/api/queries/admin.d.ts +257 -0
- package/dist/api/queries/admin.js +320 -0
- package/dist/api/queries/ambassadors.d.ts +53 -0
- package/dist/api/queries/ambassadors.js +98 -0
- package/dist/api/queries/auth.d.ts +16 -0
- package/dist/api/queries/auth.js +25 -0
- package/dist/api/queries/bookings.d.ts +91 -0
- package/dist/api/queries/bookings.js +102 -0
- package/dist/api/queries/businesses.d.ts +212 -0
- package/dist/api/queries/businesses.js +154 -0
- package/dist/api/queries/event-chat.d.ts +19 -0
- package/dist/api/queries/event-chat.js +75 -0
- package/dist/api/queries/events.d.ts +322 -0
- package/dist/api/queries/events.js +221 -0
- package/dist/api/queries/grow90.d.ts +26 -0
- package/dist/api/queries/grow90.js +85 -0
- package/dist/api/queries/hubs.d.ts +165 -0
- package/dist/api/queries/hubs.js +143 -0
- package/dist/api/queries/index.d.ts +23 -0
- package/dist/api/queries/index.js +40 -0
- package/dist/api/queries/jack.d.ts +63 -0
- package/dist/api/queries/jack.js +92 -0
- package/dist/api/queries/library.d.ts +132 -0
- package/dist/api/queries/library.js +120 -0
- package/dist/api/queries/map.d.ts +216 -0
- package/dist/api/queries/map.js +278 -0
- package/dist/api/queries/matching.d.ts +136 -0
- package/dist/api/queries/matching.js +161 -0
- package/dist/api/queries/notifications.d.ts +78 -0
- package/dist/api/queries/notifications.js +88 -0
- package/dist/api/queries/offers.d.ts +91 -0
- package/dist/api/queries/offers.js +103 -0
- package/dist/api/queries/subscriptions.d.ts +56 -0
- package/dist/api/queries/subscriptions.js +73 -0
- package/dist/api/queries/support.d.ts +106 -0
- package/dist/api/queries/support.js +202 -0
- package/dist/api/queries/users.d.ts +293 -0
- package/dist/api/queries/users.js +370 -0
- package/dist/api/types.d.ts +464 -0
- package/dist/api/types.js +9 -0
- package/dist/hooks/useAuth.d.ts +5 -0
- package/dist/hooks/useAuth.js +39 -0
- package/dist/hooks/useUser.d.ts +43 -0
- package/dist/hooks/useUser.js +44 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +67 -0
- package/package.json +62 -0
- package/src/__tests__/e2e.test.ts +502 -0
- package/src/api/client.ts +71 -0
- package/src/api/mutations/admin.ts +531 -0
- package/src/api/mutations/ambassadors.ts +185 -0
- package/src/api/mutations/auth.ts +350 -0
- package/src/api/mutations/bookings.ts +190 -0
- package/src/api/mutations/event-chat.ts +177 -0
- package/src/api/mutations/events.ts +273 -0
- package/src/api/mutations/grow90.ts +169 -0
- package/src/api/mutations/hubs.ts +385 -0
- package/src/api/mutations/index.ts +23 -0
- package/src/api/mutations/jack.ts +130 -0
- package/src/api/mutations/library.ts +212 -0
- package/src/api/mutations/map.ts +230 -0
- package/src/api/mutations/matching.ts +271 -0
- package/src/api/mutations/notifications.ts +114 -0
- package/src/api/mutations/offers.ts +73 -0
- package/src/api/mutations/subscriptions.ts +162 -0
- package/src/api/mutations/support.ts +390 -0
- package/src/api/mutations/users.ts +271 -0
- package/src/api/queries/admin.ts +480 -0
- package/src/api/queries/ambassadors.ts +139 -0
- package/src/api/queries/auth.ts +24 -0
- package/src/api/queries/bookings.ts +135 -0
- package/src/api/queries/businesses.ts +203 -0
- package/src/api/queries/event-chat.ts +78 -0
- package/src/api/queries/events.ts +272 -0
- package/src/api/queries/grow90.ts +98 -0
- package/src/api/queries/hubs.ts +211 -0
- package/src/api/queries/index.ts +24 -0
- package/src/api/queries/jack.ts +127 -0
- package/src/api/queries/library.ts +166 -0
- package/src/api/queries/map.ts +331 -0
- package/src/api/queries/matching.ts +238 -0
- package/src/api/queries/notifications.ts +103 -0
- package/src/api/queries/offers.ts +136 -0
- package/src/api/queries/subscriptions.ts +91 -0
- package/src/api/queries/support.ts +235 -0
- package/src/api/queries/users.ts +393 -0
- package/src/api/types.ts +596 -0
- 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>;
|