@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,332 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auth Mutation Hooks
|
|
4
|
+
*
|
|
5
|
+
* TanStack Query mutation hooks for authentication-related write operations.
|
|
6
|
+
* These hooks handle user registration, login, token refresh, and Firebase authentication.
|
|
7
|
+
*
|
|
8
|
+
* @module api/mutations/auth
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.useRegister = useRegister;
|
|
12
|
+
exports.useLogin = useLogin;
|
|
13
|
+
exports.useRefreshAuthToken = useRefreshAuthToken;
|
|
14
|
+
exports.useFirebaseAuth = useFirebaseAuth;
|
|
15
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
16
|
+
const client_1 = require("../client");
|
|
17
|
+
const users_1 = require("../queries/users");
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// MUTATION HOOKS
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Register a new user account
|
|
23
|
+
*
|
|
24
|
+
* @description
|
|
25
|
+
* Creates a new user account with email/phone and password.
|
|
26
|
+
* Returns authentication tokens and user information upon successful registration.
|
|
27
|
+
*
|
|
28
|
+
* @endpoint POST /auth/register
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```tsx
|
|
32
|
+
* import { useRegister } from '@growsober/sdk';
|
|
33
|
+
*
|
|
34
|
+
* function RegisterForm() {
|
|
35
|
+
* const { mutate: register, isPending, error } = useRegister({
|
|
36
|
+
* onSuccess: (data) => {
|
|
37
|
+
* // Store tokens securely
|
|
38
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
39
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
40
|
+
* navigation.navigate('Onboarding');
|
|
41
|
+
* },
|
|
42
|
+
* onError: (error) => {
|
|
43
|
+
* Alert.alert('Registration failed', error.message);
|
|
44
|
+
* },
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* const handleSubmit = () => {
|
|
48
|
+
* register({
|
|
49
|
+
* email: 'user@example.com',
|
|
50
|
+
* password: 'SecurePassword123!',
|
|
51
|
+
* name: 'John Doe',
|
|
52
|
+
* });
|
|
53
|
+
* };
|
|
54
|
+
*
|
|
55
|
+
* return <Button onPress={handleSubmit} disabled={isPending} />;
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @param options - TanStack Query mutation options
|
|
60
|
+
* @returns TanStack Query mutation result
|
|
61
|
+
*/
|
|
62
|
+
function useRegister(options) {
|
|
63
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
64
|
+
return (0, react_query_1.useMutation)({
|
|
65
|
+
mutationFn: async (data) => {
|
|
66
|
+
const client = (0, client_1.getApiClient)();
|
|
67
|
+
const response = await client.post('/auth/register', data);
|
|
68
|
+
return response.data;
|
|
69
|
+
},
|
|
70
|
+
onSuccess: (data, variables, context) => {
|
|
71
|
+
// Invalidate current user query to trigger refetch with new token
|
|
72
|
+
queryClient.invalidateQueries({ queryKey: users_1.userKeys.me() });
|
|
73
|
+
// User's onSuccess is handled by spreading options
|
|
74
|
+
},
|
|
75
|
+
...options,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Login with email/phone and password
|
|
80
|
+
*
|
|
81
|
+
* @description
|
|
82
|
+
* Authenticates an existing user with their credentials.
|
|
83
|
+
* Returns authentication tokens and user information upon successful login.
|
|
84
|
+
*
|
|
85
|
+
* @endpoint POST /auth/login
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```tsx
|
|
89
|
+
* import { useLogin } from '@growsober/sdk';
|
|
90
|
+
*
|
|
91
|
+
* function LoginForm() {
|
|
92
|
+
* const { mutate: login, isPending, error } = useLogin({
|
|
93
|
+
* onSuccess: (data) => {
|
|
94
|
+
* // Store tokens securely
|
|
95
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
96
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
97
|
+
* navigation.navigate('Home');
|
|
98
|
+
* },
|
|
99
|
+
* });
|
|
100
|
+
*
|
|
101
|
+
* const handleSubmit = () => {
|
|
102
|
+
* login({
|
|
103
|
+
* email: 'user@example.com',
|
|
104
|
+
* password: 'SecurePassword123!',
|
|
105
|
+
* });
|
|
106
|
+
* };
|
|
107
|
+
*
|
|
108
|
+
* return (
|
|
109
|
+
* <form onSubmit={handleSubmit}>
|
|
110
|
+
* <input type="email" name="email" />
|
|
111
|
+
* <input type="password" name="password" />
|
|
112
|
+
* <button type="submit" disabled={isPending}>
|
|
113
|
+
* {isPending ? 'Logging in...' : 'Login'}
|
|
114
|
+
* </button>
|
|
115
|
+
* {error && <p className="error">{error.message}</p>}
|
|
116
|
+
* </form>
|
|
117
|
+
* );
|
|
118
|
+
* }
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* Login with phone number:
|
|
123
|
+
* ```tsx
|
|
124
|
+
* login({
|
|
125
|
+
* phone: '+1234567890',
|
|
126
|
+
* password: 'SecurePassword123!',
|
|
127
|
+
* });
|
|
128
|
+
* ```
|
|
129
|
+
*
|
|
130
|
+
* @param options - TanStack Query mutation options
|
|
131
|
+
* @returns TanStack Query mutation result
|
|
132
|
+
*/
|
|
133
|
+
function useLogin(options) {
|
|
134
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
135
|
+
return (0, react_query_1.useMutation)({
|
|
136
|
+
mutationFn: async (data) => {
|
|
137
|
+
const client = (0, client_1.getApiClient)();
|
|
138
|
+
const response = await client.post('/auth/login', data);
|
|
139
|
+
return response.data;
|
|
140
|
+
},
|
|
141
|
+
onSuccess: (data, variables, context) => {
|
|
142
|
+
// Invalidate current user query to trigger refetch with new token
|
|
143
|
+
queryClient.invalidateQueries({ queryKey: users_1.userKeys.me() });
|
|
144
|
+
// User's onSuccess is handled by spreading options
|
|
145
|
+
},
|
|
146
|
+
...options,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Refresh access token using refresh token
|
|
151
|
+
*
|
|
152
|
+
* @description
|
|
153
|
+
* Obtains a new access token using a valid refresh token.
|
|
154
|
+
* Should be called when the access token expires.
|
|
155
|
+
*
|
|
156
|
+
* @endpoint POST /auth/refresh
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```tsx
|
|
160
|
+
* import { useRefreshAuthToken } from '@growsober/sdk';
|
|
161
|
+
*
|
|
162
|
+
* function useTokenRefresh() {
|
|
163
|
+
* const { mutateAsync: refreshToken } = useRefreshAuthToken();
|
|
164
|
+
*
|
|
165
|
+
* const handleTokenExpired = async () => {
|
|
166
|
+
* const storedRefreshToken = await SecureStore.getItemAsync('refreshToken');
|
|
167
|
+
*
|
|
168
|
+
* if (!storedRefreshToken) {
|
|
169
|
+
* navigation.navigate('Login');
|
|
170
|
+
* return;
|
|
171
|
+
* }
|
|
172
|
+
*
|
|
173
|
+
* try {
|
|
174
|
+
* const { accessToken, refreshToken: newRefreshToken } = await refreshToken({
|
|
175
|
+
* refreshToken: storedRefreshToken,
|
|
176
|
+
* });
|
|
177
|
+
*
|
|
178
|
+
* // Store new tokens
|
|
179
|
+
* await SecureStore.setItemAsync('accessToken', accessToken);
|
|
180
|
+
* await SecureStore.setItemAsync('refreshToken', newRefreshToken);
|
|
181
|
+
* } catch (error) {
|
|
182
|
+
* // Refresh token is invalid or expired
|
|
183
|
+
* navigation.navigate('Login');
|
|
184
|
+
* }
|
|
185
|
+
* };
|
|
186
|
+
*
|
|
187
|
+
* return { handleTokenExpired };
|
|
188
|
+
* }
|
|
189
|
+
* ```
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* Integrate with SDK configuration:
|
|
193
|
+
* ```tsx
|
|
194
|
+
* import { configureSDK } from '@growsober/sdk';
|
|
195
|
+
*
|
|
196
|
+
* configureSDK({
|
|
197
|
+
* baseURL: 'https://api.growsober.app',
|
|
198
|
+
* getAccessToken: async () => {
|
|
199
|
+
* return await SecureStore.getItemAsync('accessToken');
|
|
200
|
+
* },
|
|
201
|
+
* refreshAccessToken: async () => {
|
|
202
|
+
* const refreshToken = await SecureStore.getItemAsync('refreshToken');
|
|
203
|
+
* const { accessToken, refreshToken: newRefreshToken } = await fetch('/auth/refresh', {
|
|
204
|
+
* method: 'POST',
|
|
205
|
+
* body: JSON.stringify({ refreshToken }),
|
|
206
|
+
* }).then(r => r.json());
|
|
207
|
+
*
|
|
208
|
+
* await SecureStore.setItemAsync('accessToken', accessToken);
|
|
209
|
+
* await SecureStore.setItemAsync('refreshToken', newRefreshToken);
|
|
210
|
+
*
|
|
211
|
+
* return accessToken;
|
|
212
|
+
* },
|
|
213
|
+
* onUnauthorized: () => {
|
|
214
|
+
* navigation.navigate('Login');
|
|
215
|
+
* },
|
|
216
|
+
* });
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* @param options - TanStack Query mutation options
|
|
220
|
+
* @returns TanStack Query mutation result
|
|
221
|
+
*/
|
|
222
|
+
function useRefreshAuthToken(options) {
|
|
223
|
+
return (0, react_query_1.useMutation)({
|
|
224
|
+
mutationFn: async (data) => {
|
|
225
|
+
const client = (0, client_1.getApiClient)();
|
|
226
|
+
const response = await client.post('/auth/refresh', data);
|
|
227
|
+
return response.data;
|
|
228
|
+
},
|
|
229
|
+
...options,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Authenticate with Firebase ID token
|
|
234
|
+
*
|
|
235
|
+
* @description
|
|
236
|
+
* Authenticates a user using a Firebase ID token.
|
|
237
|
+
* Creates a new user account if one doesn't exist, or logs in an existing user.
|
|
238
|
+
* Returns GrowSober authentication tokens and user information.
|
|
239
|
+
*
|
|
240
|
+
* @endpoint POST /auth/firebase
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```tsx
|
|
244
|
+
* import { useFirebaseAuth } from '@growsober/sdk';
|
|
245
|
+
* import { signInWithPhoneNumber } from 'firebase/auth';
|
|
246
|
+
*
|
|
247
|
+
* function PhoneAuthScreen() {
|
|
248
|
+
* const { mutate: firebaseAuth, isPending } = useFirebaseAuth({
|
|
249
|
+
* onSuccess: (data) => {
|
|
250
|
+
* // Store GrowSober tokens
|
|
251
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
252
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
253
|
+
*
|
|
254
|
+
* if (data.user.onboardingCompleted) {
|
|
255
|
+
* navigation.navigate('Home');
|
|
256
|
+
* } else {
|
|
257
|
+
* navigation.navigate('Onboarding');
|
|
258
|
+
* }
|
|
259
|
+
* },
|
|
260
|
+
* onError: (error) => {
|
|
261
|
+
* Alert.alert('Authentication failed', error.message);
|
|
262
|
+
* },
|
|
263
|
+
* });
|
|
264
|
+
*
|
|
265
|
+
* const handlePhoneAuth = async (phoneNumber: string) => {
|
|
266
|
+
* try {
|
|
267
|
+
* // Firebase authentication flow
|
|
268
|
+
* const confirmation = await signInWithPhoneNumber(auth, phoneNumber);
|
|
269
|
+
* const code = await promptUserForCode(); // Your UI to get verification code
|
|
270
|
+
* const credential = await confirmation.confirm(code);
|
|
271
|
+
*
|
|
272
|
+
* // Get Firebase ID token
|
|
273
|
+
* const idToken = await credential.user.getIdToken();
|
|
274
|
+
*
|
|
275
|
+
* // Authenticate with GrowSober backend
|
|
276
|
+
* firebaseAuth({ idToken });
|
|
277
|
+
* } catch (error) {
|
|
278
|
+
* console.error('Phone auth error:', error);
|
|
279
|
+
* }
|
|
280
|
+
* };
|
|
281
|
+
*
|
|
282
|
+
* return <PhoneInput onSubmit={handlePhoneAuth} disabled={isPending} />;
|
|
283
|
+
* }
|
|
284
|
+
* ```
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* With Google Sign-In:
|
|
288
|
+
* ```tsx
|
|
289
|
+
* import { GoogleSignin } from '@react-native-google-signin/google-signin';
|
|
290
|
+
*
|
|
291
|
+
* const handleGoogleSignIn = async () => {
|
|
292
|
+
* const { idToken } = await GoogleSignin.signIn();
|
|
293
|
+
* firebaseAuth({ idToken });
|
|
294
|
+
* };
|
|
295
|
+
* ```
|
|
296
|
+
*
|
|
297
|
+
* @example
|
|
298
|
+
* With Apple Sign-In:
|
|
299
|
+
* ```tsx
|
|
300
|
+
* import * as AppleAuthentication from 'expo-apple-authentication';
|
|
301
|
+
*
|
|
302
|
+
* const handleAppleSignIn = async () => {
|
|
303
|
+
* const credential = await AppleAuthentication.signInAsync({
|
|
304
|
+
* requestedScopes: [
|
|
305
|
+
* AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
|
|
306
|
+
* AppleAuthentication.AppleAuthenticationScope.EMAIL,
|
|
307
|
+
* ],
|
|
308
|
+
* });
|
|
309
|
+
* firebaseAuth({ idToken: credential.identityToken });
|
|
310
|
+
* };
|
|
311
|
+
* ```
|
|
312
|
+
*
|
|
313
|
+
* @param options - TanStack Query mutation options
|
|
314
|
+
* @returns TanStack Query mutation result
|
|
315
|
+
*/
|
|
316
|
+
function useFirebaseAuth(options) {
|
|
317
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
318
|
+
return (0, react_query_1.useMutation)({
|
|
319
|
+
mutationFn: async (data) => {
|
|
320
|
+
const client = (0, client_1.getApiClient)();
|
|
321
|
+
const response = await client.post('/auth/firebase', data);
|
|
322
|
+
return response.data;
|
|
323
|
+
},
|
|
324
|
+
onSuccess: (data, variables, context) => {
|
|
325
|
+
// Invalidate current user query to trigger refetch with new token
|
|
326
|
+
queryClient.invalidateQueries({ queryKey: users_1.userKeys.me() });
|
|
327
|
+
// User's onSuccess is handled by spreading options
|
|
328
|
+
},
|
|
329
|
+
...options,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7O0FBMkRILGtDQWtCQztBQXlERCw0QkFrQkM7QUEyRUQsa0RBV0M7QUFzRkQsMENBa0JDO0FBcFZELHVEQUEyRztBQUMzRyxzQ0FBeUM7QUFDekMsNENBQTRDO0FBVTVDLCtFQUErRTtBQUMvRSxpQkFBaUI7QUFDakIsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsU0FBZ0IsV0FBVyxDQUN6QixPQUFzRjtJQUV0RixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQXFCLEVBQXlCLEVBQUU7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFlLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxTQUFnQixRQUFRLENBQ3RCLE9BQW1GO0lBRW5GLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBa0IsRUFBeUIsRUFBRTtZQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQWUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3RUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsT0FBMkY7SUFFM0YsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUF5QixFQUEwQixFQUFFO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBZ0IsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1GRztBQUNILFNBQWdCLGVBQWUsQ0FDN0IsT0FBMEY7SUFFMUYsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUF5QixFQUF5QixFQUFFO1lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBZSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsa0VBQWtFO1lBQ2xFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGggTXV0YXRpb24gSG9va3NcbiAqXG4gKiBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBob29rcyBmb3IgYXV0aGVudGljYXRpb24tcmVsYXRlZCB3cml0ZSBvcGVyYXRpb25zLlxuICogVGhlc2UgaG9va3MgaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uLCBsb2dpbiwgdG9rZW4gcmVmcmVzaCwgYW5kIEZpcmViYXNlIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBtb2R1bGUgYXBpL211dGF0aW9ucy9hdXRoXG4gKi9cblxuaW1wb3J0IHsgdXNlTXV0YXRpb24sIFVzZU11dGF0aW9uT3B0aW9ucywgVXNlTXV0YXRpb25SZXN1bHQsIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGdldEFwaUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgeyB1c2VyS2V5cyB9IGZyb20gJy4uL3F1ZXJpZXMvdXNlcnMnO1xuaW1wb3J0IHR5cGUge1xuICBSZWdpc3RlclJlcXVlc3QsXG4gIExvZ2luUmVxdWVzdCxcbiAgUmVmcmVzaFRva2VuUmVxdWVzdCxcbiAgRmlyZWJhc2VBdXRoUmVxdWVzdCxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBuZXcgdXNlciBhY2NvdW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGEgbmV3IHVzZXIgYWNjb3VudCB3aXRoIGVtYWlsL3Bob25lIGFuZCBwYXNzd29yZC5cbiAqIFJldHVybnMgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCB1c2VyIGluZm9ybWF0aW9uIHVwb24gc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcmVnaXN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VSZWdpc3RlciB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBSZWdpc3RlckZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiByZWdpc3RlciwgaXNQZW5kaW5nLCBlcnJvciB9ID0gdXNlUmVnaXN0ZXIoe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIHRva2VucyBzZWN1cmVseVxuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKiAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdPbmJvYXJkaW5nJyk7XG4gKiAgICAgfSxcbiAqICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICAgIEFsZXJ0LmFsZXJ0KCdSZWdpc3RyYXRpb24gZmFpbGVkJywgZXJyb3IubWVzc2FnZSk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gKiAgICAgcmVnaXN0ZXIoe1xuICogICAgICAgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgICAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzc3dvcmQxMjMhJyxcbiAqICAgICAgIG5hbWU6ICdKb2huIERvZScsXG4gKiAgICAgfSk7XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4gPEJ1dHRvbiBvblByZXNzPXtoYW5kbGVTdWJtaXR9IGRpc2FibGVkPXtpc1BlbmRpbmd9IC8+O1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZ2lzdGVyKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QXV0aFJlc3BvbnNlLCBFcnJvciwgUmVnaXN0ZXJSZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8QXV0aFJlc3BvbnNlLCBFcnJvciwgUmVnaXN0ZXJSZXF1ZXN0PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBSZWdpc3RlclJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEF1dGhSZXNwb25zZT4oJy9hdXRoL3JlZ2lzdGVyJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjdXJyZW50IHVzZXIgcXVlcnkgdG8gdHJpZ2dlciByZWZldGNoIHdpdGggbmV3IHRva2VuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiB1c2VyS2V5cy5tZSgpIH0pO1xuICAgICAgLy8gVXNlcidzIG9uU3VjY2VzcyBpcyBoYW5kbGVkIGJ5IHNwcmVhZGluZyBvcHRpb25zXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dpbiB3aXRoIGVtYWlsL3Bob25lIGFuZCBwYXNzd29yZFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXV0aGVudGljYXRlcyBhbiBleGlzdGluZyB1c2VyIHdpdGggdGhlaXIgY3JlZGVudGlhbHMuXG4gKiBSZXR1cm5zIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgdXNlciBpbmZvcm1hdGlvbiB1cG9uIHN1Y2Nlc3NmdWwgbG9naW4uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvbG9naW5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VMb2dpbiB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBMb2dpbkZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiBsb2dpbiwgaXNQZW5kaW5nLCBlcnJvciB9ID0gdXNlTG9naW4oe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIHRva2VucyBzZWN1cmVseVxuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKiAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdIb21lJyk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gKiAgICAgbG9naW4oe1xuICogICAgICAgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgICAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzc3dvcmQxMjMhJyxcbiAqICAgICB9KTtcbiAqICAgfTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgLz5cbiAqICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiAvPlxuICogICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgZGlzYWJsZWQ9e2lzUGVuZGluZ30+XG4gKiAgICAgICAgIHtpc1BlbmRpbmcgPyAnTG9nZ2luZyBpbi4uLicgOiAnTG9naW4nfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgICB7ZXJyb3IgJiYgPHAgY2xhc3NOYW1lPVwiZXJyb3JcIj57ZXJyb3IubWVzc2FnZX08L3A+fVxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBMb2dpbiB3aXRoIHBob25lIG51bWJlcjpcbiAqIGBgYHRzeFxuICogbG9naW4oe1xuICogICBwaG9uZTogJysxMjM0NTY3ODkwJyxcbiAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzd29yZDEyMyEnLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTG9naW4oXG4gIG9wdGlvbnM/OiBPbWl0PFVzZU11dGF0aW9uT3B0aW9uczxBdXRoUmVzcG9uc2UsIEVycm9yLCBMb2dpblJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBdXRoUmVzcG9uc2UsIEVycm9yLCBMb2dpblJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IExvZ2luUmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8QXV0aFJlc3BvbnNlPignL2F1dGgvbG9naW4nLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgdXNlciBxdWVyeSB0byB0cmlnZ2VyIHJlZmV0Y2ggd2l0aCBuZXcgdG9rZW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJLZXlzLm1lKCkgfSk7XG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggYWNjZXNzIHRva2VuIHVzaW5nIHJlZnJlc2ggdG9rZW5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE9idGFpbnMgYSBuZXcgYWNjZXNzIHRva2VuIHVzaW5nIGEgdmFsaWQgcmVmcmVzaCB0b2tlbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYWNjZXNzIHRva2VuIGV4cGlyZXMuXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcmVmcmVzaFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVJlZnJlc2hBdXRoVG9rZW4gfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gdXNlVG9rZW5SZWZyZXNoKCkge1xuICogICBjb25zdCB7IG11dGF0ZUFzeW5jOiByZWZyZXNoVG9rZW4gfSA9IHVzZVJlZnJlc2hBdXRoVG9rZW4oKTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVRva2VuRXhwaXJlZCA9IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCBzdG9yZWRSZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICpcbiAqICAgICBpZiAoIXN0b3JlZFJlZnJlc2hUb2tlbikge1xuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICAgIHJldHVybjtcbiAqICAgICB9XG4gKlxuICogICAgIHRyeSB7XG4gKiAgICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbiB9ID0gYXdhaXQgcmVmcmVzaFRva2VuKHtcbiAqICAgICAgICAgcmVmcmVzaFRva2VuOiBzdG9yZWRSZWZyZXNoVG9rZW4sXG4gKiAgICAgICB9KTtcbiAqXG4gKiAgICAgICAvLyBTdG9yZSBuZXcgdG9rZW5zXG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBuZXdSZWZyZXNoVG9rZW4pO1xuICogICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgICAvLyBSZWZyZXNoIHRva2VuIGlzIGludmFsaWQgb3IgZXhwaXJlZFxuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4geyBoYW5kbGVUb2tlbkV4cGlyZWQgfTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBJbnRlZ3JhdGUgd2l0aCBTREsgY29uZmlndXJhdGlvbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgY29uZmlndXJlU0RLIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGNvbmZpZ3VyZVNESyh7XG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5ncm93c29iZXIuYXBwJyxcbiAqICAgZ2V0QWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICByZXR1cm4gYXdhaXQgU2VjdXJlU3RvcmUuZ2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicpO1xuICogICB9LFxuICogICByZWZyZXNoQWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICogICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbjogbmV3UmVmcmVzaFRva2VuIH0gPSBhd2FpdCBmZXRjaCgnL2F1dGgvcmVmcmVzaCcsIHtcbiAqICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICogICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZWZyZXNoVG9rZW4gfSksXG4gKiAgICAgfSkudGhlbihyID0+IHIuanNvbigpKTtcbiAqXG4gKiAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAqICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicsIG5ld1JlZnJlc2hUb2tlbik7XG4gKlxuICogICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAqICAgfSxcbiAqICAgb25VbmF1dGhvcml6ZWQ6ICgpID0+IHtcbiAqICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdMb2dpbicpO1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaEF1dGhUb2tlbihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPFRva2VuUmVzcG9uc2UsIEVycm9yLCBSZWZyZXNoVG9rZW5SZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8VG9rZW5SZXNwb25zZSwgRXJyb3IsIFJlZnJlc2hUb2tlblJlcXVlc3Q+IHtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogUmVmcmVzaFRva2VuUmVxdWVzdCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PFRva2VuUmVzcG9uc2U+KCcvYXV0aC9yZWZyZXNoJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEF1dGhlbnRpY2F0ZSB3aXRoIEZpcmViYXNlIElEIHRva2VuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBdXRoZW50aWNhdGVzIGEgdXNlciB1c2luZyBhIEZpcmViYXNlIElEIHRva2VuLlxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgaWYgb25lIGRvZXNuJ3QgZXhpc3QsIG9yIGxvZ3MgaW4gYW4gZXhpc3RpbmcgdXNlci5cbiAqIFJldHVybnMgR3Jvd1NvYmVyIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZW5kcG9pbnQgUE9TVCAvYXV0aC9maXJlYmFzZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUZpcmViYXNlQXV0aCB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqIGltcG9ydCB7IHNpZ25JbldpdGhQaG9uZU51bWJlciB9IGZyb20gJ2ZpcmViYXNlL2F1dGgnO1xuICpcbiAqIGZ1bmN0aW9uIFBob25lQXV0aFNjcmVlbigpIHtcbiAqICAgY29uc3QgeyBtdXRhdGU6IGZpcmViYXNlQXV0aCwgaXNQZW5kaW5nIH0gPSB1c2VGaXJlYmFzZUF1dGgoe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIEdyb3dTb2JlciB0b2tlbnNcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygnYWNjZXNzVG9rZW4nLCBkYXRhLmFjY2Vzc1Rva2VuKTtcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygncmVmcmVzaFRva2VuJywgZGF0YS5yZWZyZXNoVG9rZW4pO1xuICpcbiAqICAgICAgIGlmIChkYXRhLnVzZXIub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICogICAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdIb21lJyk7XG4gKiAgICAgICB9IGVsc2Uge1xuICogICAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdPbmJvYXJkaW5nJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICAgIEFsZXJ0LmFsZXJ0KCdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVBob25lQXV0aCA9IGFzeW5jIChwaG9uZU51bWJlcjogc3RyaW5nKSA9PiB7XG4gKiAgICAgdHJ5IHtcbiAqICAgICAgIC8vIEZpcmViYXNlIGF1dGhlbnRpY2F0aW9uIGZsb3dcbiAqICAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlcik7XG4gKiAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgcHJvbXB0VXNlckZvckNvZGUoKTsgLy8gWW91ciBVSSB0byBnZXQgdmVyaWZpY2F0aW9uIGNvZGVcbiAqICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb24uY29uZmlybShjb2RlKTtcbiAqXG4gKiAgICAgICAvLyBHZXQgRmlyZWJhc2UgSUQgdG9rZW5cbiAqICAgICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBjcmVkZW50aWFsLnVzZXIuZ2V0SWRUb2tlbigpO1xuICpcbiAqICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB3aXRoIEdyb3dTb2JlciBiYWNrZW5kXG4gKiAgICAgICBmaXJlYmFzZUF1dGgoeyBpZFRva2VuIH0pO1xuICogICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgICBjb25zb2xlLmVycm9yKCdQaG9uZSBhdXRoIGVycm9yOicsIGVycm9yKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4gPFBob25lSW5wdXQgb25TdWJtaXQ9e2hhbmRsZVBob25lQXV0aH0gZGlzYWJsZWQ9e2lzUGVuZGluZ30gLz47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBHb29nbGUgU2lnbi1JbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgR29vZ2xlU2lnbmluIH0gZnJvbSAnQHJlYWN0LW5hdGl2ZS1nb29nbGUtc2lnbmluL2dvb2dsZS1zaWduaW4nO1xuICpcbiAqIGNvbnN0IGhhbmRsZUdvb2dsZVNpZ25JbiA9IGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgeyBpZFRva2VuIH0gPSBhd2FpdCBHb29nbGVTaWduaW4uc2lnbkluKCk7XG4gKiAgIGZpcmViYXNlQXV0aCh7IGlkVG9rZW4gfSk7XG4gKiB9O1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggQXBwbGUgU2lnbi1JbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0ICogYXMgQXBwbGVBdXRoZW50aWNhdGlvbiBmcm9tICdleHBvLWFwcGxlLWF1dGhlbnRpY2F0aW9uJztcbiAqXG4gKiBjb25zdCBoYW5kbGVBcHBsZVNpZ25JbiA9IGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IGF3YWl0IEFwcGxlQXV0aGVudGljYXRpb24uc2lnbkluQXN5bmMoe1xuICogICAgIHJlcXVlc3RlZFNjb3BlczogW1xuICogICAgICAgQXBwbGVBdXRoZW50aWNhdGlvbi5BcHBsZUF1dGhlbnRpY2F0aW9uU2NvcGUuRlVMTF9OQU1FLFxuICogICAgICAgQXBwbGVBdXRoZW50aWNhdGlvbi5BcHBsZUF1dGhlbnRpY2F0aW9uU2NvcGUuRU1BSUwsXG4gKiAgICAgXSxcbiAqICAgfSk7XG4gKiAgIGZpcmViYXNlQXV0aCh7IGlkVG9rZW46IGNyZWRlbnRpYWwuaWRlbnRpdHlUb2tlbiB9KTtcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmlyZWJhc2VBdXRoKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QXV0aFJlc3BvbnNlLCBFcnJvciwgRmlyZWJhc2VBdXRoUmVxdWVzdD4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEF1dGhSZXNwb25zZSwgRXJyb3IsIEZpcmViYXNlQXV0aFJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IEZpcmViYXNlQXV0aFJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEF1dGhSZXNwb25zZT4oJy9hdXRoL2ZpcmViYXNlJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjdXJyZW50IHVzZXIgcXVlcnkgdG8gdHJpZ2dlciByZWZldGNoIHdpdGggbmV3IHRva2VuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiB1c2VyS2V5cy5tZSgpIH0pO1xuICAgICAgLy8gVXNlcidzIG9uU3VjY2VzcyBpcyBoYW5kbGVkIGJ5IHNwcmVhZGluZyBvcHRpb25zXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
import type { BookingResponse } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Create a new booking for an event
|
|
5
|
+
*
|
|
6
|
+
* @param options - TanStack Query mutation options
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```tsx
|
|
10
|
+
* const { mutate, isPending } = useCreateBooking();
|
|
11
|
+
*
|
|
12
|
+
* // Simple usage - just pass eventId
|
|
13
|
+
* mutate({ eventId: 'event-123' });
|
|
14
|
+
*
|
|
15
|
+
* // With optional data
|
|
16
|
+
* mutate({
|
|
17
|
+
* eventId: 'event-123',
|
|
18
|
+
* ticketCount: 2,
|
|
19
|
+
* notes: 'Vegetarian meal preferred'
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function useCreateBooking(options?: Omit<UseMutationOptions<BookingResponse, Error, {
|
|
24
|
+
eventId: string;
|
|
25
|
+
ticketCount?: number;
|
|
26
|
+
notes?: string;
|
|
27
|
+
}>, 'mutationFn'>): UseMutationResult<BookingResponse, Error, {
|
|
28
|
+
eventId: string;
|
|
29
|
+
ticketCount?: number;
|
|
30
|
+
notes?: string;
|
|
31
|
+
}>;
|
|
32
|
+
/**
|
|
33
|
+
* Cancel a booking
|
|
34
|
+
*
|
|
35
|
+
* @param options - TanStack Query mutation options
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* const { mutate, isPending } = useCancelBooking();
|
|
40
|
+
*
|
|
41
|
+
* mutate('booking-123');
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function useCancelBooking(options?: Omit<UseMutationOptions<void, Error, string>, 'mutationFn'>): UseMutationResult<void, Error, string>;
|
|
45
|
+
/**
|
|
46
|
+
* Check in a booking
|
|
47
|
+
*
|
|
48
|
+
* Note: This is typically used by event hosts/ambassadors to check in attendees
|
|
49
|
+
*
|
|
50
|
+
* @param options - TanStack Query mutation options
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* const { mutate, isPending } = useCheckInBooking();
|
|
55
|
+
*
|
|
56
|
+
* mutate('booking-123');
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function useCheckInBooking(options?: Omit<UseMutationOptions<BookingResponse, Error, string>, 'mutationFn'>): UseMutationResult<BookingResponse, Error, string>;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCreateBooking = useCreateBooking;
|
|
4
|
+
exports.useCancelBooking = useCancelBooking;
|
|
5
|
+
exports.useCheckInBooking = useCheckInBooking;
|
|
6
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
7
|
+
const client_1 = require("../client");
|
|
8
|
+
const bookings_1 = require("../queries/bookings");
|
|
9
|
+
const events_1 = require("../queries/events");
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// MUTATION HOOKS
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Create a new booking for an event
|
|
15
|
+
*
|
|
16
|
+
* @param options - TanStack Query mutation options
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const { mutate, isPending } = useCreateBooking();
|
|
21
|
+
*
|
|
22
|
+
* // Simple usage - just pass eventId
|
|
23
|
+
* mutate({ eventId: 'event-123' });
|
|
24
|
+
*
|
|
25
|
+
* // With optional data
|
|
26
|
+
* mutate({
|
|
27
|
+
* eventId: 'event-123',
|
|
28
|
+
* ticketCount: 2,
|
|
29
|
+
* notes: 'Vegetarian meal preferred'
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function useCreateBooking(options) {
|
|
34
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
35
|
+
return (0, react_query_1.useMutation)({
|
|
36
|
+
mutationFn: async ({ eventId, ticketCount, notes, }) => {
|
|
37
|
+
const client = (0, client_1.getApiClient)();
|
|
38
|
+
const data = {};
|
|
39
|
+
if (ticketCount)
|
|
40
|
+
data.ticketCount = ticketCount;
|
|
41
|
+
if (notes)
|
|
42
|
+
data.notes = notes;
|
|
43
|
+
const response = await client.post(`/api/v1/events/${eventId}/book`, data);
|
|
44
|
+
return response.data;
|
|
45
|
+
},
|
|
46
|
+
onSuccess: (newBooking, variables, context) => {
|
|
47
|
+
// Invalidate user's bookings list
|
|
48
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.mine() });
|
|
49
|
+
// Invalidate all booking lists
|
|
50
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.lists() });
|
|
51
|
+
// Invalidate the event to reflect updated booking count
|
|
52
|
+
queryClient.invalidateQueries({
|
|
53
|
+
queryKey: events_1.eventKeys.detail(variables.eventId)
|
|
54
|
+
});
|
|
55
|
+
// Invalidate event bookings if applicable
|
|
56
|
+
queryClient.invalidateQueries({
|
|
57
|
+
queryKey: events_1.eventKeys.bookings(variables.eventId)
|
|
58
|
+
});
|
|
59
|
+
// Invalidate ambient events
|
|
60
|
+
queryClient.invalidateQueries({ queryKey: events_1.eventKeys.ambient() });
|
|
61
|
+
// Call user's onSuccess if provided
|
|
62
|
+
},
|
|
63
|
+
...options,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cancel a booking
|
|
68
|
+
*
|
|
69
|
+
* @param options - TanStack Query mutation options
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```tsx
|
|
73
|
+
* const { mutate, isPending } = useCancelBooking();
|
|
74
|
+
*
|
|
75
|
+
* mutate('booking-123');
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
function useCancelBooking(options) {
|
|
79
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
80
|
+
return (0, react_query_1.useMutation)({
|
|
81
|
+
mutationFn: async (id) => {
|
|
82
|
+
const client = (0, client_1.getApiClient)();
|
|
83
|
+
await client.delete(`/api/v1/bookings/${id}`);
|
|
84
|
+
},
|
|
85
|
+
onSuccess: (data, bookingId, context) => {
|
|
86
|
+
// Remove the booking from cache
|
|
87
|
+
queryClient.removeQueries({ queryKey: bookings_1.bookingKeys.detail(bookingId) });
|
|
88
|
+
// Invalidate user's bookings list
|
|
89
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.mine() });
|
|
90
|
+
// Invalidate all booking lists
|
|
91
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.lists() });
|
|
92
|
+
// Invalidate QR code cache
|
|
93
|
+
queryClient.removeQueries({ queryKey: bookings_1.bookingKeys.qrCode(bookingId) });
|
|
94
|
+
// Invalidate events to reflect updated booking counts
|
|
95
|
+
queryClient.invalidateQueries({ queryKey: events_1.eventKeys.lists() });
|
|
96
|
+
queryClient.invalidateQueries({ queryKey: events_1.eventKeys.upcoming() });
|
|
97
|
+
queryClient.invalidateQueries({ queryKey: events_1.eventKeys.ambient() });
|
|
98
|
+
// Call user's onSuccess if provided
|
|
99
|
+
},
|
|
100
|
+
...options,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check in a booking
|
|
105
|
+
*
|
|
106
|
+
* Note: This is typically used by event hosts/ambassadors to check in attendees
|
|
107
|
+
*
|
|
108
|
+
* @param options - TanStack Query mutation options
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```tsx
|
|
112
|
+
* const { mutate, isPending } = useCheckInBooking();
|
|
113
|
+
*
|
|
114
|
+
* mutate('booking-123');
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
function useCheckInBooking(options) {
|
|
118
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
119
|
+
return (0, react_query_1.useMutation)({
|
|
120
|
+
mutationFn: async (id) => {
|
|
121
|
+
const client = (0, client_1.getApiClient)();
|
|
122
|
+
const response = await client.post(`/api/v1/bookings/${id}/check-in`);
|
|
123
|
+
return response.data;
|
|
124
|
+
},
|
|
125
|
+
onSuccess: (checkedInBooking, bookingId, context) => {
|
|
126
|
+
// Update the booking in cache
|
|
127
|
+
queryClient.setQueryData(bookings_1.bookingKeys.detail(bookingId), checkedInBooking);
|
|
128
|
+
// Invalidate user's bookings list to reflect check-in status
|
|
129
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.mine() });
|
|
130
|
+
// Invalidate all booking lists
|
|
131
|
+
queryClient.invalidateQueries({ queryKey: bookings_1.bookingKeys.lists() });
|
|
132
|
+
// Invalidate event bookings if applicable
|
|
133
|
+
if (checkedInBooking.eventId) {
|
|
134
|
+
queryClient.invalidateQueries({
|
|
135
|
+
queryKey: events_1.eventKeys.bookings(checkedInBooking.eventId)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Call user's onSuccess if provided
|
|
139
|
+
},
|
|
140
|
+
...options,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2luZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL211dGF0aW9ucy9ib29raW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1DQSw0Q0F5REM7QUFjRCw0Q0FnQ0M7QUFnQkQsOENBbUNDO0FBN0xELHVEQUsrQjtBQUMvQixzQ0FBeUM7QUFFekMsa0RBQWtEO0FBQ2xELDhDQUE4QztBQUU5QywrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixPQU9DO0lBTUQsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUNqQixPQUFPLEVBQ1AsV0FBVyxFQUNYLEtBQUssR0FLTixFQUE0QixFQUFFO1lBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFRLEVBQUUsQ0FBQztZQUNyQixJQUFJLFdBQVc7Z0JBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDaEQsSUFBSSxLQUFLO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsT0FBTyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0UsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQzVDLGtDQUFrQztZQUNsQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsc0JBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFD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LENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDbEQsOEJBQThCO1lBQzlCLFdBQVcsQ0FBQyxZQUFZLENBQ3RCLHNCQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUM3QixnQkFBZ0IsQ0FDakIsQ0FBQztZQUVGLDZEQUE2RDtZQUM3RCxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsc0JBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFaEUsK0JBQStCO1lBQy9CLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxzQkFBVyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUVqRSwwQ0FBMEM7WUFDMUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsV0FBVyxDQUFDLGlCQUFpQixDQUFDO29CQUM1QixRQUFRLEVBQUUsa0JBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO2lCQUN2RCxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsb0NBQW9DO1FBQ3RDLENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXNlTXV0YXRpb24sXG4gIHVzZVF1ZXJ5Q2xpZW50LFxuICBVc2VNdXRhdGlvbk9wdGlvbnMsXG4gIFVzZU11dGF0aW9uUmVzdWx0LFxufSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgZ2V0QXBpQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB0eXBlIHsgQm9va2luZ1Jlc3BvbnNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgYm9va2luZ0tleXMgfSBmcm9tICcuLi9xdWVyaWVzL2Jvb2tpbmdzJztcbmltcG9ydCB7IGV2ZW50S2V5cyB9IGZyb20gJy4uL3F1ZXJpZXMvZXZlbnRzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTVVUQVRJT04gSE9PS1Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgYm9va2luZyBmb3IgYW4gZXZlbnRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IG11dGF0ZSwgaXNQZW5kaW5nIH0gPSB1c2VDcmVhdGVCb29raW5nKCk7XG4gKlxuICogLy8gU2ltcGxlIHVzYWdlIC0ganVzdCBwYXNzIGV2ZW50SWRcbiAqIG11dGF0ZSh7IGV2ZW50SWQ6ICdldmVudC0xMjMnIH0pO1xuICpcbiAqIC8vIFdpdGggb3B0aW9uYWwgZGF0YVxuICogbXV0YXRlKHtcbiAqICAgZXZlbnRJZDogJ2V2ZW50LTEyMycsXG4gKiAgIHRpY2tldENvdW50OiAyLFxuICogICBub3RlczogJ1ZlZ2V0YXJpYW4gbWVhbCBwcmVmZXJyZWQnXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ3JlYXRlQm9va2luZyhcbiAgb3B0aW9ucz86IE9taXQ8XG4gICAgVXNlTXV0YXRpb25PcHRpb25zPFxuICAgICAgQm9va2luZ1Jlc3BvbnNlLFxuICAgICAgRXJyb3IsXG4gICAgICB7IGV2ZW50SWQ6IHN0cmluZzsgdGlja2V0Q291bnQ/OiBudW1iZXI7IG5vdGVzPzogc3RyaW5nIH1cbiAgICA+LFxuICAgICdtdXRhdGlvbkZuJ1xuICA+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxcbiAgQm9va2luZ1Jlc3BvbnNlLFxuICBFcnJvcixcbiAgeyBldmVudElkOiBzdHJpbmc7IHRpY2tldENvdW50PzogbnVtYmVyOyBub3Rlcz86IHN0cmluZyB9XG4+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKHtcbiAgICAgIGV2ZW50SWQsXG4gICAgICB0aWNrZXRDb3VudCxcbiAgICAgIG5vdGVzLFxuICAgIH06IHtcbiAgICAgIGV2ZW50SWQ6IHN0cmluZztcbiAgICAgIHRpY2tldENvdW50PzogbnVtYmVyO1xuICAgICAgbm90ZXM/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8Qm9va2luZ1Jlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xuICAgICAgaWYgKHRpY2tldENvdW50KSBkYXRhLnRpY2tldENvdW50ID0gdGlja2V0Q291bnQ7XG4gICAgICBpZiAobm90ZXMpIGRhdGEubm90ZXMgPSBub3RlcztcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoYC9hcGkvdjEvZXZlbnRzLyR7ZXZlbnRJZH0vYm9va2AsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChuZXdCb29raW5nLCB2YXJpYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgdXNlcidzIGJvb2tpbmdzIGxpc3RcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGJvb2tpbmdLZXlzLm1pbmUoKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgYm9va2luZyBsaXN0c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYm9va2luZ0tleXMubGlzdHMoKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgZXZlbnQgdG8gcmVmbGVjdCB1cGRhdGVkIGJvb2tpbmcgY291bnRcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHtcbiAgICAgICAgcXVlcnlLZXk6IGV2ZW50S2V5cy5kZXRhaWwodmFyaWFibGVzLmV2ZW50SWQpXG4gICAgICB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBldmVudCBib29raW5ncyBpZiBhcHBsaWNhYmxlXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7XG4gICAgICAgIHF1ZXJ5S2V5OiBldmVudEtleXMuYm9va2luZ3ModmFyaWFibGVzLmV2ZW50SWQpXG4gICAgICB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBhbWJpZW50IGV2ZW50c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogZXZlbnRLZXlzLmFtYmllbnQoKSB9KTtcblxuICAgICAgLy8gQ2FsbCB1c2VyJ3Mgb25TdWNjZXNzIGlmIHByb3ZpZGVkXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDYW5jZWwgYSBib29raW5nXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBtdXRhdGUsIGlzUGVuZGluZyB9ID0gdXNlQ2FuY2VsQm9va2luZygpO1xuICpcbiAqIG11dGF0ZSgnYm9va2luZy0xMjMnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FuY2VsQm9va2luZyhcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPHZvaWQsIEVycm9yLCBzdHJpbmc+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDx2b2lkLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGF3YWl0IGNsaWVudC5kZWxldGUoYC9hcGkvdjEvYm9va2luZ3MvJHtpZH1gKTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIGJvb2tpbmdJZCwgY29udGV4dCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBib29raW5nIGZyb20gY2FjaGVcbiAgICAgIHF1ZXJ5Q2xpZW50LnJlbW92ZVF1ZXJpZXMoeyBxdWVyeUtleTogYm9va2luZ0tleXMuZGV0YWlsKGJvb2tpbmdJZCkgfSk7XG5cbiAgICAgIC8vIEludmFsaWRhdGUgdXNlcidzIGJvb2tpbmdzIGxpc3RcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGJvb2tpbmdLZXlzLm1pbmUoKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgYm9va2luZyBsaXN0c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYm9va2luZ0tleXMubGlzdHMoKSB9KTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSBRUiBjb2RlIGNhY2hlXG4gICAgICBxdWVyeUNsaWVudC5yZW1vdmVRdWVyaWVzKHsgcXVlcnlLZXk6IGJvb2tpbmdLZXlzLnFyQ29kZShib29raW5nSWQpIH0pO1xuXG4gICAgICAvLyBJbnZhbGlkYXRlIGV2ZW50cyB0byByZWZsZWN0IHVwZGF0ZWQgYm9va2luZyBjb3VudHNcbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IGV2ZW50S2V5cy5saXN0cygpIH0pO1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogZXZlbnRLZXlzLnVwY29taW5nKCkgfSk7XG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBldmVudEtleXMuYW1iaWVudCgpIH0pO1xuXG4gICAgICAvLyBDYWxsIHVzZXIncyBvblN1Y2Nlc3MgaWYgcHJvdmlkZWRcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrIGluIGEgYm9va2luZ1xuICpcbiAqIE5vdGU6IFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgYnkgZXZlbnQgaG9zdHMvYW1iYXNzYWRvcnMgdG8gY2hlY2sgaW4gYXR0ZW5kZWVzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBtdXRhdGUsIGlzUGVuZGluZyB9ID0gdXNlQ2hlY2tJbkJvb2tpbmcoKTtcbiAqXG4gKiBtdXRhdGUoJ2Jvb2tpbmctMTIzJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNoZWNrSW5Cb29raW5nKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8Qm9va2luZ1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8Qm9va2luZ1Jlc3BvbnNlLCBFcnJvciwgc3RyaW5nPiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChpZDogc3RyaW5nKTogUHJvbWlzZTxCb29raW5nUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL2FwaS92MS9ib29raW5ncy8ke2lkfS9jaGVjay1pbmApO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChjaGVja2VkSW5Cb29raW5nLCBib29raW5nSWQsIGNvbnRleHQpID0+IHtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYm9va2luZyBpbiBjYWNoZVxuICAgICAgcXVlcnlDbGllbnQuc2V0UXVlcnlEYXRhKFxuICAgICAgICBib29raW5nS2V5cy5kZXRhaWwoYm9va2luZ0lkKSxcbiAgICAgICAgY2hlY2tlZEluQm9va2luZ1xuICAgICAgKTtcblxuICAgICAgLy8gSW52YWxpZGF0ZSB1c2VyJ3MgYm9va2luZ3MgbGlzdCB0byByZWZsZWN0IGNoZWNrLWluIHN0YXR1c1xuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogYm9va2luZ0tleXMubWluZSgpIH0pO1xuXG4gICAgICAvLyBJbnZhbGlkYXRlIGFsbCBib29raW5nIGxpc3RzXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiBib29raW5nS2V5cy5saXN0cygpIH0pO1xuXG4gICAgICAvLyBJbnZhbGlkYXRlIGV2ZW50IGJvb2tpbmdzIGlmIGFwcGxpY2FibGVcbiAgICAgIGlmIChjaGVja2VkSW5Cb29raW5nLmV2ZW50SWQpIHtcbiAgICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoe1xuICAgICAgICAgIHF1ZXJ5S2V5OiBldmVudEtleXMuYm9va2luZ3MoY2hlY2tlZEluQm9va2luZy5ldmVudElkKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCB1c2VyJ3Mgb25TdWNjZXNzIGlmIHByb3ZpZGVkXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ChatMemberResponse, MessageResponse, EventChatResponse, SendMessageRequest, UpdateMessageRequest, UpdateChatSettingsRequest, UpdateMemberSettingsRequest } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Update chat settings (hosts only)
|
|
4
|
+
*/
|
|
5
|
+
export declare function useUpdateChatSettings(eventId: string): import("@tanstack/react-query").UseMutationResult<EventChatResponse, Error, UpdateChatSettingsRequest, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Join event chat
|
|
8
|
+
*/
|
|
9
|
+
export declare function useJoinEventChat(eventId: string): import("@tanstack/react-query").UseMutationResult<ChatMemberResponse, Error, void, unknown>;
|
|
10
|
+
/**
|
|
11
|
+
* Leave event chat
|
|
12
|
+
*/
|
|
13
|
+
export declare function useLeaveEventChat(eventId: string): import("@tanstack/react-query").UseMutationResult<void, Error, void, unknown>;
|
|
14
|
+
/**
|
|
15
|
+
* Update member settings (mute, nickname)
|
|
16
|
+
*/
|
|
17
|
+
export declare function useUpdateMemberSettings(eventId: string): import("@tanstack/react-query").UseMutationResult<ChatMemberResponse, Error, UpdateMemberSettingsRequest, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Mark messages as read
|
|
20
|
+
*/
|
|
21
|
+
export declare function useMarkMessagesAsRead(eventId: string): import("@tanstack/react-query").UseMutationResult<void, Error, void, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Send a message
|
|
24
|
+
*/
|
|
25
|
+
export declare function useSendEventChatMessage(eventId: string): import("@tanstack/react-query").UseMutationResult<MessageResponse, Error, SendMessageRequest, unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* Update a message
|
|
28
|
+
*/
|
|
29
|
+
export declare function useUpdateEventChatMessage(eventId: string): import("@tanstack/react-query").UseMutationResult<MessageResponse, Error, {
|
|
30
|
+
messageId: string;
|
|
31
|
+
} & UpdateMessageRequest, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a message
|
|
34
|
+
*/
|
|
35
|
+
export declare function useDeleteEventChatMessage(eventId: string): import("@tanstack/react-query").UseMutationResult<void, Error, string, unknown>;
|