@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,91 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { BookingResponse } from '../types';
3
+ export declare const bookingKeys: {
4
+ all: readonly ["bookings"];
5
+ lists: () => readonly ["bookings", "list"];
6
+ list: (filters?: BookingFilters) => readonly ["bookings", "list", BookingFilters | undefined];
7
+ details: () => readonly ["bookings", "detail"];
8
+ detail: (id: string) => readonly ["bookings", "detail", string];
9
+ mine: (filters?: BookingFilters) => readonly ["bookings", "mine", BookingFilters | undefined];
10
+ qrCode: (id: string) => readonly ["bookings", "detail", string, "qr"];
11
+ };
12
+ export interface BookingFilters {
13
+ page?: number;
14
+ limit?: number;
15
+ status?: 'CONFIRMED' | 'WAITLISTED' | 'CANCELLED';
16
+ eventId?: string;
17
+ }
18
+ export interface PaginatedBookingsResponse {
19
+ bookings: BookingResponse[];
20
+ total: number;
21
+ page: number;
22
+ limit: number;
23
+ totalPages: number;
24
+ }
25
+ export interface QrCodeResponse {
26
+ qrCode: string;
27
+ bookingId: string;
28
+ }
29
+ /**
30
+ * Get a single booking by ID
31
+ *
32
+ * @param id - Booking ID
33
+ * @param options - TanStack Query options
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * const { data, isLoading } = useBooking('booking-123');
38
+ * ```
39
+ */
40
+ export declare function useBooking(id: string, options?: Omit<UseQueryOptions<BookingResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
41
+ id: string;
42
+ eventId: string;
43
+ userId?: Record<string, never>;
44
+ guestName?: Record<string, never>;
45
+ guestEmail?: Record<string, never>;
46
+ guestPhone?: Record<string, never>;
47
+ ticketCount: number;
48
+ totalPrice?: Record<string, never>;
49
+ status: "PENDING" | "CONFIRMED" | "WAITLISTED" | "CANCELLED" | "NO_SHOW";
50
+ waitlistPosition?: Record<string, never>;
51
+ isCheckedIn: boolean;
52
+ checkedInAt?: Record<string, never>;
53
+ checkedInBy?: Record<string, never>;
54
+ paymentId?: Record<string, never>;
55
+ paymentStatus?: "PENDING" | "COMPLETED" | "FAILED" | "REFUNDED";
56
+ qrCode?: Record<string, never>;
57
+ notes?: Record<string, never>;
58
+ createdAt: string;
59
+ updatedAt: string;
60
+ cancelledAt?: Record<string, never>;
61
+ }, Error>;
62
+ /**
63
+ * Get current user's bookings with optional filters
64
+ *
65
+ * @param filters - Query parameters for filtering and pagination
66
+ * @param options - TanStack Query options
67
+ *
68
+ * @example
69
+ * ```tsx
70
+ * const { data, isLoading } = useMyBookings({
71
+ * page: 1,
72
+ * limit: 20,
73
+ * status: 'CONFIRMED',
74
+ * eventId: 'event-123'
75
+ * });
76
+ * ```
77
+ */
78
+ export declare function useMyBookings(filters?: BookingFilters, options?: Omit<UseQueryOptions<PaginatedBookingsResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedBookingsResponse, Error>;
79
+ /**
80
+ * Get QR code for a specific booking
81
+ *
82
+ * @param id - Booking ID
83
+ * @param options - TanStack Query options
84
+ *
85
+ * @example
86
+ * ```tsx
87
+ * const { data, isLoading } = useBookingQrCode('booking-123');
88
+ * // data.qrCode contains the QR code string for display
89
+ * ```
90
+ */
91
+ export declare function useBookingQrCode(id: string, options?: Omit<UseQueryOptions<QrCodeResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<QrCodeResponse, Error>;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bookingKeys = void 0;
4
+ exports.useBooking = useBooking;
5
+ exports.useMyBookings = useMyBookings;
6
+ exports.useBookingQrCode = useBookingQrCode;
7
+ const react_query_1 = require("@tanstack/react-query");
8
+ const client_1 = require("../client");
9
+ // ============================================================================
10
+ // QUERY KEY FACTORY
11
+ // ============================================================================
12
+ exports.bookingKeys = {
13
+ all: ['bookings'],
14
+ lists: () => [...exports.bookingKeys.all, 'list'],
15
+ list: (filters) => [...exports.bookingKeys.lists(), filters],
16
+ details: () => [...exports.bookingKeys.all, 'detail'],
17
+ detail: (id) => [...exports.bookingKeys.details(), id],
18
+ mine: (filters) => [...exports.bookingKeys.all, 'mine', filters],
19
+ qrCode: (id) => [...exports.bookingKeys.detail(id), 'qr'],
20
+ };
21
+ // ============================================================================
22
+ // QUERY HOOKS
23
+ // ============================================================================
24
+ /**
25
+ * Get a single booking by ID
26
+ *
27
+ * @param id - Booking ID
28
+ * @param options - TanStack Query options
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * const { data, isLoading } = useBooking('booking-123');
33
+ * ```
34
+ */
35
+ function useBooking(id, options) {
36
+ return (0, react_query_1.useQuery)({
37
+ queryKey: exports.bookingKeys.detail(id),
38
+ queryFn: async () => {
39
+ const client = (0, client_1.getApiClient)();
40
+ const response = await client.get(`/api/v1/bookings/${id}`);
41
+ return response.data;
42
+ },
43
+ enabled: !!id,
44
+ ...options,
45
+ });
46
+ }
47
+ /**
48
+ * Get current user's bookings with optional filters
49
+ *
50
+ * @param filters - Query parameters for filtering and pagination
51
+ * @param options - TanStack Query options
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * const { data, isLoading } = useMyBookings({
56
+ * page: 1,
57
+ * limit: 20,
58
+ * status: 'CONFIRMED',
59
+ * eventId: 'event-123'
60
+ * });
61
+ * ```
62
+ */
63
+ function useMyBookings(filters, options) {
64
+ return (0, react_query_1.useQuery)({
65
+ queryKey: exports.bookingKeys.mine(filters),
66
+ queryFn: async () => {
67
+ const client = (0, client_1.getApiClient)();
68
+ // Use /users/me/bookings - the existing API endpoint
69
+ const response = await client.get('/api/v1/users/me/bookings', {
70
+ params: filters,
71
+ });
72
+ // API returns { data: { bookings: [...] }, meta: {...} }
73
+ return response.data.data || response.data;
74
+ },
75
+ ...options,
76
+ });
77
+ }
78
+ /**
79
+ * Get QR code for a specific booking
80
+ *
81
+ * @param id - Booking ID
82
+ * @param options - TanStack Query options
83
+ *
84
+ * @example
85
+ * ```tsx
86
+ * const { data, isLoading } = useBookingQrCode('booking-123');
87
+ * // data.qrCode contains the QR code string for display
88
+ * ```
89
+ */
90
+ function useBookingQrCode(id, options) {
91
+ return (0, react_query_1.useQuery)({
92
+ queryKey: exports.bookingKeys.qrCode(id),
93
+ queryFn: async () => {
94
+ const client = (0, client_1.getApiClient)();
95
+ const response = await client.get(`/api/v1/bookings/${id}/qr`);
96
+ return response.data;
97
+ },
98
+ enabled: !!id,
99
+ ...options,
100
+ });
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvYm9va2luZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeURBLGdDQWNDO0FBa0JELHNDQWlCQztBQWNELDRDQWNDO0FBdElELHVEQUFrRTtBQUNsRSxzQ0FBeUM7QUFHekMsK0VBQStFO0FBQy9FLG9CQUFvQjtBQUNwQiwrRUFBK0U7QUFFbEUsUUFBQSxXQUFXLEdBQUc7SUFDekIsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFVO0lBQzFCLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFVO0lBQ2xELElBQUksRUFBRSxDQUFDLE9BQXdCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBVTtJQUM5RSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLG1CQUFXLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBVTtJQUN0RCxNQUFNLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBVTtJQUMvRCxJQUFJLEVBQUUsQ0FBQyxPQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBVTtJQUNsRixNQUFNLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxtQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQVU7Q0FDbkUsQ0FBQztBQTBCRiwrRUFBK0U7QUFDL0UsY0FBYztBQUNkLCtFQUErRTtBQUUvRTs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixFQUFVLEVBQ1YsT0FBd0U7SUFFeEUsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsbUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sRUFBRSxLQUFLLElBQThCLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ2IsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsT0FBd0IsRUFDeEIsT0FBa0Y7SUFFbEYsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsbUJBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ25DLE9BQU8sRUFBRSxLQUFLLElBQXdDLEVBQUU7WUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIscURBQXFEO1lBQ3JELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRTtnQkFDN0QsTUFBTSxFQUFFLE9BQU87YUFDaEIsQ0FBQyxDQUFDO1lBQ0gseURBQXlEO1lBQ3pELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUM3QyxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLEVBQVUsRUFDVixPQUF1RTtJQUV2RSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxtQkFBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxFQUFFLEtBQUssSUFBNkIsRUFBRTtZQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDYixHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlUXVlcnksIFVzZVF1ZXJ5T3B0aW9ucyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBCb29raW5nUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWSBGQUNUT1JZXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBib29raW5nS2V5cyA9IHtcbiAgYWxsOiBbJ2Jvb2tpbmdzJ10gYXMgY29uc3QsXG4gIGxpc3RzOiAoKSA9PiBbLi4uYm9va2luZ0tleXMuYWxsLCAnbGlzdCddIGFzIGNvbnN0LFxuICBsaXN0OiAoZmlsdGVycz86IEJvb2tpbmdGaWx0ZXJzKSA9PiBbLi4uYm9va2luZ0tleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5ib29raW5nS2V5cy5hbGwsICdkZXRhaWwnXSBhcyBjb25zdCxcbiAgZGV0YWlsOiAoaWQ6IHN0cmluZykgPT4gWy4uLmJvb2tpbmdLZXlzLmRldGFpbHMoKSwgaWRdIGFzIGNvbnN0LFxuICBtaW5lOiAoZmlsdGVycz86IEJvb2tpbmdGaWx0ZXJzKSA9PiBbLi4uYm9va2luZ0tleXMuYWxsLCAnbWluZScsIGZpbHRlcnNdIGFzIGNvbnN0LFxuICBxckNvZGU6IChpZDogc3RyaW5nKSA9PiBbLi4uYm9va2luZ0tleXMuZGV0YWlsKGlkKSwgJ3FyJ10gYXMgY29uc3QsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb2tpbmdGaWx0ZXJzIHtcbiAgcGFnZT86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHN0YXR1cz86ICdDT05GSVJNRUQnIHwgJ1dBSVRMSVNURUQnIHwgJ0NBTkNFTExFRCc7XG4gIGV2ZW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVkQm9va2luZ3NSZXNwb25zZSB7XG4gIGJvb2tpbmdzOiBCb29raW5nUmVzcG9uc2VbXTtcbiAgdG90YWw6IG51bWJlcjtcbiAgcGFnZTogbnVtYmVyO1xuICBsaW1pdDogbnVtYmVyO1xuICB0b3RhbFBhZ2VzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXJDb2RlUmVzcG9uc2Uge1xuICBxckNvZGU6IHN0cmluZztcbiAgYm9va2luZ0lkOiBzdHJpbmc7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIGJvb2tpbmcgYnkgSURcbiAqXG4gKiBAcGFyYW0gaWQgLSBCb29raW5nIElEXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlQm9va2luZygnYm9va2luZy0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQm9va2luZyhcbiAgaWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPEJvb2tpbmdSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogYm9va2luZ0tleXMuZGV0YWlsKGlkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxCb29raW5nUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL2Jvb2tpbmdzLyR7aWR9YCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGN1cnJlbnQgdXNlcidzIGJvb2tpbmdzIHdpdGggb3B0aW9uYWwgZmlsdGVyc1xuICpcbiAqIEBwYXJhbSBmaWx0ZXJzIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlTXlCb29raW5ncyh7XG4gKiAgIHBhZ2U6IDEsXG4gKiAgIGxpbWl0OiAyMCxcbiAqICAgc3RhdHVzOiAnQ09ORklSTUVEJyxcbiAqICAgZXZlbnRJZDogJ2V2ZW50LTEyMydcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNeUJvb2tpbmdzKFxuICBmaWx0ZXJzPzogQm9va2luZ0ZpbHRlcnMsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxQYWdpbmF0ZWRCb29raW5nc1Jlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBib29raW5nS2V5cy5taW5lKGZpbHRlcnMpLFxuICAgIHF1ZXJ5Rm46IGFzeW5jICgpOiBQcm9taXNlPFBhZ2luYXRlZEJvb2tpbmdzUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgLy8gVXNlIC91c2Vycy9tZS9ib29raW5ncyAtIHRoZSBleGlzdGluZyBBUEkgZW5kcG9pbnRcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldCgnL2FwaS92MS91c2Vycy9tZS9ib29raW5ncycsIHtcbiAgICAgICAgcGFyYW1zOiBmaWx0ZXJzLFxuICAgICAgfSk7XG4gICAgICAvLyBBUEkgcmV0dXJucyB7IGRhdGE6IHsgYm9va2luZ3M6IFsuLi5dIH0sIG1ldGE6IHsuLi59IH1cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhLmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBRUiBjb2RlIGZvciBhIHNwZWNpZmljIGJvb2tpbmdcbiAqXG4gKiBAcGFyYW0gaWQgLSBCb29raW5nIElEXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlQm9va2luZ1FyQ29kZSgnYm9va2luZy0xMjMnKTtcbiAqIC8vIGRhdGEucXJDb2RlIGNvbnRhaW5zIHRoZSBRUiBjb2RlIHN0cmluZyBmb3IgZGlzcGxheVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCb29raW5nUXJDb2RlKFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UXJDb2RlUmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGJvb2tpbmdLZXlzLnFyQ29kZShpZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8UXJDb2RlUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL2Jvb2tpbmdzLyR7aWR9L3FyYCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,212 @@
1
+ import { UseQueryOptions } from '@tanstack/react-query';
2
+ import type { BusinessResponse, OfferResponse } from '../types';
3
+ export declare const businessKeys: {
4
+ all: readonly ["businesses"];
5
+ lists: () => readonly ["businesses", "list"];
6
+ list: (filters?: BusinessFilters) => readonly ["businesses", "list", BusinessFilters | undefined];
7
+ details: () => readonly ["businesses", "detail"];
8
+ detail: (id: string) => readonly ["businesses", "detail", string];
9
+ featured: () => readonly ["businesses", "featured"];
10
+ nearby: (params?: NearbyBusinessParams) => readonly ["businesses", "nearby", NearbyBusinessParams | undefined];
11
+ offers: (businessId: string) => readonly ["businesses", "detail", string, "offers"];
12
+ };
13
+ export interface BusinessFilters {
14
+ page?: number;
15
+ limit?: number;
16
+ search?: string;
17
+ cityId?: string;
18
+ type?: string;
19
+ hasAfDrinks?: boolean;
20
+ isAfVenue?: boolean;
21
+ isFeatured?: boolean;
22
+ isPartner?: boolean;
23
+ lat?: number;
24
+ long?: number;
25
+ radius?: number;
26
+ sortBy?: string;
27
+ sortOrder?: 'asc' | 'desc';
28
+ }
29
+ export interface NearbyBusinessParams {
30
+ lat: number;
31
+ long: number;
32
+ radius?: number;
33
+ }
34
+ export interface PaginatedBusinessesResponse {
35
+ businesses: BusinessResponse[];
36
+ total: number;
37
+ page: number;
38
+ limit: number;
39
+ totalPages: number;
40
+ }
41
+ /**
42
+ * Get paginated list of businesses with optional filters
43
+ *
44
+ * @param filters - Query parameters for filtering and pagination
45
+ * @param options - TanStack Query options
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const { data, isLoading } = useBusinesses({
50
+ * page: 1,
51
+ * limit: 20,
52
+ * cityId: 'city-123',
53
+ * hasAfDrinks: true,
54
+ * sortBy: 'name',
55
+ * sortOrder: 'asc'
56
+ * });
57
+ * ```
58
+ */
59
+ export declare function useBusinesses(filters?: BusinessFilters, options?: Omit<UseQueryOptions<PaginatedBusinessesResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<PaginatedBusinessesResponse, Error>;
60
+ /**
61
+ * Get featured businesses
62
+ *
63
+ * @param options - TanStack Query options
64
+ *
65
+ * @example
66
+ * ```tsx
67
+ * const { data, isLoading } = useFeaturedBusinesses();
68
+ * ```
69
+ */
70
+ export declare function useFeaturedBusinesses(options?: Omit<UseQueryOptions<BusinessResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
71
+ id: string;
72
+ appId: string;
73
+ name: string;
74
+ slug?: Record<string, never>;
75
+ description?: Record<string, never>;
76
+ type: "COFFEE_SHOP" | "RESTAURANT" | "BAR" | "WELLNESS" | "VENUE" | "ACTIVITY" | "RETAIL" | "OTHER";
77
+ hasAfDrinks: boolean;
78
+ isAfVenue: boolean;
79
+ afHighlights: string[];
80
+ address?: Record<string, never>;
81
+ cityId?: Record<string, never>;
82
+ locationLat?: Record<string, never>;
83
+ locationLong?: Record<string, never>;
84
+ phone?: Record<string, never>;
85
+ email?: Record<string, never>;
86
+ website?: Record<string, never>;
87
+ instagramUrl?: Record<string, never>;
88
+ profileImage?: Record<string, never>;
89
+ bannerImage?: Record<string, never>;
90
+ photos: string[];
91
+ openingHours?: Record<string, never>;
92
+ isActive: boolean;
93
+ isVerified: boolean;
94
+ isFeatured: boolean;
95
+ isPartner: boolean;
96
+ createdAt: string;
97
+ updatedAt: string;
98
+ }[], Error>;
99
+ /**
100
+ * Get nearby businesses based on location
101
+ *
102
+ * @param params - Location parameters (latitude, longitude, radius)
103
+ * @param options - TanStack Query options
104
+ *
105
+ * @example
106
+ * ```tsx
107
+ * const { data, isLoading } = useNearbyBusinesses({
108
+ * lat: 51.5074,
109
+ * long: -0.1278,
110
+ * radius: 5000 // 5km radius
111
+ * });
112
+ * ```
113
+ */
114
+ export declare function useNearbyBusinesses(params: NearbyBusinessParams, options?: Omit<UseQueryOptions<BusinessResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
115
+ id: string;
116
+ appId: string;
117
+ name: string;
118
+ slug?: Record<string, never>;
119
+ description?: Record<string, never>;
120
+ type: "COFFEE_SHOP" | "RESTAURANT" | "BAR" | "WELLNESS" | "VENUE" | "ACTIVITY" | "RETAIL" | "OTHER";
121
+ hasAfDrinks: boolean;
122
+ isAfVenue: boolean;
123
+ afHighlights: string[];
124
+ address?: Record<string, never>;
125
+ cityId?: Record<string, never>;
126
+ locationLat?: Record<string, never>;
127
+ locationLong?: Record<string, never>;
128
+ phone?: Record<string, never>;
129
+ email?: Record<string, never>;
130
+ website?: Record<string, never>;
131
+ instagramUrl?: Record<string, never>;
132
+ profileImage?: Record<string, never>;
133
+ bannerImage?: Record<string, never>;
134
+ photos: string[];
135
+ openingHours?: Record<string, never>;
136
+ isActive: boolean;
137
+ isVerified: boolean;
138
+ isFeatured: boolean;
139
+ isPartner: boolean;
140
+ createdAt: string;
141
+ updatedAt: string;
142
+ }[], Error>;
143
+ /**
144
+ * Get a single business by ID
145
+ *
146
+ * @param id - Business ID
147
+ * @param options - TanStack Query options
148
+ *
149
+ * @example
150
+ * ```tsx
151
+ * const { data, isLoading } = useBusiness('business-123');
152
+ * ```
153
+ */
154
+ export declare function useBusiness(id: string, options?: Omit<UseQueryOptions<BusinessResponse>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
155
+ id: string;
156
+ appId: string;
157
+ name: string;
158
+ slug?: Record<string, never>;
159
+ description?: Record<string, never>;
160
+ type: "COFFEE_SHOP" | "RESTAURANT" | "BAR" | "WELLNESS" | "VENUE" | "ACTIVITY" | "RETAIL" | "OTHER";
161
+ hasAfDrinks: boolean;
162
+ isAfVenue: boolean;
163
+ afHighlights: string[];
164
+ address?: Record<string, never>;
165
+ cityId?: Record<string, never>;
166
+ locationLat?: Record<string, never>;
167
+ locationLong?: Record<string, never>;
168
+ phone?: Record<string, never>;
169
+ email?: Record<string, never>;
170
+ website?: Record<string, never>;
171
+ instagramUrl?: Record<string, never>;
172
+ profileImage?: Record<string, never>;
173
+ bannerImage?: Record<string, never>;
174
+ photos: string[];
175
+ openingHours?: Record<string, never>;
176
+ isActive: boolean;
177
+ isVerified: boolean;
178
+ isFeatured: boolean;
179
+ isPartner: boolean;
180
+ createdAt: string;
181
+ updatedAt: string;
182
+ }, Error>;
183
+ /**
184
+ * Get all offers for a specific business
185
+ *
186
+ * @param businessId - Business ID
187
+ * @param options - TanStack Query options
188
+ *
189
+ * @example
190
+ * ```tsx
191
+ * const { data, isLoading } = useBusinessOffers('business-123');
192
+ * ```
193
+ */
194
+ export declare function useBusinessOffers(businessId: string, options?: Omit<UseQueryOptions<OfferResponse[]>, 'queryKey' | 'queryFn'>): import("@tanstack/react-query").UseQueryResult<{
195
+ id: string;
196
+ businessId: string;
197
+ title: string;
198
+ description?: Record<string, never>;
199
+ discountType?: "PERCENTAGE" | "FIXED_AMOUNT" | "FREE_ITEM" | "BOGO";
200
+ discountValue?: Record<string, never>;
201
+ discountCode?: Record<string, never>;
202
+ validFrom: string;
203
+ validTo?: Record<string, never>;
204
+ terms?: Record<string, never>;
205
+ maxRedemptions?: Record<string, never>;
206
+ redemptionCount: number;
207
+ perUserLimit?: Record<string, never>;
208
+ premiumOnly: boolean;
209
+ isActive: boolean;
210
+ createdAt: string;
211
+ updatedAt: string;
212
+ }[], Error>;
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.businessKeys = void 0;
4
+ exports.useBusinesses = useBusinesses;
5
+ exports.useFeaturedBusinesses = useFeaturedBusinesses;
6
+ exports.useNearbyBusinesses = useNearbyBusinesses;
7
+ exports.useBusiness = useBusiness;
8
+ exports.useBusinessOffers = useBusinessOffers;
9
+ const react_query_1 = require("@tanstack/react-query");
10
+ const client_1 = require("../client");
11
+ // ============================================================================
12
+ // QUERY KEY FACTORY
13
+ // ============================================================================
14
+ exports.businessKeys = {
15
+ all: ['businesses'],
16
+ lists: () => [...exports.businessKeys.all, 'list'],
17
+ list: (filters) => [...exports.businessKeys.lists(), filters],
18
+ details: () => [...exports.businessKeys.all, 'detail'],
19
+ detail: (id) => [...exports.businessKeys.details(), id],
20
+ featured: () => [...exports.businessKeys.all, 'featured'],
21
+ nearby: (params) => [...exports.businessKeys.all, 'nearby', params],
22
+ offers: (businessId) => [...exports.businessKeys.detail(businessId), 'offers'],
23
+ };
24
+ // ============================================================================
25
+ // QUERY HOOKS
26
+ // ============================================================================
27
+ /**
28
+ * Get paginated list of businesses with optional filters
29
+ *
30
+ * @param filters - Query parameters for filtering and pagination
31
+ * @param options - TanStack Query options
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * const { data, isLoading } = useBusinesses({
36
+ * page: 1,
37
+ * limit: 20,
38
+ * cityId: 'city-123',
39
+ * hasAfDrinks: true,
40
+ * sortBy: 'name',
41
+ * sortOrder: 'asc'
42
+ * });
43
+ * ```
44
+ */
45
+ function useBusinesses(filters, options) {
46
+ return (0, react_query_1.useQuery)({
47
+ queryKey: exports.businessKeys.list(filters),
48
+ queryFn: async () => {
49
+ const client = (0, client_1.getApiClient)();
50
+ const response = await client.get('/api/v1/businesses', {
51
+ params: filters,
52
+ });
53
+ return response.data;
54
+ },
55
+ ...options,
56
+ });
57
+ }
58
+ /**
59
+ * Get featured businesses
60
+ *
61
+ * @param options - TanStack Query options
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * const { data, isLoading } = useFeaturedBusinesses();
66
+ * ```
67
+ */
68
+ function useFeaturedBusinesses(options) {
69
+ return (0, react_query_1.useQuery)({
70
+ queryKey: exports.businessKeys.featured(),
71
+ queryFn: async () => {
72
+ const client = (0, client_1.getApiClient)();
73
+ const response = await client.get('/api/v1/businesses/featured');
74
+ return response.data;
75
+ },
76
+ ...options,
77
+ });
78
+ }
79
+ /**
80
+ * Get nearby businesses based on location
81
+ *
82
+ * @param params - Location parameters (latitude, longitude, radius)
83
+ * @param options - TanStack Query options
84
+ *
85
+ * @example
86
+ * ```tsx
87
+ * const { data, isLoading } = useNearbyBusinesses({
88
+ * lat: 51.5074,
89
+ * long: -0.1278,
90
+ * radius: 5000 // 5km radius
91
+ * });
92
+ * ```
93
+ */
94
+ function useNearbyBusinesses(params, options) {
95
+ return (0, react_query_1.useQuery)({
96
+ queryKey: exports.businessKeys.nearby(params),
97
+ queryFn: async () => {
98
+ const client = (0, client_1.getApiClient)();
99
+ const response = await client.get('/api/v1/businesses/nearby', {
100
+ params,
101
+ });
102
+ return response.data;
103
+ },
104
+ enabled: !!params.lat && !!params.long,
105
+ ...options,
106
+ });
107
+ }
108
+ /**
109
+ * Get a single business by ID
110
+ *
111
+ * @param id - Business ID
112
+ * @param options - TanStack Query options
113
+ *
114
+ * @example
115
+ * ```tsx
116
+ * const { data, isLoading } = useBusiness('business-123');
117
+ * ```
118
+ */
119
+ function useBusiness(id, options) {
120
+ return (0, react_query_1.useQuery)({
121
+ queryKey: exports.businessKeys.detail(id),
122
+ queryFn: async () => {
123
+ const client = (0, client_1.getApiClient)();
124
+ const response = await client.get(`/api/v1/businesses/${id}`);
125
+ return response.data;
126
+ },
127
+ enabled: !!id,
128
+ ...options,
129
+ });
130
+ }
131
+ /**
132
+ * Get all offers for a specific business
133
+ *
134
+ * @param businessId - Business ID
135
+ * @param options - TanStack Query options
136
+ *
137
+ * @example
138
+ * ```tsx
139
+ * const { data, isLoading } = useBusinessOffers('business-123');
140
+ * ```
141
+ */
142
+ function useBusinessOffers(businessId, options) {
143
+ return (0, react_query_1.useQuery)({
144
+ queryKey: exports.businessKeys.offers(businessId),
145
+ queryFn: async () => {
146
+ const client = (0, client_1.getApiClient)();
147
+ const response = await client.get(`/api/v1/businesses/${businessId}/offers`);
148
+ return response.data;
149
+ },
150
+ enabled: !!businessId,
151
+ ...options,
152
+ });
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzaW5lc3Nlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcXVlcmllcy9idXNpbmVzc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRFQSxzQ0FlQztBQVlELHNEQVlDO0FBaUJELGtEQWdCQztBQWFELGtDQWNDO0FBYUQsOENBY0M7QUExTUQsdURBQWtFO0FBQ2xFLHNDQUF5QztBQUd6QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUVsRSxRQUFBLFlBQVksR0FBRztJQUMxQixHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQVU7SUFDNUIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxvQkFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQVU7SUFDbkQsSUFBSSxFQUFFLENBQUMsT0FBeUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLG9CQUFZLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFVO0lBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFVO0lBQ3ZELE1BQU0sRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLG9CQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFVO0lBQ2hFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsb0JBQVksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFVO0lBQzFELE1BQU0sRUFBRSxDQUFDLE1BQTZCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxvQkFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFVO0lBQzNGLE1BQU0sRUFBRSxDQUFDLFVBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxvQkFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLENBQVU7Q0FDeEYsQ0FBQztB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QUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLHNCQUFzQixVQUFVLFNBQVMsQ0FBQyxDQUFDO1lBQzdFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVO1FBQ3JCLEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGdldEFwaUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEJ1c2luZXNzUmVzcG9uc2UsIE9mZmVyUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEtFWSBGQUNUT1JZXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBidXNpbmVzc0tleXMgPSB7XG4gIGFsbDogWydidXNpbmVzc2VzJ10gYXMgY29uc3QsXG4gIGxpc3RzOiAoKSA9PiBbLi4uYnVzaW5lc3NLZXlzLmFsbCwgJ2xpc3QnXSBhcyBjb25zdCxcbiAgbGlzdDogKGZpbHRlcnM/OiBCdXNpbmVzc0ZpbHRlcnMpID0+IFsuLi5idXNpbmVzc0tleXMubGlzdHMoKSwgZmlsdGVyc10gYXMgY29uc3QsXG4gIGRldGFpbHM6ICgpID0+IFsuLi5idXNpbmVzc0tleXMuYWxsLCAnZGV0YWlsJ10gYXMgY29uc3QsXG4gIGRldGFpbDogKGlkOiBzdHJpbmcpID0+IFsuLi5idXNpbmVzc0tleXMuZGV0YWlscygpLCBpZF0gYXMgY29uc3QsXG4gIGZlYXR1cmVkOiAoKSA9PiBbLi4uYnVzaW5lc3NLZXlzLmFsbCwgJ2ZlYXR1cmVkJ10gYXMgY29uc3QsXG4gIG5lYXJieTogKHBhcmFtcz86IE5lYXJieUJ1c2luZXNzUGFyYW1zKSA9PiBbLi4uYnVzaW5lc3NLZXlzLmFsbCwgJ25lYXJieScsIHBhcmFtc10gYXMgY29uc3QsXG4gIG9mZmVyczogKGJ1c2luZXNzSWQ6IHN0cmluZykgPT4gWy4uLmJ1c2luZXNzS2V5cy5kZXRhaWwoYnVzaW5lc3NJZCksICdvZmZlcnMnXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NGaWx0ZXJzIHtcbiAgcGFnZT86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHNlYXJjaD86IHN0cmluZztcbiAgY2l0eUlkPzogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBoYXNBZkRyaW5rcz86IGJvb2xlYW47XG4gIGlzQWZWZW51ZT86IGJvb2xlYW47XG4gIGlzRmVhdHVyZWQ/OiBib29sZWFuO1xuICBpc1BhcnRuZXI/OiBib29sZWFuO1xuICBsYXQ/OiBudW1iZXI7XG4gIGxvbmc/OiBudW1iZXI7XG4gIHJhZGl1cz86IG51bWJlcjtcbiAgc29ydEJ5Pzogc3RyaW5nO1xuICBzb3J0T3JkZXI/OiAnYXNjJyB8ICdkZXNjJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZWFyYnlCdXNpbmVzc1BhcmFtcyB7XG4gIGxhdDogbnVtYmVyO1xuICBsb25nOiBudW1iZXI7XG4gIHJhZGl1cz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRCdXNpbmVzc2VzUmVzcG9uc2Uge1xuICBidXNpbmVzc2VzOiBCdXNpbmVzc1Jlc3BvbnNlW107XG4gIHRvdGFsOiBudW1iZXI7XG4gIHBhZ2U6IG51bWJlcjtcbiAgbGltaXQ6IG51bWJlcjtcbiAgdG90YWxQYWdlczogbnVtYmVyO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdldCBwYWdpbmF0ZWQgbGlzdCBvZiBidXNpbmVzc2VzIHdpdGggb3B0aW9uYWwgZmlsdGVyc1xuICpcbiAqIEBwYXJhbSBmaWx0ZXJzIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGEsIGlzTG9hZGluZyB9ID0gdXNlQnVzaW5lc3Nlcyh7XG4gKiAgIHBhZ2U6IDEsXG4gKiAgIGxpbWl0OiAyMCxcbiAqICAgY2l0eUlkOiAnY2l0eS0xMjMnLFxuICogICBoYXNBZkRyaW5rczogdHJ1ZSxcbiAqICAgc29ydEJ5OiAnbmFtZScsXG4gKiAgIHNvcnRPcmRlcjogJ2FzYydcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCdXNpbmVzc2VzKFxuICBmaWx0ZXJzPzogQnVzaW5lc3NGaWx0ZXJzLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8UGFnaW5hdGVkQnVzaW5lc3Nlc1Jlc3BvbnNlPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBidXNpbmVzc0tleXMubGlzdChmaWx0ZXJzKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxQYWdpbmF0ZWRCdXNpbmVzc2VzUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL2J1c2luZXNzZXMnLCB7XG4gICAgICAgIHBhcmFtczogZmlsdGVycyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgZmVhdHVyZWQgYnVzaW5lc3Nlc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VGZWF0dXJlZEJ1c2luZXNzZXMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmVhdHVyZWRCdXNpbmVzc2VzKFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8QnVzaW5lc3NSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlUXVlcnkoe1xuICAgIHF1ZXJ5S2V5OiBidXNpbmVzc0tleXMuZmVhdHVyZWQoKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxCdXNpbmVzc1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL2J1c2luZXNzZXMvZmVhdHVyZWQnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IG5lYXJieSBidXNpbmVzc2VzIGJhc2VkIG9uIGxvY2F0aW9uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIExvY2F0aW9uIHBhcmFtZXRlcnMgKGxhdGl0dWRlLCBsb25naXR1ZGUsIHJhZGl1cylcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VOZWFyYnlCdXNpbmVzc2VzKHtcbiAqICAgbGF0OiA1MS41MDc0LFxuICogICBsb25nOiAtMC4xMjc4LFxuICogICByYWRpdXM6IDUwMDAgLy8gNWttIHJhZGl1c1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU5lYXJieUJ1c2luZXNzZXMoXG4gIHBhcmFtczogTmVhcmJ5QnVzaW5lc3NQYXJhbXMsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxCdXNpbmVzc1Jlc3BvbnNlW10+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGJ1c2luZXNzS2V5cy5uZWFyYnkocGFyYW1zKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxCdXNpbmVzc1Jlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KCcvYXBpL3YxL2J1c2luZXNzZXMvbmVhcmJ5Jywge1xuICAgICAgICBwYXJhbXMsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFwYXJhbXMubGF0ICYmICEhcGFyYW1zLmxvbmcsXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2V0IGEgc2luZ2xlIGJ1c2luZXNzIGJ5IElEXG4gKlxuICogQHBhcmFtIGlkIC0gQnVzaW5lc3MgSURcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nIH0gPSB1c2VCdXNpbmVzcygnYnVzaW5lc3MtMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUJ1c2luZXNzKFxuICBpZDogc3RyaW5nLFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8QnVzaW5lc3NSZXNwb25zZT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogYnVzaW5lc3NLZXlzLmRldGFpbChpZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8QnVzaW5lc3NSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoYC9hcGkvdjEvYnVzaW5lc3Nlcy8ke2lkfWApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBlbmFibGVkOiAhIWlkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhbGwgb2ZmZXJzIGZvciBhIHNwZWNpZmljIGJ1c2luZXNzXG4gKlxuICogQHBhcmFtIGJ1c2luZXNzSWQgLSBCdXNpbmVzcyBJRFxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcgfSA9IHVzZUJ1c2luZXNzT2ZmZXJzKCdidXNpbmVzcy0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQnVzaW5lc3NPZmZlcnMoXG4gIGJ1c2luZXNzSWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPE9mZmVyUmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pIHtcbiAgcmV0dXJuIHVzZVF1ZXJ5KHtcbiAgICBxdWVyeUtleTogYnVzaW5lc3NLZXlzLm9mZmVycyhidXNpbmVzc0lkKSxcbiAgICBxdWVyeUZuOiBhc3luYyAoKTogUHJvbWlzZTxPZmZlclJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0KGAvYXBpL3YxL2J1c2luZXNzZXMvJHtidXNpbmVzc0lkfS9vZmZlcnNgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgZW5hYmxlZDogISFidXNpbmVzc0lkLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,19 @@
1
+ import type { EventChatResponse, ChatMemberResponse, PaginatedMessagesResponse } from '../types';
2
+ export declare const eventChatKeys: {
3
+ all: readonly ["event-chat"];
4
+ chat: (eventId: string) => readonly ["event-chat", "chat", string];
5
+ members: (eventId: string) => readonly ["event-chat", "members", string];
6
+ messages: (eventId: string) => readonly ["event-chat", "messages", string];
7
+ };
8
+ /**
9
+ * Get or create chat for an event
10
+ */
11
+ export declare function useEventChat(eventId: string | undefined): import("@tanstack/react-query").UseQueryResult<EventChatResponse, Error>;
12
+ /**
13
+ * Get chat members
14
+ */
15
+ export declare function useEventChatMembers(eventId: string | undefined): import("@tanstack/react-query").UseQueryResult<ChatMemberResponse[], Error>;
16
+ /**
17
+ * Get chat messages with infinite scroll pagination
18
+ */
19
+ export declare function useEventChatMessages(eventId: string | undefined, limit?: number): import("@tanstack/react-query").UseInfiniteQueryResult<import("@tanstack/react-query").InfiniteData<PaginatedMessagesResponse, unknown>, Error>;