@growsober/sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +276 -0
  2. package/dist/__tests__/e2e.test.d.ts +7 -0
  3. package/dist/__tests__/e2e.test.js +472 -0
  4. package/dist/api/client.d.ts +11 -0
  5. package/dist/api/client.js +61 -0
  6. package/dist/api/mutations/admin.d.ts +167 -0
  7. package/dist/api/mutations/admin.js +326 -0
  8. package/dist/api/mutations/ambassadors.d.ts +52 -0
  9. package/dist/api/mutations/ambassadors.js +148 -0
  10. package/dist/api/mutations/auth.d.ts +267 -0
  11. package/dist/api/mutations/auth.js +332 -0
  12. package/dist/api/mutations/bookings.d.ts +59 -0
  13. package/dist/api/mutations/bookings.js +143 -0
  14. package/dist/api/mutations/event-chat.d.ts +35 -0
  15. package/dist/api/mutations/event-chat.js +147 -0
  16. package/dist/api/mutations/events.d.ts +87 -0
  17. package/dist/api/mutations/events.js +205 -0
  18. package/dist/api/mutations/grow90.d.ts +36 -0
  19. package/dist/api/mutations/grow90.js +132 -0
  20. package/dist/api/mutations/hubs.d.ts +111 -0
  21. package/dist/api/mutations/hubs.js +240 -0
  22. package/dist/api/mutations/index.d.ts +22 -0
  23. package/dist/api/mutations/index.js +39 -0
  24. package/dist/api/mutations/jack.d.ts +61 -0
  25. package/dist/api/mutations/jack.js +104 -0
  26. package/dist/api/mutations/library.d.ts +67 -0
  27. package/dist/api/mutations/library.js +168 -0
  28. package/dist/api/mutations/map.d.ts +153 -0
  29. package/dist/api/mutations/map.js +181 -0
  30. package/dist/api/mutations/matching.d.ts +130 -0
  31. package/dist/api/mutations/matching.js +204 -0
  32. package/dist/api/mutations/notifications.d.ts +63 -0
  33. package/dist/api/mutations/notifications.js +106 -0
  34. package/dist/api/mutations/offers.d.ts +26 -0
  35. package/dist/api/mutations/offers.js +47 -0
  36. package/dist/api/mutations/subscriptions.d.ts +127 -0
  37. package/dist/api/mutations/subscriptions.js +140 -0
  38. package/dist/api/mutations/support.d.ts +165 -0
  39. package/dist/api/mutations/support.js +307 -0
  40. package/dist/api/mutations/users.d.ts +211 -0
  41. package/dist/api/mutations/users.js +261 -0
  42. package/dist/api/queries/admin.d.ts +257 -0
  43. package/dist/api/queries/admin.js +320 -0
  44. package/dist/api/queries/ambassadors.d.ts +53 -0
  45. package/dist/api/queries/ambassadors.js +98 -0
  46. package/dist/api/queries/auth.d.ts +16 -0
  47. package/dist/api/queries/auth.js +25 -0
  48. package/dist/api/queries/bookings.d.ts +91 -0
  49. package/dist/api/queries/bookings.js +102 -0
  50. package/dist/api/queries/businesses.d.ts +212 -0
  51. package/dist/api/queries/businesses.js +154 -0
  52. package/dist/api/queries/event-chat.d.ts +19 -0
  53. package/dist/api/queries/event-chat.js +75 -0
  54. package/dist/api/queries/events.d.ts +322 -0
  55. package/dist/api/queries/events.js +221 -0
  56. package/dist/api/queries/grow90.d.ts +26 -0
  57. package/dist/api/queries/grow90.js +85 -0
  58. package/dist/api/queries/hubs.d.ts +165 -0
  59. package/dist/api/queries/hubs.js +143 -0
  60. package/dist/api/queries/index.d.ts +23 -0
  61. package/dist/api/queries/index.js +40 -0
  62. package/dist/api/queries/jack.d.ts +63 -0
  63. package/dist/api/queries/jack.js +92 -0
  64. package/dist/api/queries/library.d.ts +132 -0
  65. package/dist/api/queries/library.js +120 -0
  66. package/dist/api/queries/map.d.ts +216 -0
  67. package/dist/api/queries/map.js +278 -0
  68. package/dist/api/queries/matching.d.ts +136 -0
  69. package/dist/api/queries/matching.js +161 -0
  70. package/dist/api/queries/notifications.d.ts +78 -0
  71. package/dist/api/queries/notifications.js +88 -0
  72. package/dist/api/queries/offers.d.ts +91 -0
  73. package/dist/api/queries/offers.js +103 -0
  74. package/dist/api/queries/subscriptions.d.ts +56 -0
  75. package/dist/api/queries/subscriptions.js +73 -0
  76. package/dist/api/queries/support.d.ts +106 -0
  77. package/dist/api/queries/support.js +202 -0
  78. package/dist/api/queries/users.d.ts +293 -0
  79. package/dist/api/queries/users.js +370 -0
  80. package/dist/api/types.d.ts +464 -0
  81. package/dist/api/types.js +9 -0
  82. package/dist/hooks/useAuth.d.ts +5 -0
  83. package/dist/hooks/useAuth.js +39 -0
  84. package/dist/hooks/useUser.d.ts +43 -0
  85. package/dist/hooks/useUser.js +44 -0
  86. package/dist/index.d.ts +36 -0
  87. package/dist/index.js +67 -0
  88. package/package.json +62 -0
  89. package/src/__tests__/e2e.test.ts +502 -0
  90. package/src/api/client.ts +71 -0
  91. package/src/api/mutations/admin.ts +531 -0
  92. package/src/api/mutations/ambassadors.ts +185 -0
  93. package/src/api/mutations/auth.ts +350 -0
  94. package/src/api/mutations/bookings.ts +190 -0
  95. package/src/api/mutations/event-chat.ts +177 -0
  96. package/src/api/mutations/events.ts +273 -0
  97. package/src/api/mutations/grow90.ts +169 -0
  98. package/src/api/mutations/hubs.ts +385 -0
  99. package/src/api/mutations/index.ts +23 -0
  100. package/src/api/mutations/jack.ts +130 -0
  101. package/src/api/mutations/library.ts +212 -0
  102. package/src/api/mutations/map.ts +230 -0
  103. package/src/api/mutations/matching.ts +271 -0
  104. package/src/api/mutations/notifications.ts +114 -0
  105. package/src/api/mutations/offers.ts +73 -0
  106. package/src/api/mutations/subscriptions.ts +162 -0
  107. package/src/api/mutations/support.ts +390 -0
  108. package/src/api/mutations/users.ts +271 -0
  109. package/src/api/queries/admin.ts +480 -0
  110. package/src/api/queries/ambassadors.ts +139 -0
  111. package/src/api/queries/auth.ts +24 -0
  112. package/src/api/queries/bookings.ts +135 -0
  113. package/src/api/queries/businesses.ts +203 -0
  114. package/src/api/queries/event-chat.ts +78 -0
  115. package/src/api/queries/events.ts +272 -0
  116. package/src/api/queries/grow90.ts +98 -0
  117. package/src/api/queries/hubs.ts +211 -0
  118. package/src/api/queries/index.ts +24 -0
  119. package/src/api/queries/jack.ts +127 -0
  120. package/src/api/queries/library.ts +166 -0
  121. package/src/api/queries/map.ts +331 -0
  122. package/src/api/queries/matching.ts +238 -0
  123. package/src/api/queries/notifications.ts +103 -0
  124. package/src/api/queries/offers.ts +136 -0
  125. package/src/api/queries/subscriptions.ts +91 -0
  126. package/src/api/queries/support.ts +235 -0
  127. package/src/api/queries/users.ts +393 -0
  128. package/src/api/types.ts +596 -0
  129. package/src/index.ts +57 -0
@@ -0,0 +1,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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicmFyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2xpYnJhcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsc0NBMEJDO0FBY0QsNENBMEJDO0FBY0Qsc0NBMEJDO0FBY0Qsd0NBMEJDO0FBY0QsOENBeUJDO0FBbk5ELHVEQUsrQjtBQUMvQixzQ0FBeUM7QUFFekMsZ0RBQWlEO0FBRWpELCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUMzQixPQUdDO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFVLEVBQW9DLEVBQUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvQiw4REFBOEQ7WUFDOUQsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVwRSx5Q0FBeUM7WUFDekMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLHFCQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWpFLG9DQUFvQztZQUNwQyxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNM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RUFBRSxRQUFRLEVBQUUscUJBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFakUsb0NBQW9DO1lBQ3BDLG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE9BR0M7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQVUsRUFBaUIsRUFBRTtZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDL0IsMkRBQTJEO1lBQzNELFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEUsbUJBQW1CO1lBQ25CLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxxQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSxvQ0FBb0M7WUFDcEMsbURBQW1EO1FBQ3JELENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXNlTXV0YXRpb24sXG4gIHVzZVF1ZXJ5Q2xpZW50LFxuICBVc2VNdXRhdGlvbk9wdGlvbnMsXG4gIFVzZU11dGF0aW9uUmVzdWx0LFxufSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgTGlicmFyeVByb2dyZXNzUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBsaWJyYXJ5S2V5cyB9IGZyb20gJy4uL3F1ZXJpZXMvbGlicmFyeSc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogTWFyayBhIGxpYnJhcnkgaXRlbSBhcyB2aWV3ZWRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IG11dGF0ZSwgaXNQZW5kaW5nIH0gPSB1c2VNYXJrVmlld2VkKCk7XG4gKlxuICogbXV0YXRlKCdsaWItMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU1hcmtWaWV3ZWQoXG4gIG9wdGlvbnM/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>;