@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,61 @@
|
|
|
1
|
+
import { UseMutationOptions } from '@tanstack/react-query';
|
|
2
|
+
export interface ChatRequest {
|
|
3
|
+
message: string;
|
|
4
|
+
conversationId?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ChatResponse {
|
|
7
|
+
message: string;
|
|
8
|
+
conversationId: string;
|
|
9
|
+
messageId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface NewConversationResponse {
|
|
12
|
+
conversationId: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Send a message to Jack and get a response
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* const chatMutation = useChatWithJack();
|
|
20
|
+
*
|
|
21
|
+
* const handleSend = async (message: string) => {
|
|
22
|
+
* const response = await chatMutation.mutateAsync({
|
|
23
|
+
* message,
|
|
24
|
+
* conversationId: currentConversationId, // optional
|
|
25
|
+
* });
|
|
26
|
+
* console.log('Jack says:', response.message);
|
|
27
|
+
* };
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function useChatWithJack(options?: Omit<UseMutationOptions<ChatResponse, Error, ChatRequest>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<ChatResponse, Error, ChatRequest, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Start a new conversation with Jack
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* const newConversation = useStartJackConversation();
|
|
37
|
+
*
|
|
38
|
+
* const handleNewChat = async () => {
|
|
39
|
+
* const { conversationId } = await newConversation.mutateAsync();
|
|
40
|
+
* setCurrentConversationId(conversationId);
|
|
41
|
+
* };
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useStartJackConversation(options?: Omit<UseMutationOptions<NewConversationResponse, Error, void>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<NewConversationResponse, Error, void, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Archive a conversation with Jack
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* const archiveConversation = useArchiveJackConversation();
|
|
51
|
+
*
|
|
52
|
+
* const handleArchive = async (conversationId: string) => {
|
|
53
|
+
* await archiveConversation.mutateAsync(conversationId);
|
|
54
|
+
* };
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function useArchiveJackConversation(options?: Omit<UseMutationOptions<{
|
|
58
|
+
success: boolean;
|
|
59
|
+
}, Error, string>, 'mutationFn'>): import("@tanstack/react-query").UseMutationResult<{
|
|
60
|
+
success: boolean;
|
|
61
|
+
}, Error, string, unknown>;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useChatWithJack = useChatWithJack;
|
|
4
|
+
exports.useStartJackConversation = useStartJackConversation;
|
|
5
|
+
exports.useArchiveJackConversation = useArchiveJackConversation;
|
|
6
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
7
|
+
const client_1 = require("../client");
|
|
8
|
+
const jack_1 = require("../queries/jack");
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// MUTATION HOOKS
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Send a message to Jack and get a response
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const chatMutation = useChatWithJack();
|
|
18
|
+
*
|
|
19
|
+
* const handleSend = async (message: string) => {
|
|
20
|
+
* const response = await chatMutation.mutateAsync({
|
|
21
|
+
* message,
|
|
22
|
+
* conversationId: currentConversationId, // optional
|
|
23
|
+
* });
|
|
24
|
+
* console.log('Jack says:', response.message);
|
|
25
|
+
* };
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
function useChatWithJack(options) {
|
|
29
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
30
|
+
return (0, react_query_1.useMutation)({
|
|
31
|
+
mutationFn: async (data) => {
|
|
32
|
+
const client = (0, client_1.getApiClient)();
|
|
33
|
+
const response = await client.post('/api/v1/support/jack/chat', data);
|
|
34
|
+
// API wraps response in { data: {...}, meta: {...} }
|
|
35
|
+
return response.data?.data || response.data;
|
|
36
|
+
},
|
|
37
|
+
onSuccess: (data) => {
|
|
38
|
+
// Invalidate conversation queries to refresh the list
|
|
39
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.conversations() });
|
|
40
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.history() });
|
|
41
|
+
if (data.conversationId) {
|
|
42
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.conversation(data.conversationId) });
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
...options,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start a new conversation with Jack
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```tsx
|
|
53
|
+
* const newConversation = useStartJackConversation();
|
|
54
|
+
*
|
|
55
|
+
* const handleNewChat = async () => {
|
|
56
|
+
* const { conversationId } = await newConversation.mutateAsync();
|
|
57
|
+
* setCurrentConversationId(conversationId);
|
|
58
|
+
* };
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
function useStartJackConversation(options) {
|
|
62
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
63
|
+
return (0, react_query_1.useMutation)({
|
|
64
|
+
mutationFn: async () => {
|
|
65
|
+
const client = (0, client_1.getApiClient)();
|
|
66
|
+
const response = await client.post('/api/v1/support/jack/conversations/new');
|
|
67
|
+
// API wraps response in { data: {...}, meta: {...} }
|
|
68
|
+
return response.data?.data || response.data;
|
|
69
|
+
},
|
|
70
|
+
onSuccess: () => {
|
|
71
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.conversations() });
|
|
72
|
+
},
|
|
73
|
+
...options,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Archive a conversation with Jack
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```tsx
|
|
81
|
+
* const archiveConversation = useArchiveJackConversation();
|
|
82
|
+
*
|
|
83
|
+
* const handleArchive = async (conversationId: string) => {
|
|
84
|
+
* await archiveConversation.mutateAsync(conversationId);
|
|
85
|
+
* };
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
function useArchiveJackConversation(options) {
|
|
89
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
90
|
+
return (0, react_query_1.useMutation)({
|
|
91
|
+
mutationFn: async (conversationId) => {
|
|
92
|
+
const client = (0, client_1.getApiClient)();
|
|
93
|
+
const response = await client.delete(`/api/v1/support/jack/conversations/${conversationId}`);
|
|
94
|
+
// API wraps response in { data: {...}, meta: {...} }
|
|
95
|
+
return response.data?.data || response.data;
|
|
96
|
+
},
|
|
97
|
+
onSuccess: () => {
|
|
98
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.conversations() });
|
|
99
|
+
queryClient.invalidateQueries({ queryKey: jack_1.jackKeys.history() });
|
|
100
|
+
},
|
|
101
|
+
...options,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2phY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQ0EsMENBc0JDO0FBZUQsNERBaUJDO0FBY0QsZ0VBa0JDO0FBaklELHVEQUF3RjtBQUN4RixzQ0FBeUM7QUFDekMsMENBQTJDO0FBcUIzQywrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFnQixlQUFlLENBQzdCLE9BQWtGO0lBRWxGLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBaUIsRUFBeUIsRUFBRTtZQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEUscURBQXFEO1lBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5QyxDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEIsc0RBQXNEO1lBQ3RELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFRLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsZUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUM7UUFDSCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQWdCLHdCQUF3QixDQUN0QyxPQUFzRjtJQUV0RixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxJQUFzQyxFQUFFO1lBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzdFLHFEQUFxRDtZQUNyRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDZCxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsZUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3hDLE9BQXFGO0lBRXJGLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsY0FBc0IsRUFBaUMsRUFBRTtZQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0NBQXNDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDN0YscURBQXFEO1lBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUM5QyxDQUFDO1FBQ0QsU0FBUyxFQUFFLEdBQUcsRUFBRTtZQUNkLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFRLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxlQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlTXV0YXRpb24sIHVzZVF1ZXJ5Q2xpZW50LCBVc2VNdXRhdGlvbk9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IGphY2tLZXlzIH0gZnJvbSAnLi4vcXVlcmllcy9qYWNrJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBDaGF0UmVxdWVzdCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFJlc3BvbnNlIHtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICBtZXNzYWdlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXdDb252ZXJzYXRpb25SZXNwb25zZSB7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2VuZCBhIG1lc3NhZ2UgdG8gSmFjayBhbmQgZ2V0IGEgcmVzcG9uc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCBjaGF0TXV0YXRpb24gPSB1c2VDaGF0V2l0aEphY2soKTtcbiAqXG4gKiBjb25zdCBoYW5kbGVTZW5kID0gYXN5bmMgKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICogICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNoYXRNdXRhdGlvbi5tdXRhdGVBc3luYyh7XG4gKiAgICAgbWVzc2FnZSxcbiAqICAgICBjb252ZXJzYXRpb25JZDogY3VycmVudENvbnZlcnNhdGlvbklkLCAvLyBvcHRpb25hbFxuICogICB9KTtcbiAqICAgY29uc29sZS5sb2coJ0phY2sgc2F5czonLCByZXNwb25zZS5tZXNzYWdlKTtcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNoYXRXaXRoSmFjayhcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPENoYXRSZXNwb25zZSwgRXJyb3IsIENoYXRSZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKSB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBDaGF0UmVxdWVzdCk6IFByb21pc2U8Q2hhdFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy9hcGkvdjEvc3VwcG9ydC9qYWNrL2NoYXQnLCBkYXRhKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZSBpbiB7IGRhdGE6IHsuLi59LCBtZXRhOiB7Li4ufSB9XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjb252ZXJzYXRpb24gcXVlcmllcyB0byByZWZyZXNoIHRoZSBsaXN0XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBqYWNrS2V5cy5jb252ZXJzYXRpb25zKCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBqYWNrS2V5cy5oaXN0b3J5KCkgfSk7XG4gICAgICBpZiAoZGF0YS5jb252ZXJzYXRpb25JZCkge1xuICAgICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBqYWNrS2V5cy5jb252ZXJzYXRpb24oZGF0YS5jb252ZXJzYXRpb25JZCkgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCBhIG5ldyBjb252ZXJzYXRpb24gd2l0aCBKYWNrXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgbmV3Q29udmVyc2F0aW9uID0gdXNlU3RhcnRKYWNrQ29udmVyc2F0aW9uKCk7XG4gKlxuICogY29uc3QgaGFuZGxlTmV3Q2hhdCA9IGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgeyBjb252ZXJzYXRpb25JZCB9ID0gYXdhaXQgbmV3Q29udmVyc2F0aW9uLm11dGF0ZUFzeW5jKCk7XG4gKiAgIHNldEN1cnJlbnRDb252ZXJzYXRpb25JZChjb252ZXJzYXRpb25JZCk7XG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdGFydEphY2tDb252ZXJzYXRpb24oXG4gIG9wdGlvbnM/OiBPbWl0PFVzZU11dGF0aW9uT3B0aW9uczxOZXdDb252ZXJzYXRpb25SZXNwb25zZSwgRXJyb3IsIHZvaWQ+LCAnbXV0YXRpb25Gbic+XG4pIHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKCk6IFByb21pc2U8TmV3Q29udmVyc2F0aW9uUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdCgnL2FwaS92MS9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucy9uZXcnKTtcbiAgICAgIC8vIEFQSSB3cmFwcyByZXNwb25zZSBpbiB7IGRhdGE6IHsuLi59LCBtZXRhOiB7Li4ufSB9XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YT8uZGF0YSB8fCByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBqYWNrS2V5cy5jb252ZXJzYXRpb25zKCkgfSk7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBcmNoaXZlIGEgY29udmVyc2F0aW9uIHdpdGggSmFja1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IGFyY2hpdmVDb252ZXJzYXRpb24gPSB1c2VBcmNoaXZlSmFja0NvbnZlcnNhdGlvbigpO1xuICpcbiAqIGNvbnN0IGhhbmRsZUFyY2hpdmUgPSBhc3luYyAoY29udmVyc2F0aW9uSWQ6IHN0cmluZykgPT4ge1xuICogICBhd2FpdCBhcmNoaXZlQ29udmVyc2F0aW9uLm11dGF0ZUFzeW5jKGNvbnZlcnNhdGlvbklkKTtcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFyY2hpdmVKYWNrQ29udmVyc2F0aW9uKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8eyBzdWNjZXNzOiBib29sZWFuIH0sIEVycm9yLCBzdHJpbmc+LCAnbXV0YXRpb25Gbic+XG4pIHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGNvbnZlcnNhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbiB9PiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmRlbGV0ZShgL2FwaS92MS9zdXBwb3J0L2phY2svY29udmVyc2F0aW9ucy8ke2NvbnZlcnNhdGlvbklkfWApO1xuICAgICAgLy8gQVBJIHdyYXBzIHJlc3BvbnNlIGluIHsgZGF0YTogey4uLn0sIG1ldGE6IHsuLi59IH1cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhPy5kYXRhIHx8IHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGphY2tLZXlzLmNvbnZlcnNhdGlvbnMoKSB9KTtcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGphY2tLZXlzLmhpc3RvcnkoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
import type { LibraryProgressResponse } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Mark a library item as viewed
|
|
5
|
+
*
|
|
6
|
+
* @param options - TanStack Query mutation options
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const { mutate, isPending } = useMarkViewed();
|
|
11
|
+
*
|
|
12
|
+
* mutate('lib-123');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function useMarkViewed(options?: Omit<UseMutationOptions<LibraryProgressResponse, Error, string>, 'mutationFn'>): UseMutationResult<LibraryProgressResponse, Error, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Mark a library item as completed
|
|
18
|
+
*
|
|
19
|
+
* @param options - TanStack Query mutation options
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const { mutate, isPending } = useMarkCompleted();
|
|
24
|
+
*
|
|
25
|
+
* mutate('lib-123');
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useMarkCompleted(options?: Omit<UseMutationOptions<LibraryProgressResponse, Error, string>, 'mutationFn'>): UseMutationResult<LibraryProgressResponse, Error, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Toggle like status for a library item
|
|
31
|
+
*
|
|
32
|
+
* @param options - TanStack Query mutation options
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* const { mutate, isPending } = useToggleLike();
|
|
37
|
+
*
|
|
38
|
+
* mutate('lib-123');
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function useToggleLike(options?: Omit<UseMutationOptions<LibraryProgressResponse, Error, string>, 'mutationFn'>): UseMutationResult<LibraryProgressResponse, Error, string>;
|
|
42
|
+
/**
|
|
43
|
+
* Add a bookmark to a library item
|
|
44
|
+
*
|
|
45
|
+
* @param options - TanStack Query mutation options
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* const { mutate, isPending } = useAddBookmark();
|
|
50
|
+
*
|
|
51
|
+
* mutate('lib-123');
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function useAddBookmark(options?: Omit<UseMutationOptions<LibraryProgressResponse, Error, string>, 'mutationFn'>): UseMutationResult<LibraryProgressResponse, Error, string>;
|
|
55
|
+
/**
|
|
56
|
+
* Remove a bookmark from a library item
|
|
57
|
+
*
|
|
58
|
+
* @param options - TanStack Query mutation options
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* const { mutate, isPending } = useRemoveBookmark();
|
|
63
|
+
*
|
|
64
|
+
* mutate('lib-123');
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function useRemoveBookmark(options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>): UseMutationResult<void, Error, string>;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useMarkViewed = useMarkViewed;
|
|
4
|
+
exports.useMarkCompleted = useMarkCompleted;
|
|
5
|
+
exports.useToggleLike = useToggleLike;
|
|
6
|
+
exports.useAddBookmark = useAddBookmark;
|
|
7
|
+
exports.useRemoveBookmark = useRemoveBookmark;
|
|
8
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
9
|
+
const client_1 = require("../client");
|
|
10
|
+
const library_1 = require("../queries/library");
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// MUTATION HOOKS
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Mark a library item as viewed
|
|
16
|
+
*
|
|
17
|
+
* @param options - TanStack Query mutation options
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const { mutate, isPending } = useMarkViewed();
|
|
22
|
+
*
|
|
23
|
+
* mutate('lib-123');
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function useMarkViewed(options) {
|
|
27
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
28
|
+
return (0, react_query_1.useMutation)({
|
|
29
|
+
mutationFn: async (id) => {
|
|
30
|
+
const client = (0, client_1.getApiClient)();
|
|
31
|
+
const response = await client.post(`/api/v1/library/${id}/view`);
|
|
32
|
+
return response.data;
|
|
33
|
+
},
|
|
34
|
+
onSuccess: (data, id, context) => {
|
|
35
|
+
// Invalidate the specific item to reflect updated view status
|
|
36
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.detail(id) });
|
|
37
|
+
// Invalidate lists to update view counts
|
|
38
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.lists() });
|
|
39
|
+
// Call user's onSuccess if provided
|
|
40
|
+
// User's onSuccess is handled by spreading options
|
|
41
|
+
},
|
|
42
|
+
...options,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Mark a library item as completed
|
|
47
|
+
*
|
|
48
|
+
* @param options - TanStack Query mutation options
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```tsx
|
|
52
|
+
* const { mutate, isPending } = useMarkCompleted();
|
|
53
|
+
*
|
|
54
|
+
* mutate('lib-123');
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function useMarkCompleted(options) {
|
|
58
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
59
|
+
return (0, react_query_1.useMutation)({
|
|
60
|
+
mutationFn: async (id) => {
|
|
61
|
+
const client = (0, client_1.getApiClient)();
|
|
62
|
+
const response = await client.post(`/api/v1/library/${id}/complete`);
|
|
63
|
+
return response.data;
|
|
64
|
+
},
|
|
65
|
+
onSuccess: (data, id, context) => {
|
|
66
|
+
// Invalidate the specific item to reflect completion status
|
|
67
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.detail(id) });
|
|
68
|
+
// Invalidate lists
|
|
69
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.lists() });
|
|
70
|
+
// Call user's onSuccess if provided
|
|
71
|
+
// User's onSuccess is handled by spreading options
|
|
72
|
+
},
|
|
73
|
+
...options,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Toggle like status for a library item
|
|
78
|
+
*
|
|
79
|
+
* @param options - TanStack Query mutation options
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* const { mutate, isPending } = useToggleLike();
|
|
84
|
+
*
|
|
85
|
+
* mutate('lib-123');
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
function useToggleLike(options) {
|
|
89
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
90
|
+
return (0, react_query_1.useMutation)({
|
|
91
|
+
mutationFn: async (id) => {
|
|
92
|
+
const client = (0, client_1.getApiClient)();
|
|
93
|
+
const response = await client.post(`/api/v1/library/${id}/like`);
|
|
94
|
+
return response.data;
|
|
95
|
+
},
|
|
96
|
+
onSuccess: (data, id, context) => {
|
|
97
|
+
// Invalidate the specific item to reflect like status
|
|
98
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.detail(id) });
|
|
99
|
+
// Invalidate lists to update like counts
|
|
100
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.lists() });
|
|
101
|
+
// Call user's onSuccess if provided
|
|
102
|
+
// User's onSuccess is handled by spreading options
|
|
103
|
+
},
|
|
104
|
+
...options,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Add a bookmark to a library item
|
|
109
|
+
*
|
|
110
|
+
* @param options - TanStack Query mutation options
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```tsx
|
|
114
|
+
* const { mutate, isPending } = useAddBookmark();
|
|
115
|
+
*
|
|
116
|
+
* mutate('lib-123');
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
function useAddBookmark(options) {
|
|
120
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
121
|
+
return (0, react_query_1.useMutation)({
|
|
122
|
+
mutationFn: async (id) => {
|
|
123
|
+
const client = (0, client_1.getApiClient)();
|
|
124
|
+
const response = await client.post(`/api/v1/library/${id}/bookmark`);
|
|
125
|
+
return response.data;
|
|
126
|
+
},
|
|
127
|
+
onSuccess: (data, id, context) => {
|
|
128
|
+
// Invalidate the specific item to reflect bookmark status
|
|
129
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.detail(id) });
|
|
130
|
+
// Invalidate lists
|
|
131
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.lists() });
|
|
132
|
+
// Call user's onSuccess if provided
|
|
133
|
+
// User's onSuccess is handled by spreading options
|
|
134
|
+
},
|
|
135
|
+
...options,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Remove a bookmark from a library item
|
|
140
|
+
*
|
|
141
|
+
* @param options - TanStack Query mutation options
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```tsx
|
|
145
|
+
* const { mutate, isPending } = useRemoveBookmark();
|
|
146
|
+
*
|
|
147
|
+
* mutate('lib-123');
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
function useRemoveBookmark(options) {
|
|
151
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
152
|
+
return (0, react_query_1.useMutation)({
|
|
153
|
+
mutationFn: async (id) => {
|
|
154
|
+
const client = (0, client_1.getApiClient)();
|
|
155
|
+
await client.delete(`/api/v1/library/${id}/bookmark`);
|
|
156
|
+
},
|
|
157
|
+
onSuccess: (data, id, context) => {
|
|
158
|
+
// Invalidate the specific item to reflect bookmark removal
|
|
159
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.detail(id) });
|
|
160
|
+
// Invalidate lists
|
|
161
|
+
queryClient.invalidateQueries({ queryKey: library_1.libraryKeys.lists() });
|
|
162
|
+
// Call user's onSuccess if provided
|
|
163
|
+
// User's onSuccess is handled by spreading options
|
|
164
|
+
},
|
|
165
|
+
...options,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2xpYnJhcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsc0NBMEJDO0FBY0QsNENBMEJDO0FBY0Qsc0NBMEJDO0FBY0Qsd0NBMEJDO0FBY0QsOENBeUJDO0FBbk5ELHVEQUsrQjtBQUMvQixzQ0FBeUM7QUFFekMsZ0RBQWlEO0FBRWpELCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUMzQixPQUdDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFVLEVBQW9DLEVBQUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvQiw4REFBOEQ7WUFDOUQsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVwRSx5Q0FBeUM7WUFDekMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLG9DQUFvQztZQUNwQyxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQUdDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFVLEVBQW9DLEVBQUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvQiw0REFBNEQ7WUFDNUQsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVwRSxtQkFBbUI7WUFDbkIsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLG9DQUFvQztZQUNwQyxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsT0FHQztJQUVELE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBVSxFQUFvQyxFQUFFO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDL0Isc0RBQXNEO1lBQ3RELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEUseUNBQXlDO1lBQ3pDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSxvQ0FBb0M7WUFDcEMsbURBQW1EO1FBQ3JELENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixjQUFjLENBQzVCLE9BR0M7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQVUsRUFBb0MsRUFBRTtZQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDckUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQy9CLDBEQUEwRDtZQUMxRCxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUscUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXBFLG1CQUFtQjtZQUNuQixXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUscUJBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFakUsb0NBQW9DO1lBQ3BDLG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE9BR0M7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQVUsRUFBaUIsRUFBRTtZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDL0IsMkRBQTJEO1lBQzNELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEUsbUJBQW1CO1lBQ25CLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSxvQ0FBb0M7WUFDcEMsbURBQW1EO1FBQ3JELENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXNlTXV0YXRpb24sXG4gIHVzZVF1ZXJ5Q2xpZW50LFxuICBVc2VNdXRhdGlvbk9wdGlvbnMsXG4gIFVzZU11dGF0aW9uUmVzdWx0LFxufSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgTGlicmFyeVByb2dyZXNzUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBsaWJyYXJ5S2V5cyB9IGZyb20gJy4uL3F1ZXJpZXMvbGlicmFyeSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTWFyayBhIGxpYnJhcnkgaXRlbSBhcyB2aWV3ZWRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IG11dGF0ZSwgaXNQZW5kaW5nIH0gPSB1c2VNYXJrVmlld2VkKCk7XG4gKlxuICogbXV0YXRlKCdsaWItMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hcmtWaWV3ZWQoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PExpYnJhcnlQcm9ncmVzc1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvYXBpL3YxL2xpYnJhcnkvJHtpZH0vdmlld2ApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChkYXRhLCBpZCwgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgc3BlY2lmaWMgaXRlbSB0byByZWZsZWN0IHVwZGF0ZWQgdmlldyBzdGF0dXNcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGxpYnJhcnlLZXlzLmRldGFpbChpZCkgfSk7XG5cbiAgICAgIC8vIEludmFsaWRhdGUgbGlzdHMgdG8gdXBkYXRlIHZpZXcgY291bnRzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsaWJyYXJ5S2V5cy5saXN0cygpIH0pO1xuXG4gICAgICAvLyBDYWxsIHVzZXIncyBvblN1Y2Nlc3MgaWYgcHJvdmlkZWRcbiAgICAgIC8vIFVzZXIncyBvblN1Y2Nlc3MgaXMgaGFuZGxlZCBieSBzcHJlYWRpbmcgb3B0aW9uc1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogTWFyayBhIGxpYnJhcnkgaXRlbSBhcyBjb21wbGV0ZWRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IG11dGF0ZSwgaXNQZW5kaW5nIH0gPSB1c2VNYXJrQ29tcGxldGVkKCk7XG4gKlxuICogbXV0YXRlKCdsaWItMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hcmtDb21wbGV0ZWQoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PExpYnJhcnlQcm9ncmVzc1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvYXBpL3YxL2xpYnJhcnkvJHtpZH0vY29tcGxldGVgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgaWQsIGNvbnRleHQpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgdGhlIHNwZWNpZmljIGl0ZW0gdG8gcmVmbGVjdCBjb21wbGV0aW9uIHN0YXR1c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogbGlicmFyeUtleXMuZGV0YWlsKGlkKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBsaXN0c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogbGlicmFyeUtleXMubGlzdHMoKSB9KTtcblxuICAgICAgLy8gQ2FsbCB1c2VyJ3Mgb25TdWNjZXNzIGlmIHByb3ZpZGVkXG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFRvZ2dsZSBsaWtlIHN0YXR1cyBmb3IgYSBsaWJyYXJ5IGl0ZW1cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IG11dGF0ZSwgaXNQZW5kaW5nIH0gPSB1c2VUb2dnbGVMaWtlKCk7XG4gKlxuICogbXV0YXRlKCdsaWItMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVRvZ2dsZUxpa2UoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PExpYnJhcnlQcm9ncmVzc1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvYXBpL3YxL2xpYnJhcnkvJHtpZH0vbGlrZWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChkYXRhLCBpZCwgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgc3BlY2lmaWMgaXRlbSB0byByZWZsZWN0IGxpa2Ugc3RhdHVzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBsaWJyYXJ5S2V5cy5kZXRhaWwoaWQpIH0pO1xuXG4gICAgICAvLyBJbnZhbGlkYXRlIGxpc3RzIHRvIHVwZGF0ZSBsaWtlIGNvdW50c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogbGlicmFyeUtleXMubGlzdHMoKSB9KTtcblxuICAgICAgLy8gQ2FsbCB1c2VyJ3Mgb25TdWNjZXNzIGlmIHByb3ZpZGVkXG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZCBhIGJvb2ttYXJrIHRvIGEgbGlicmFyeSBpdGVtXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBtdXRhdGUsIGlzUGVuZGluZyB9ID0gdXNlQWRkQm9va21hcmsoKTtcbiAqXG4gKiBtdXRhdGUoJ2xpYi0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWRkQm9va21hcmsoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZSwgRXJyb3IsIHN0cmluZz4sXG4gICAgJ211dGF0aW9uRm4nXG4gID5cbik6IFVzZU11dGF0aW9uUmVzdWx0PExpYnJhcnlQcm9ncmVzc1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxMaWJyYXJ5UHJvZ3Jlc3NSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvYXBpL3YxL2xpYnJhcnkvJHtpZH0vYm9va21hcmtgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgaWQsIGNvbnRleHQpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgdGhlIHNwZWNpZmljIGl0ZW0gdG8gcmVmbGVjdCBib29rbWFyayBzdGF0dXNcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGxpYnJhcnlLZXlzLmRldGFpbChpZCkgfSk7XG5cbiAgICAgIC8vIEludmFsaWRhdGUgbGlzdHNcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGxpYnJhcnlLZXlzLmxpc3RzKCkgfSk7XG5cbiAgICAgIC8vIENhbGwgdXNlcidzIG9uU3VjY2VzcyBpZiBwcm92aWRlZFxuICAgICAgLy8gVXNlcidzIG9uU3VjY2VzcyBpcyBoYW5kbGVkIGJ5IHNwcmVhZGluZyBvcHRpb25zXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBib29rbWFyayBmcm9tIGEgbGlicmFyeSBpdGVtXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBtdXRhdGUsIGlzUGVuZGluZyB9ID0gdXNlUmVtb3ZlQm9va21hcmsoKTtcbiAqXG4gKiBtdXRhdGUoJ2xpYi0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVtb3ZlQm9va21hcmsoXG4gIG9wdGlvbnM/OiBPbWl0PFxuICAgIFVzZU11dGF0aW9uT3B0aW9uczx2b2lkLCBFcnJvciwgc3RyaW5nPixcbiAgICAnbXV0YXRpb25GbidcbiAgPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8dm9pZCwgRXJyb3IsIHN0cmluZz4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBhd2FpdCBjbGllbnQuZGVsZXRlKGAvYXBpL3YxL2xpYnJhcnkvJHtpZH0vYm9va21hcmtgKTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIGlkLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIHRoZSBzcGVjaWZpYyBpdGVtIHRvIHJlZmxlY3QgYm9va21hcmsgcmVtb3ZhbFxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogbGlicmFyeUtleXMuZGV0YWlsKGlkKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBsaXN0c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogbGlicmFyeUtleXMubGlzdHMoKSB9KTtcblxuICAgICAgLy8gQ2FsbCB1c2VyJ3Mgb25TdWNjZXNzIGlmIHByb3ZpZGVkXG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map Mutation Hooks
|
|
3
|
+
*
|
|
4
|
+
* TanStack Query mutation hooks for map-related write operations.
|
|
5
|
+
* These hooks handle updating user location and visibility settings.
|
|
6
|
+
*
|
|
7
|
+
* @module api/mutations/map
|
|
8
|
+
*/
|
|
9
|
+
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
10
|
+
export interface UpdateLocationRequest {
|
|
11
|
+
lat: number;
|
|
12
|
+
lng: number;
|
|
13
|
+
}
|
|
14
|
+
export interface UpdateOpenToMeetRequest {
|
|
15
|
+
openToMeet: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface LocationUpdateResponse {
|
|
18
|
+
success: boolean;
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
export interface OpenToMeetResponse {
|
|
22
|
+
openToMeet: boolean;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Update current user's location
|
|
27
|
+
*
|
|
28
|
+
* @description
|
|
29
|
+
* Updates the authenticated user's location for display on the member map.
|
|
30
|
+
* Location is only visible to other users if the user has enabled "open to meet".
|
|
31
|
+
*
|
|
32
|
+
* @endpoint PUT /api/v1/map/location
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* import { useUpdateLocation } from '@growsober/sdk';
|
|
37
|
+
*
|
|
38
|
+
* function LocationUpdater() {
|
|
39
|
+
* const updateLocation = useUpdateLocation();
|
|
40
|
+
*
|
|
41
|
+
* const handleLocationUpdate = async () => {
|
|
42
|
+
* // Get current position from device
|
|
43
|
+
* navigator.geolocation.getCurrentPosition(
|
|
44
|
+
* async (position) => {
|
|
45
|
+
* await updateLocation.mutateAsync({
|
|
46
|
+
* lat: position.coords.latitude,
|
|
47
|
+
* lng: position.coords.longitude,
|
|
48
|
+
* });
|
|
49
|
+
* },
|
|
50
|
+
* (error) => console.error('Location error:', error)
|
|
51
|
+
* );
|
|
52
|
+
* };
|
|
53
|
+
*
|
|
54
|
+
* return (
|
|
55
|
+
* <button onClick={handleLocationUpdate} disabled={updateLocation.isPending}>
|
|
56
|
+
* Update My Location
|
|
57
|
+
* </button>
|
|
58
|
+
* );
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* With Expo Location:
|
|
64
|
+
* ```tsx
|
|
65
|
+
* import * as Location from 'expo-location';
|
|
66
|
+
* import { useUpdateLocation } from '@growsober/sdk';
|
|
67
|
+
*
|
|
68
|
+
* function App() {
|
|
69
|
+
* const updateLocation = useUpdateLocation();
|
|
70
|
+
*
|
|
71
|
+
* useEffect(() => {
|
|
72
|
+
* (async () => {
|
|
73
|
+
* const { status } = await Location.requestForegroundPermissionsAsync();
|
|
74
|
+
* if (status === 'granted') {
|
|
75
|
+
* const location = await Location.getCurrentPositionAsync({});
|
|
76
|
+
* updateLocation.mutate({
|
|
77
|
+
* lat: location.coords.latitude,
|
|
78
|
+
* lng: location.coords.longitude,
|
|
79
|
+
* });
|
|
80
|
+
* }
|
|
81
|
+
* })();
|
|
82
|
+
* }, []);
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @param options - TanStack Query mutation options
|
|
87
|
+
* @returns TanStack Query mutation result
|
|
88
|
+
*/
|
|
89
|
+
export declare function useUpdateLocation(options?: Omit<UseMutationOptions<LocationUpdateResponse, Error, UpdateLocationRequest>, 'mutationFn'>): UseMutationResult<LocationUpdateResponse, Error, UpdateLocationRequest>;
|
|
90
|
+
/**
|
|
91
|
+
* Toggle "open to meet" status
|
|
92
|
+
*
|
|
93
|
+
* @description
|
|
94
|
+
* Updates the user's "open to meet" visibility setting.
|
|
95
|
+
* When enabled, the user's location will be visible to other premium members on the map.
|
|
96
|
+
* Premium feature.
|
|
97
|
+
*
|
|
98
|
+
* @endpoint PUT /api/v1/map/open-to-meet
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* import { useUpdateOpenToMeet } from '@growsober/sdk';
|
|
103
|
+
*
|
|
104
|
+
* function OpenToMeetToggle() {
|
|
105
|
+
* const updateOpenToMeet = useUpdateOpenToMeet();
|
|
106
|
+
* const [isOpen, setIsOpen] = useState(false);
|
|
107
|
+
*
|
|
108
|
+
* const handleToggle = async () => {
|
|
109
|
+
* const newValue = !isOpen;
|
|
110
|
+
* await updateOpenToMeet.mutateAsync({ openToMeet: newValue });
|
|
111
|
+
* setIsOpen(newValue);
|
|
112
|
+
* };
|
|
113
|
+
*
|
|
114
|
+
* return (
|
|
115
|
+
* <Switch
|
|
116
|
+
* checked={isOpen}
|
|
117
|
+
* onChange={handleToggle}
|
|
118
|
+
* disabled={updateOpenToMeet.isPending}
|
|
119
|
+
* />
|
|
120
|
+
* );
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* With user state:
|
|
126
|
+
* ```tsx
|
|
127
|
+
* import { useCurrentUser, useUpdateOpenToMeet } from '@growsober/sdk';
|
|
128
|
+
*
|
|
129
|
+
* function OpenToMeetSetting() {
|
|
130
|
+
* const { data: user } = useCurrentUser();
|
|
131
|
+
* const updateOpenToMeet = useUpdateOpenToMeet({
|
|
132
|
+
* onSuccess: (data) => {
|
|
133
|
+
* console.log(data.openToMeet ? 'Now visible on map!' : 'Hidden from map');
|
|
134
|
+
* },
|
|
135
|
+
* });
|
|
136
|
+
*
|
|
137
|
+
* return (
|
|
138
|
+
* <div>
|
|
139
|
+
* <label>Open to Meet</label>
|
|
140
|
+
* <Switch
|
|
141
|
+
* checked={user?.openToMeet}
|
|
142
|
+
* onChange={(checked) => updateOpenToMeet.mutate({ openToMeet: checked })}
|
|
143
|
+
* />
|
|
144
|
+
* <p>Show your location to other members</p>
|
|
145
|
+
* </div>
|
|
146
|
+
* );
|
|
147
|
+
* }
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* @param options - TanStack Query mutation options
|
|
151
|
+
* @returns TanStack Query mutation result
|
|
152
|
+
*/
|
|
153
|
+
export declare function useUpdateOpenToMeet(options?: Omit<UseMutationOptions<OpenToMeetResponse, Error, UpdateOpenToMeetRequest>, 'mutationFn'>): UseMutationResult<OpenToMeetResponse, Error, UpdateOpenToMeetRequest>;
|