@growsober/sdk 1.0.1 → 1.0.3
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/dist/api/mutations/auth.d.ts +83 -1
- package/dist/api/mutations/auth.js +106 -5
- package/dist/api/queries/cities.d.ts +52 -0
- package/dist/api/queries/cities.js +82 -0
- package/dist/api/queries/index.d.ts +1 -0
- package/dist/api/queries/index.js +2 -1
- package/package.json +1 -1
- package/src/api/mutations/auth.ts +118 -4
- package/src/api/queries/cities.ts +194 -0
- package/src/api/queries/index.ts +1 -0
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module api/mutations/auth
|
|
8
8
|
*/
|
|
9
9
|
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
10
|
-
import type { RegisterRequest, LoginRequest, RefreshTokenRequest, FirebaseAuthRequest, AuthResponse, TokenResponse } from '../types';
|
|
10
|
+
import type { RegisterRequest, LoginRequest, RefreshTokenRequest, FirebaseAuthRequest, AuthResponse, TokenResponse, SendOtpRequest, OtpSentResponse, VerifyOtpRequest } from '../types';
|
|
11
11
|
/**
|
|
12
12
|
* Register a new user account
|
|
13
13
|
*
|
|
@@ -265,3 +265,85 @@ export declare function useRefreshAuthToken(options?: Omit<UseMutationOptions<To
|
|
|
265
265
|
* @returns TanStack Query mutation result
|
|
266
266
|
*/
|
|
267
267
|
export declare function useFirebaseAuth(options?: Omit<UseMutationOptions<AuthResponse, Error, FirebaseAuthRequest>, 'mutationFn'>): UseMutationResult<AuthResponse, Error, FirebaseAuthRequest>;
|
|
268
|
+
/**
|
|
269
|
+
* Response type for verify OTP including isNewUser flag
|
|
270
|
+
*/
|
|
271
|
+
export type VerifyOtpResponse = AuthResponse & {
|
|
272
|
+
isNewUser: boolean;
|
|
273
|
+
};
|
|
274
|
+
/**
|
|
275
|
+
* Send OTP to phone number
|
|
276
|
+
*
|
|
277
|
+
* @description
|
|
278
|
+
* Sends a verification code to the specified phone number via SMS or voice call.
|
|
279
|
+
* Used for passwordless authentication.
|
|
280
|
+
*
|
|
281
|
+
* @endpoint POST /auth/phone/send-otp
|
|
282
|
+
*
|
|
283
|
+
* @example
|
|
284
|
+
* ```tsx
|
|
285
|
+
* import { useSendOtp } from '@growsober/sdk';
|
|
286
|
+
*
|
|
287
|
+
* function PhoneInputScreen() {
|
|
288
|
+
* const { mutate: sendOtp, isPending, error } = useSendOtp({
|
|
289
|
+
* onSuccess: (data) => {
|
|
290
|
+
* console.log('OTP sent to:', data.phone);
|
|
291
|
+
* navigation.navigate('VerifyOtp', { phone });
|
|
292
|
+
* },
|
|
293
|
+
* onError: (error) => {
|
|
294
|
+
* Alert.alert('Error', error.message);
|
|
295
|
+
* },
|
|
296
|
+
* });
|
|
297
|
+
*
|
|
298
|
+
* const handleSend = () => {
|
|
299
|
+
* sendOtp({ phone: '+1234567890', channel: 'sms' });
|
|
300
|
+
* };
|
|
301
|
+
*
|
|
302
|
+
* return <Button onPress={handleSend} disabled={isPending} />;
|
|
303
|
+
* }
|
|
304
|
+
* ```
|
|
305
|
+
*
|
|
306
|
+
* @param options - TanStack Query mutation options
|
|
307
|
+
* @returns TanStack Query mutation result
|
|
308
|
+
*/
|
|
309
|
+
export declare function useSendOtp(options?: Omit<UseMutationOptions<OtpSentResponse, Error, SendOtpRequest>, 'mutationFn'>): UseMutationResult<OtpSentResponse, Error, SendOtpRequest>;
|
|
310
|
+
/**
|
|
311
|
+
* Verify OTP and authenticate
|
|
312
|
+
*
|
|
313
|
+
* @description
|
|
314
|
+
* Verifies the OTP code sent to the phone number and authenticates the user.
|
|
315
|
+
* If the user doesn't exist, a new account is created automatically.
|
|
316
|
+
* Returns authentication tokens and user information.
|
|
317
|
+
*
|
|
318
|
+
* @endpoint POST /auth/phone/verify-otp
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* ```tsx
|
|
322
|
+
* import { useVerifyOtp } from '@growsober/sdk';
|
|
323
|
+
*
|
|
324
|
+
* function VerifyOtpScreen({ phone }) {
|
|
325
|
+
* const { mutate: verifyOtp, isPending, error } = useVerifyOtp({
|
|
326
|
+
* onSuccess: async (data) => {
|
|
327
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
328
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
329
|
+
*
|
|
330
|
+
* if (data.isNewUser) {
|
|
331
|
+
* navigation.navigate('Onboarding');
|
|
332
|
+
* } else {
|
|
333
|
+
* navigation.navigate('Home');
|
|
334
|
+
* }
|
|
335
|
+
* },
|
|
336
|
+
* });
|
|
337
|
+
*
|
|
338
|
+
* const handleVerify = (code: string) => {
|
|
339
|
+
* verifyOtp({ phone, code });
|
|
340
|
+
* };
|
|
341
|
+
*
|
|
342
|
+
* return <OtpInput onComplete={handleVerify} disabled={isPending} />;
|
|
343
|
+
* }
|
|
344
|
+
* ```
|
|
345
|
+
*
|
|
346
|
+
* @param options - TanStack Query mutation options
|
|
347
|
+
* @returns TanStack Query mutation result
|
|
348
|
+
*/
|
|
349
|
+
export declare function useVerifyOtp(options?: Omit<UseMutationOptions<VerifyOtpResponse, Error, VerifyOtpRequest>, 'mutationFn'>): UseMutationResult<VerifyOtpResponse, Error, VerifyOtpRequest>;
|
|
@@ -12,6 +12,8 @@ exports.useRegister = useRegister;
|
|
|
12
12
|
exports.useLogin = useLogin;
|
|
13
13
|
exports.useRefreshAuthToken = useRefreshAuthToken;
|
|
14
14
|
exports.useFirebaseAuth = useFirebaseAuth;
|
|
15
|
+
exports.useSendOtp = useSendOtp;
|
|
16
|
+
exports.useVerifyOtp = useVerifyOtp;
|
|
15
17
|
const react_query_1 = require("@tanstack/react-query");
|
|
16
18
|
const client_1 = require("../client");
|
|
17
19
|
const users_1 = require("../queries/users");
|
|
@@ -64,7 +66,7 @@ function useRegister(options) {
|
|
|
64
66
|
return (0, react_query_1.useMutation)({
|
|
65
67
|
mutationFn: async (data) => {
|
|
66
68
|
const client = (0, client_1.getApiClient)();
|
|
67
|
-
const response = await client.post('/auth/register', data);
|
|
69
|
+
const response = await client.post('/api/v1/auth/register', data);
|
|
68
70
|
return response.data;
|
|
69
71
|
},
|
|
70
72
|
onSuccess: (data, variables, context) => {
|
|
@@ -135,7 +137,7 @@ function useLogin(options) {
|
|
|
135
137
|
return (0, react_query_1.useMutation)({
|
|
136
138
|
mutationFn: async (data) => {
|
|
137
139
|
const client = (0, client_1.getApiClient)();
|
|
138
|
-
const response = await client.post('/auth/login', data);
|
|
140
|
+
const response = await client.post('/api/v1/auth/login', data);
|
|
139
141
|
return response.data;
|
|
140
142
|
},
|
|
141
143
|
onSuccess: (data, variables, context) => {
|
|
@@ -223,7 +225,7 @@ function useRefreshAuthToken(options) {
|
|
|
223
225
|
return (0, react_query_1.useMutation)({
|
|
224
226
|
mutationFn: async (data) => {
|
|
225
227
|
const client = (0, client_1.getApiClient)();
|
|
226
|
-
const response = await client.post('/auth/refresh', data);
|
|
228
|
+
const response = await client.post('/api/v1/auth/refresh', data);
|
|
227
229
|
return response.data;
|
|
228
230
|
},
|
|
229
231
|
...options,
|
|
@@ -318,7 +320,7 @@ function useFirebaseAuth(options) {
|
|
|
318
320
|
return (0, react_query_1.useMutation)({
|
|
319
321
|
mutationFn: async (data) => {
|
|
320
322
|
const client = (0, client_1.getApiClient)();
|
|
321
|
-
const response = await client.post('/auth/firebase', data);
|
|
323
|
+
const response = await client.post('/api/v1/auth/firebase', data);
|
|
322
324
|
return response.data;
|
|
323
325
|
},
|
|
324
326
|
onSuccess: (data, variables, context) => {
|
|
@@ -329,4 +331,103 @@ function useFirebaseAuth(options) {
|
|
|
329
331
|
...options,
|
|
330
332
|
});
|
|
331
333
|
}
|
|
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==
|
|
334
|
+
/**
|
|
335
|
+
* Send OTP to phone number
|
|
336
|
+
*
|
|
337
|
+
* @description
|
|
338
|
+
* Sends a verification code to the specified phone number via SMS or voice call.
|
|
339
|
+
* Used for passwordless authentication.
|
|
340
|
+
*
|
|
341
|
+
* @endpoint POST /auth/phone/send-otp
|
|
342
|
+
*
|
|
343
|
+
* @example
|
|
344
|
+
* ```tsx
|
|
345
|
+
* import { useSendOtp } from '@growsober/sdk';
|
|
346
|
+
*
|
|
347
|
+
* function PhoneInputScreen() {
|
|
348
|
+
* const { mutate: sendOtp, isPending, error } = useSendOtp({
|
|
349
|
+
* onSuccess: (data) => {
|
|
350
|
+
* console.log('OTP sent to:', data.phone);
|
|
351
|
+
* navigation.navigate('VerifyOtp', { phone });
|
|
352
|
+
* },
|
|
353
|
+
* onError: (error) => {
|
|
354
|
+
* Alert.alert('Error', error.message);
|
|
355
|
+
* },
|
|
356
|
+
* });
|
|
357
|
+
*
|
|
358
|
+
* const handleSend = () => {
|
|
359
|
+
* sendOtp({ phone: '+1234567890', channel: 'sms' });
|
|
360
|
+
* };
|
|
361
|
+
*
|
|
362
|
+
* return <Button onPress={handleSend} disabled={isPending} />;
|
|
363
|
+
* }
|
|
364
|
+
* ```
|
|
365
|
+
*
|
|
366
|
+
* @param options - TanStack Query mutation options
|
|
367
|
+
* @returns TanStack Query mutation result
|
|
368
|
+
*/
|
|
369
|
+
function useSendOtp(options) {
|
|
370
|
+
return (0, react_query_1.useMutation)({
|
|
371
|
+
mutationFn: async (data) => {
|
|
372
|
+
const client = (0, client_1.getApiClient)();
|
|
373
|
+
const response = await client.post('/api/v1/auth/phone/send-otp', data);
|
|
374
|
+
return response.data;
|
|
375
|
+
},
|
|
376
|
+
...options,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Verify OTP and authenticate
|
|
381
|
+
*
|
|
382
|
+
* @description
|
|
383
|
+
* Verifies the OTP code sent to the phone number and authenticates the user.
|
|
384
|
+
* If the user doesn't exist, a new account is created automatically.
|
|
385
|
+
* Returns authentication tokens and user information.
|
|
386
|
+
*
|
|
387
|
+
* @endpoint POST /auth/phone/verify-otp
|
|
388
|
+
*
|
|
389
|
+
* @example
|
|
390
|
+
* ```tsx
|
|
391
|
+
* import { useVerifyOtp } from '@growsober/sdk';
|
|
392
|
+
*
|
|
393
|
+
* function VerifyOtpScreen({ phone }) {
|
|
394
|
+
* const { mutate: verifyOtp, isPending, error } = useVerifyOtp({
|
|
395
|
+
* onSuccess: async (data) => {
|
|
396
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
397
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
398
|
+
*
|
|
399
|
+
* if (data.isNewUser) {
|
|
400
|
+
* navigation.navigate('Onboarding');
|
|
401
|
+
* } else {
|
|
402
|
+
* navigation.navigate('Home');
|
|
403
|
+
* }
|
|
404
|
+
* },
|
|
405
|
+
* });
|
|
406
|
+
*
|
|
407
|
+
* const handleVerify = (code: string) => {
|
|
408
|
+
* verifyOtp({ phone, code });
|
|
409
|
+
* };
|
|
410
|
+
*
|
|
411
|
+
* return <OtpInput onComplete={handleVerify} disabled={isPending} />;
|
|
412
|
+
* }
|
|
413
|
+
* ```
|
|
414
|
+
*
|
|
415
|
+
* @param options - TanStack Query mutation options
|
|
416
|
+
* @returns TanStack Query mutation result
|
|
417
|
+
*/
|
|
418
|
+
function useVerifyOtp(options) {
|
|
419
|
+
const queryClient = (0, react_query_1.useQueryClient)();
|
|
420
|
+
return (0, react_query_1.useMutation)({
|
|
421
|
+
mutationFn: async (data) => {
|
|
422
|
+
const client = (0, client_1.getApiClient)();
|
|
423
|
+
const response = await client.post('/api/v1/auth/phone/verify-otp', data);
|
|
424
|
+
return response.data;
|
|
425
|
+
},
|
|
426
|
+
onSuccess: (data, variables, context) => {
|
|
427
|
+
// Invalidate current user query to trigger refetch with new token
|
|
428
|
+
queryClient.invalidateQueries({ queryKey: users_1.userKeys.me() });
|
|
429
|
+
},
|
|
430
|
+
...options,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7O0FBOERILGtDQWtCQztBQXlERCw0QkFrQkM7QUEyRUQsa0RBV0M7QUFzRkQsMENBa0JDO0FBMENELGdDQVdDO0FBeUNELG9DQWlCQztBQXRjRCx1REFBMkc7QUFDM0csc0NBQXlDO0FBQ3pDLDRDQUE0QztBQWE1QywrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsT0FBc0Y7SUFFdEYsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFxQixFQUF5QixFQUFFO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBZSx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoRixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsa0VBQWtFO1lBQ2xFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsU0FBZ0IsUUFBUSxDQUN0QixPQUFtRjtJQUVuRixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQWtCLEVBQXlCLEVBQUU7WUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFlLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdFLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3RUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FDakMsT0FBMkY7SUFFM0YsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUF5QixFQUEwQixFQUFFO1lBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBZ0Isc0JBQXNCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDaEYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUZHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixPQUEwRjtJQUUxRixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQXlCLEVBQXlCLEVBQUU7WUFDckUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFlLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELG1EQUFtRDtRQUNyRCxDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQU9EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixPQUF3RjtJQUV4RixPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQW9CLEVBQTRCLEVBQUU7WUFDbkUsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFrQiw2QkFBNkIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxTQUFnQixZQUFZLENBQzFCLE9BQTRGO0lBRTVGLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBc0IsRUFBOEIsRUFBRTtZQUN2RSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQW9CLCtCQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN0QyxrRUFBa0U7WUFDbEUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBdXRoIE11dGF0aW9uIEhvb2tzXG4gKlxuICogVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gaG9va3MgZm9yIGF1dGhlbnRpY2F0aW9uLXJlbGF0ZWQgd3JpdGUgb3BlcmF0aW9ucy5cbiAqIFRoZXNlIGhvb2tzIGhhbmRsZSB1c2VyIHJlZ2lzdHJhdGlvbiwgbG9naW4sIHRva2VuIHJlZnJlc2gsIGFuZCBGaXJlYmFzZSBhdXRoZW50aWNhdGlvbi5cbiAqXG4gKiBAbW9kdWxlIGFwaS9tdXRhdGlvbnMvYXV0aFxuICovXG5cbmltcG9ydCB7IHVzZU11dGF0aW9uLCBVc2VNdXRhdGlvbk9wdGlvbnMsIFVzZU11dGF0aW9uUmVzdWx0LCB1c2VRdWVyeUNsaWVudCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHsgdXNlcktleXMgfSBmcm9tICcuLi9xdWVyaWVzL3VzZXJzJztcbmltcG9ydCB0eXBlIHtcbiAgUmVnaXN0ZXJSZXF1ZXN0LFxuICBMb2dpblJlcXVlc3QsXG4gIFJlZnJlc2hUb2tlblJlcXVlc3QsXG4gIEZpcmViYXNlQXV0aFJlcXVlc3QsXG4gIEF1dGhSZXNwb25zZSxcbiAgVG9rZW5SZXNwb25zZSxcbiAgU2VuZE90cFJlcXVlc3QsXG4gIE90cFNlbnRSZXNwb25zZSxcbiAgVmVyaWZ5T3RwUmVxdWVzdCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBNVVRBVElPTiBIT09LU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgbmV3IHVzZXIgYWNjb3VudFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgd2l0aCBlbWFpbC9waG9uZSBhbmQgcGFzc3dvcmQuXG4gKiBSZXR1cm5zIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgdXNlciBpbmZvcm1hdGlvbiB1cG9uIHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uLlxuICpcbiAqIEBlbmRwb2ludCBQT1NUIC9hdXRoL3JlZ2lzdGVyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlUmVnaXN0ZXIgfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gUmVnaXN0ZXJGb3JtKCkge1xuICogICBjb25zdCB7IG11dGF0ZTogcmVnaXN0ZXIsIGlzUGVuZGluZywgZXJyb3IgfSA9IHVzZVJlZ2lzdGVyKHtcbiAqICAgICBvblN1Y2Nlc3M6IChkYXRhKSA9PiB7XG4gKiAgICAgICAvLyBTdG9yZSB0b2tlbnMgc2VjdXJlbHlcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygnYWNjZXNzVG9rZW4nLCBkYXRhLmFjY2Vzc1Rva2VuKTtcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygncmVmcmVzaFRva2VuJywgZGF0YS5yZWZyZXNoVG9rZW4pO1xuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnT25ib2FyZGluZycpO1xuICogICAgIH0sXG4gKiAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgICBBbGVydC5hbGVydCgnUmVnaXN0cmF0aW9uIGZhaWxlZCcsIGVycm9yLm1lc3NhZ2UpO1xuICogICAgIH0sXG4gKiAgIH0pO1xuICpcbiAqICAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICogICAgIHJlZ2lzdGVyKHtcbiAqICAgICAgIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScsXG4gKiAgICAgICBwYXNzd29yZDogJ1NlY3VyZVBhc3N3b3JkMTIzIScsXG4gKiAgICAgICBuYW1lOiAnSm9obiBEb2UnLFxuICogICAgIH0pO1xuICogICB9O1xuICpcbiAqICAgcmV0dXJuIDxCdXR0b24gb25QcmVzcz17aGFuZGxlU3VibWl0fSBkaXNhYmxlZD17aXNQZW5kaW5nfSAvPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWdpc3RlcihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEF1dGhSZXNwb25zZSwgRXJyb3IsIFJlZ2lzdGVyUmVxdWVzdD4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEF1dGhSZXNwb25zZSwgRXJyb3IsIFJlZ2lzdGVyUmVxdWVzdD4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogUmVnaXN0ZXJSZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDxBdXRoUmVzcG9uc2U+KCcvYXBpL3YxL2F1dGgvcmVnaXN0ZXInLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgdXNlciBxdWVyeSB0byB0cmlnZ2VyIHJlZmV0Y2ggd2l0aCBuZXcgdG9rZW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJLZXlzLm1lKCkgfSk7XG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIExvZ2luIHdpdGggZW1haWwvcGhvbmUgYW5kIHBhc3N3b3JkXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBdXRoZW50aWNhdGVzIGFuIGV4aXN0aW5nIHVzZXIgd2l0aCB0aGVpciBjcmVkZW50aWFscy5cbiAqIFJldHVybnMgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCB1c2VyIGluZm9ybWF0aW9uIHVwb24gc3VjY2Vzc2Z1bCBsb2dpbi5cbiAqXG4gKiBAZW5kcG9pbnQgUE9TVCAvYXV0aC9sb2dpblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUxvZ2luIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGZ1bmN0aW9uIExvZ2luRm9ybSgpIHtcbiAqICAgY29uc3QgeyBtdXRhdGU6IGxvZ2luLCBpc1BlbmRpbmcsIGVycm9yIH0gPSB1c2VMb2dpbih7XG4gKiAgICAgb25TdWNjZXNzOiAoZGF0YSkgPT4ge1xuICogICAgICAgLy8gU3RvcmUgdG9rZW5zIHNlY3VyZWx5XG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ2FjY2Vzc1Rva2VuJywgZGF0YS5hY2Nlc3NUb2tlbik7XG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicsIGRhdGEucmVmcmVzaFRva2VuKTtcbiAqICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ0hvbWUnKTtcbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAqICAgICBsb2dpbih7XG4gKiAgICAgICBlbWFpbDogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICogICAgICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzd29yZDEyMyEnLFxuICogICAgIH0pO1xuICogICB9O1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0fT5cbiAqICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBuYW1lPVwiZW1haWxcIiAvPlxuICogICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZFwiIC8+XG4gKiAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBkaXNhYmxlZD17aXNQZW5kaW5nfT5cbiAqICAgICAgICAge2lzUGVuZGluZyA/ICdMb2dnaW5nIGluLi4uJyA6ICdMb2dpbid9XG4gKiAgICAgICA8L2J1dHRvbj5cbiAqICAgICAgIHtlcnJvciAmJiA8cCBjbGFzc05hbWU9XCJlcnJvclwiPntlcnJvci5tZXNzYWdlfTwvcD59XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIExvZ2luIHdpdGggcGhvbmUgbnVtYmVyOlxuICogYGBgdHN4XG4gKiBsb2dpbih7XG4gKiAgIHBob25lOiAnKzEyMzQ1Njc4OTAnLFxuICogICBwYXNzd29yZDogJ1NlY3VyZVBhc3N3b3JkMTIzIScsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMb2dpbihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEF1dGhSZXNwb25zZSwgRXJyb3IsIExvZ2luUmVxdWVzdD4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEF1dGhSZXNwb25zZSwgRXJyb3IsIExvZ2luUmVxdWVzdD4ge1xuICBjb25zdCBxdWVyeUNsaWVudCA9IHVzZVF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogTG9naW5SZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDxBdXRoUmVzcG9uc2U+KCcvYXBpL3YxL2F1dGgvbG9naW4nLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgdXNlciBxdWVyeSB0byB0cmlnZ2VyIHJlZmV0Y2ggd2l0aCBuZXcgdG9rZW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJLZXlzLm1lKCkgfSk7XG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggYWNjZXNzIHRva2VuIHVzaW5nIHJlZnJlc2ggdG9rZW5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE9idGFpbnMgYSBuZXcgYWNjZXNzIHRva2VuIHVzaW5nIGEgdmFsaWQgcmVmcmVzaCB0b2tlbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYWNjZXNzIHRva2VuIGV4cGlyZXMuXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcmVmcmVzaFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVJlZnJlc2hBdXRoVG9rZW4gfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gdXNlVG9rZW5SZWZyZXNoKCkge1xuICogICBjb25zdCB7IG11dGF0ZUFzeW5jOiByZWZyZXNoVG9rZW4gfSA9IHVzZVJlZnJlc2hBdXRoVG9rZW4oKTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVRva2VuRXhwaXJlZCA9IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCBzdG9yZWRSZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICpcbiAqICAgICBpZiAoIXN0b3JlZFJlZnJlc2hUb2tlbikge1xuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICAgIHJldHVybjtcbiAqICAgICB9XG4gKlxuICogICAgIHRyeSB7XG4gKiAgICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbiB9ID0gYXdhaXQgcmVmcmVzaFRva2VuKHtcbiAqICAgICAgICAgcmVmcmVzaFRva2VuOiBzdG9yZWRSZWZyZXNoVG9rZW4sXG4gKiAgICAgICB9KTtcbiAqXG4gKiAgICAgICAvLyBTdG9yZSBuZXcgdG9rZW5zXG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBuZXdSZWZyZXNoVG9rZW4pO1xuICogICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgICAvLyBSZWZyZXNoIHRva2VuIGlzIGludmFsaWQgb3IgZXhwaXJlZFxuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4geyBoYW5kbGVUb2tlbkV4cGlyZWQgfTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBJbnRlZ3JhdGUgd2l0aCBTREsgY29uZmlndXJhdGlvbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgY29uZmlndXJlU0RLIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGNvbmZpZ3VyZVNESyh7XG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5ncm93c29iZXIuYXBwJyxcbiAqICAgZ2V0QWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICByZXR1cm4gYXdhaXQgU2VjdXJlU3RvcmUuZ2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicpO1xuICogICB9LFxuICogICByZWZyZXNoQWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICogICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbjogbmV3UmVmcmVzaFRva2VuIH0gPSBhd2FpdCBmZXRjaCgnL2F1dGgvcmVmcmVzaCcsIHtcbiAqICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICogICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZWZyZXNoVG9rZW4gfSksXG4gKiAgICAgfSkudGhlbihyID0+IHIuanNvbigpKTtcbiAqXG4gKiAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAqICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicsIG5ld1JlZnJlc2hUb2tlbik7XG4gKlxuICogICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAqICAgfSxcbiAqICAgb25VbmF1dGhvcml6ZWQ6ICgpID0+IHtcbiAqICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdMb2dpbicpO1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaEF1dGhUb2tlbihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPFRva2VuUmVzcG9uc2UsIEVycm9yLCBSZWZyZXNoVG9rZW5SZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8VG9rZW5SZXNwb25zZSwgRXJyb3IsIFJlZnJlc2hUb2tlblJlcXVlc3Q+IHtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogUmVmcmVzaFRva2VuUmVxdWVzdCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PFRva2VuUmVzcG9uc2U+KCcvYXBpL3YxL2F1dGgvcmVmcmVzaCcsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBBdXRoZW50aWNhdGUgd2l0aCBGaXJlYmFzZSBJRCB0b2tlblxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXV0aGVudGljYXRlcyBhIHVzZXIgdXNpbmcgYSBGaXJlYmFzZSBJRCB0b2tlbi5cbiAqIENyZWF0ZXMgYSBuZXcgdXNlciBhY2NvdW50IGlmIG9uZSBkb2Vzbid0IGV4aXN0LCBvciBsb2dzIGluIGFuIGV4aXN0aW5nIHVzZXIuXG4gKiBSZXR1cm5zIEdyb3dTb2JlciBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvZmlyZWJhc2VcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VGaXJlYmFzZUF1dGggfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKiBpbXBvcnQgeyBzaWduSW5XaXRoUGhvbmVOdW1iZXIgfSBmcm9tICdmaXJlYmFzZS9hdXRoJztcbiAqXG4gKiBmdW5jdGlvbiBQaG9uZUF1dGhTY3JlZW4oKSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiBmaXJlYmFzZUF1dGgsIGlzUGVuZGluZyB9ID0gdXNlRmlyZWJhc2VBdXRoKHtcbiAqICAgICBvblN1Y2Nlc3M6IChkYXRhKSA9PiB7XG4gKiAgICAgICAvLyBTdG9yZSBHcm93U29iZXIgdG9rZW5zXG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ2FjY2Vzc1Rva2VuJywgZGF0YS5hY2Nlc3NUb2tlbik7XG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicsIGRhdGEucmVmcmVzaFRva2VuKTtcbiAqXG4gKiAgICAgICBpZiAoZGF0YS51c2VyLm9uYm9hcmRpbmdDb21wbGV0ZWQpIHtcbiAqICAgICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnSG9tZScpO1xuICogICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnT25ib2FyZGluZycpO1xuICogICAgICAgfVxuICogICAgIH0sXG4gKiAgICAgb25FcnJvcjogKGVycm9yKSA9PiB7XG4gKiAgICAgICBBbGVydC5hbGVydCgnQXV0aGVudGljYXRpb24gZmFpbGVkJywgZXJyb3IubWVzc2FnZSk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVQaG9uZUF1dGggPSBhc3luYyAocGhvbmVOdW1iZXI6IHN0cmluZykgPT4ge1xuICogICAgIHRyeSB7XG4gKiAgICAgICAvLyBGaXJlYmFzZSBhdXRoZW50aWNhdGlvbiBmbG93XG4gKiAgICAgICBjb25zdCBjb25maXJtYXRpb24gPSBhd2FpdCBzaWduSW5XaXRoUGhvbmVOdW1iZXIoYXV0aCwgcGhvbmVOdW1iZXIpO1xuICogICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHByb21wdFVzZXJGb3JDb2RlKCk7IC8vIFlvdXIgVUkgdG8gZ2V0IHZlcmlmaWNhdGlvbiBjb2RlXG4gKiAgICAgICBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uLmNvbmZpcm0oY29kZSk7XG4gKlxuICogICAgICAgLy8gR2V0IEZpcmViYXNlIElEIHRva2VuXG4gKiAgICAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgY3JlZGVudGlhbC51c2VyLmdldElkVG9rZW4oKTtcbiAqXG4gKiAgICAgICAvLyBBdXRoZW50aWNhdGUgd2l0aCBHcm93U29iZXIgYmFja2VuZFxuICogICAgICAgZmlyZWJhc2VBdXRoKHsgaWRUb2tlbiB9KTtcbiAqICAgICB9IGNhdGNoIChlcnJvcikge1xuICogICAgICAgY29uc29sZS5lcnJvcignUGhvbmUgYXV0aCBlcnJvcjonLCBlcnJvcik7XG4gKiAgICAgfVxuICogICB9O1xuICpcbiAqICAgcmV0dXJuIDxQaG9uZUlucHV0IG9uU3VibWl0PXtoYW5kbGVQaG9uZUF1dGh9IGRpc2FibGVkPXtpc1BlbmRpbmd9IC8+O1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggR29vZ2xlIFNpZ24tSW46XG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IEdvb2dsZVNpZ25pbiB9IGZyb20gJ0ByZWFjdC1uYXRpdmUtZ29vZ2xlLXNpZ25pbi9nb29nbGUtc2lnbmluJztcbiAqXG4gKiBjb25zdCBoYW5kbGVHb29nbGVTaWduSW4gPSBhc3luYyAoKSA9PiB7XG4gKiAgIGNvbnN0IHsgaWRUb2tlbiB9ID0gYXdhaXQgR29vZ2xlU2lnbmluLnNpZ25JbigpO1xuICogICBmaXJlYmFzZUF1dGgoeyBpZFRva2VuIH0pO1xuICogfTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIEFwcGxlIFNpZ24tSW46XG4gKiBgYGB0c3hcbiAqIGltcG9ydCAqIGFzIEFwcGxlQXV0aGVudGljYXRpb24gZnJvbSAnZXhwby1hcHBsZS1hdXRoZW50aWNhdGlvbic7XG4gKlxuICogY29uc3QgaGFuZGxlQXBwbGVTaWduSW4gPSBhc3luYyAoKSA9PiB7XG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBBcHBsZUF1dGhlbnRpY2F0aW9uLnNpZ25JbkFzeW5jKHtcbiAqICAgICByZXF1ZXN0ZWRTY29wZXM6IFtcbiAqICAgICAgIEFwcGxlQXV0aGVudGljYXRpb24uQXBwbGVBdXRoZW50aWNhdGlvblNjb3BlLkZVTExfTkFNRSxcbiAqICAgICAgIEFwcGxlQXV0aGVudGljYXRpb24uQXBwbGVBdXRoZW50aWNhdGlvblNjb3BlLkVNQUlMLFxuICogICAgIF0sXG4gKiAgIH0pO1xuICogICBmaXJlYmFzZUF1dGgoeyBpZFRva2VuOiBjcmVkZW50aWFsLmlkZW50aXR5VG9rZW4gfSk7XG4gKiB9O1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUZpcmViYXNlQXV0aChcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPEF1dGhSZXNwb25zZSwgRXJyb3IsIEZpcmViYXNlQXV0aFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBdXRoUmVzcG9uc2UsIEVycm9yLCBGaXJlYmFzZUF1dGhSZXF1ZXN0PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBGaXJlYmFzZUF1dGhSZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdDxBdXRoUmVzcG9uc2U+KCcvYXBpL3YxL2F1dGgvZmlyZWJhc2UnLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgdXNlciBxdWVyeSB0byB0cmlnZ2VyIHJlZmV0Y2ggd2l0aCBuZXcgdG9rZW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJLZXlzLm1lKCkgfSk7XG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIHR5cGUgZm9yIHZlcmlmeSBPVFAgaW5jbHVkaW5nIGlzTmV3VXNlciBmbGFnXG4gKi9cbmV4cG9ydCB0eXBlIFZlcmlmeU90cFJlc3BvbnNlID0gQXV0aFJlc3BvbnNlICYgeyBpc05ld1VzZXI6IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBTZW5kIE9UUCB0byBwaG9uZSBudW1iZXJcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFNlbmRzIGEgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdGhlIHNwZWNpZmllZCBwaG9uZSBudW1iZXIgdmlhIFNNUyBvciB2b2ljZSBjYWxsLlxuICogVXNlZCBmb3IgcGFzc3dvcmRsZXNzIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBlbmRwb2ludCBQT1NUIC9hdXRoL3Bob25lL3NlbmQtb3RwXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgdXNlU2VuZE90cCB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBQaG9uZUlucHV0U2NyZWVuKCkge1xuICogICBjb25zdCB7IG11dGF0ZTogc2VuZE90cCwgaXNQZW5kaW5nLCBlcnJvciB9ID0gdXNlU2VuZE90cCh7XG4gKiAgICAgb25TdWNjZXNzOiAoZGF0YSkgPT4ge1xuICogICAgICAgY29uc29sZS5sb2coJ09UUCBzZW50IHRvOicsIGRhdGEucGhvbmUpO1xuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnVmVyaWZ5T3RwJywgeyBwaG9uZSB9KTtcbiAqICAgICB9LFxuICogICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICogICAgICAgQWxlcnQuYWxlcnQoJ0Vycm9yJywgZXJyb3IubWVzc2FnZSk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVTZW5kID0gKCkgPT4ge1xuICogICAgIHNlbmRPdHAoeyBwaG9uZTogJysxMjM0NTY3ODkwJywgY2hhbm5lbDogJ3NtcycgfSk7XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4gPEJ1dHRvbiBvblByZXNzPXtoYW5kbGVTZW5kfSBkaXNhYmxlZD17aXNQZW5kaW5nfSAvPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTZW5kT3RwKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8T3RwU2VudFJlc3BvbnNlLCBFcnJvciwgU2VuZE90cFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxPdHBTZW50UmVzcG9uc2UsIEVycm9yLCBTZW5kT3RwUmVxdWVzdD4ge1xuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBTZW5kT3RwUmVxdWVzdCk6IFByb21pc2U8T3RwU2VudFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8T3RwU2VudFJlc3BvbnNlPignL2FwaS92MS9hdXRoL3Bob25lL3NlbmQtb3RwJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFZlcmlmeSBPVFAgYW5kIGF1dGhlbnRpY2F0ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVmVyaWZpZXMgdGhlIE9UUCBjb2RlIHNlbnQgdG8gdGhlIHBob25lIG51bWJlciBhbmQgYXV0aGVudGljYXRlcyB0aGUgdXNlci5cbiAqIElmIHRoZSB1c2VyIGRvZXNuJ3QgZXhpc3QsIGEgbmV3IGFjY291bnQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICogUmV0dXJucyBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcGhvbmUvdmVyaWZ5LW90cFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVZlcmlmeU90cCB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBWZXJpZnlPdHBTY3JlZW4oeyBwaG9uZSB9KSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiB2ZXJpZnlPdHAsIGlzUGVuZGluZywgZXJyb3IgfSA9IHVzZVZlcmlmeU90cCh7XG4gKiAgICAgb25TdWNjZXNzOiBhc3luYyAoZGF0YSkgPT4ge1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKlxuICogICAgICAgaWYgKGRhdGEuaXNOZXdVc2VyKSB7XG4gKiAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ09uYm9hcmRpbmcnKTtcbiAqICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ0hvbWUnKTtcbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVZlcmlmeSA9IChjb2RlOiBzdHJpbmcpID0+IHtcbiAqICAgICB2ZXJpZnlPdHAoeyBwaG9uZSwgY29kZSB9KTtcbiAqICAgfTtcbiAqXG4gKiAgIHJldHVybiA8T3RwSW5wdXQgb25Db21wbGV0ZT17aGFuZGxlVmVyaWZ5fSBkaXNhYmxlZD17aXNQZW5kaW5nfSAvPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWZXJpZnlPdHAoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZU11dGF0aW9uT3B0aW9uczxWZXJpZnlPdHBSZXNwb25zZSwgRXJyb3IsIFZlcmlmeU90cFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxWZXJpZnlPdHBSZXNwb25zZSwgRXJyb3IsIFZlcmlmeU90cFJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IFZlcmlmeU90cFJlcXVlc3QpOiBQcm9taXNlPFZlcmlmeU90cFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8VmVyaWZ5T3RwUmVzcG9uc2U+KCcvYXBpL3YxL2F1dGgvcGhvbmUvdmVyaWZ5LW90cCcsIGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLmRhdGE7XG4gICAgfSxcbiAgICBvblN1Y2Nlc3M6IChkYXRhLCB2YXJpYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgICAgIC8vIEludmFsaWRhdGUgY3VycmVudCB1c2VyIHF1ZXJ5IHRvIHRyaWdnZXIgcmVmZXRjaCB3aXRoIG5ldyB0b2tlblxuICAgICAgcXVlcnlDbGllbnQuaW52YWxpZGF0ZVF1ZXJpZXMoeyBxdWVyeUtleTogdXNlcktleXMubWUoKSB9KTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cities Query Hooks
|
|
3
|
+
*
|
|
4
|
+
* TanStack Query hooks for fetching city data.
|
|
5
|
+
* Cities are used for location-based features and user onboarding.
|
|
6
|
+
*
|
|
7
|
+
* @module api/queries/cities
|
|
8
|
+
*/
|
|
9
|
+
import { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
|
|
10
|
+
export declare const cityKeys: {
|
|
11
|
+
all: readonly ["cities"];
|
|
12
|
+
lists: () => readonly ["cities", "list"];
|
|
13
|
+
list: (filters?: CityFilters) => readonly ["cities", "list", CityFilters | undefined];
|
|
14
|
+
details: () => readonly ["cities", "detail"];
|
|
15
|
+
detail: (id: string) => readonly ["cities", "detail", string];
|
|
16
|
+
featured: () => readonly ["cities", "featured"];
|
|
17
|
+
};
|
|
18
|
+
export interface CityResponse {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
country: string;
|
|
22
|
+
countryCode: string | null;
|
|
23
|
+
timezone: string | null;
|
|
24
|
+
latitude: number | null;
|
|
25
|
+
longitude: number | null;
|
|
26
|
+
memberCount: number;
|
|
27
|
+
isFeatured: boolean;
|
|
28
|
+
region: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface CityFilters {
|
|
31
|
+
search?: string;
|
|
32
|
+
countryCode?: string;
|
|
33
|
+
isFeatured?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function useCities(filters?: CityFilters, options?: Omit<UseQueryOptions<CityResponse[]>, 'queryKey' | 'queryFn'>): UseQueryResult<CityResponse[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Get featured cities
|
|
38
|
+
*
|
|
39
|
+
* @description
|
|
40
|
+
* Fetches only cities marked as featured.
|
|
41
|
+
* Useful for showing popular/recommended cities.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const { data: featuredCities } = useFeaturedCities();
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param options - TanStack Query options
|
|
49
|
+
* @returns TanStack Query result with array of featured cities
|
|
50
|
+
*/
|
|
51
|
+
export declare function useFeaturedCities(options?: Omit<UseQueryOptions<CityResponse[]>, 'queryKey' | 'queryFn'>): UseQueryResult<CityResponse[]>;
|
|
52
|
+
export declare function useCity(id: string, options?: Omit<UseQueryOptions<CityResponse>, 'queryKey' | 'queryFn'>): UseQueryResult<CityResponse>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cities Query Hooks
|
|
4
|
+
*
|
|
5
|
+
* TanStack Query hooks for fetching city data.
|
|
6
|
+
* Cities are used for location-based features and user onboarding.
|
|
7
|
+
*
|
|
8
|
+
* @module api/queries/cities
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.cityKeys = void 0;
|
|
12
|
+
exports.useCities = useCities;
|
|
13
|
+
exports.useFeaturedCities = useFeaturedCities;
|
|
14
|
+
exports.useCity = useCity;
|
|
15
|
+
const react_query_1 = require("@tanstack/react-query");
|
|
16
|
+
const client_1 = require("../client");
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// QUERY KEY FACTORY
|
|
19
|
+
// ============================================================================
|
|
20
|
+
exports.cityKeys = {
|
|
21
|
+
all: ['cities'],
|
|
22
|
+
lists: () => [...exports.cityKeys.all, 'list'],
|
|
23
|
+
list: (filters) => [...exports.cityKeys.lists(), filters],
|
|
24
|
+
details: () => [...exports.cityKeys.all, 'detail'],
|
|
25
|
+
detail: (id) => [...exports.cityKeys.details(), id],
|
|
26
|
+
featured: () => [...exports.cityKeys.all, 'featured'],
|
|
27
|
+
};
|
|
28
|
+
function useCities(filters, options) {
|
|
29
|
+
return (0, react_query_1.useQuery)({
|
|
30
|
+
queryKey: exports.cityKeys.list(filters),
|
|
31
|
+
queryFn: async () => {
|
|
32
|
+
const client = (0, client_1.getApiClient)();
|
|
33
|
+
const params = new URLSearchParams();
|
|
34
|
+
if (filters?.search)
|
|
35
|
+
params.append('search', filters.search);
|
|
36
|
+
if (filters?.countryCode)
|
|
37
|
+
params.append('countryCode', filters.countryCode);
|
|
38
|
+
if (filters?.isFeatured !== undefined)
|
|
39
|
+
params.append('isFeatured', String(filters.isFeatured));
|
|
40
|
+
const queryString = params.toString();
|
|
41
|
+
const url = `/api/v1/cities${queryString ? `?${queryString}` : ''}`;
|
|
42
|
+
const response = await client.get(url);
|
|
43
|
+
// Handle both wrapped and unwrapped response formats
|
|
44
|
+
return Array.isArray(response.data) ? response.data : response.data.data;
|
|
45
|
+
},
|
|
46
|
+
staleTime: 5 * 60 * 1000, // Cities don't change often, cache for 5 minutes
|
|
47
|
+
...options,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get featured cities
|
|
52
|
+
*
|
|
53
|
+
* @description
|
|
54
|
+
* Fetches only cities marked as featured.
|
|
55
|
+
* Useful for showing popular/recommended cities.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* const { data: featuredCities } = useFeaturedCities();
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @param options - TanStack Query options
|
|
63
|
+
* @returns TanStack Query result with array of featured cities
|
|
64
|
+
*/
|
|
65
|
+
function useFeaturedCities(options) {
|
|
66
|
+
return useCities({ isFeatured: true }, options);
|
|
67
|
+
}
|
|
68
|
+
function useCity(id, options) {
|
|
69
|
+
return (0, react_query_1.useQuery)({
|
|
70
|
+
queryKey: exports.cityKeys.detail(id),
|
|
71
|
+
queryFn: async () => {
|
|
72
|
+
const client = (0, client_1.getApiClient)();
|
|
73
|
+
const response = await client.get(`/api/v1/cities/${id}`);
|
|
74
|
+
// Handle both wrapped and unwrapped response formats
|
|
75
|
+
return response.data.data || response.data;
|
|
76
|
+
},
|
|
77
|
+
enabled: !!id,
|
|
78
|
+
staleTime: 5 * 60 * 1000,
|
|
79
|
+
...options,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2l0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9xdWVyaWVzL2NpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBbUdILDhCQXdCQztBQWlCRCw4Q0FJQztBQTBCRCwwQkFnQkM7QUF4TEQsdURBQWtGO0FBQ2xGLHNDQUF5QztBQUV6QywrRUFBK0U7QUFDL0Usb0JBQW9CO0FBQ3BCLCtFQUErRTtBQUVsRSxRQUFBLFFBQVEsR0FBRztJQUN0QixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQVU7SUFDeEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxnQkFBUSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQVU7SUFDL0MsSUFBSSxFQUFFLENBQUMsT0FBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGdCQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFVO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFVO0lBQ25ELE1BQU0sRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGdCQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFVO0lBQzVELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsZ0JBQVEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFVO0NBQ3ZELENBQUM7QUFtRkYsU0FBZ0IsU0FBUyxDQUN2QixPQUFxQixFQUNyQixPQUF1RTtJQUV2RSxPQUFPLElBQUEsc0JBQVEsRUFBQztRQUNkLFFBQVEsRUFBRSxnQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDaEMsT0FBTyxFQUFFLEtBQUssSUFBNkIsRUFBRTtZQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBRXJDLElBQUksT0FBTyxFQUFFLE1BQU07Z0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdELElBQUksT0FBTyxFQUFFLFdBQVc7Z0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVFLElBQUksT0FBTyxFQUFFLFVBQVUsS0FBSyxTQUFTO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUUvRixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFFcEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFvQixHQUFHLENBQUMsQ0FBQztZQUMxRCxxREFBcUQ7WUFDckQsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDM0UsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxpREFBaUQ7UUFDM0UsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQy9CLE9BQXVFO0lBRXZFLE9BQU8sU0FBUyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUEwQkQsU0FBZ0IsT0FBTyxDQUNyQixFQUFVLEVBQ1YsT0FBcUU7SUFFckUsT0FBTyxJQUFBLHNCQUFRLEVBQUM7UUFDZCxRQUFRLEVBQUUsZ0JBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sRUFBRSxLQUFLLElBQTJCLEVBQUU7WUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFrQixrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRSxxREFBcUQ7WUFDckQsT0FBUSxRQUFRLENBQUMsSUFBWSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3RELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDYixTQUFTLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJO1FBQ3hCLEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENpdGllcyBRdWVyeSBIb29rc1xuICpcbiAqIFRhblN0YWNrIFF1ZXJ5IGhvb2tzIGZvciBmZXRjaGluZyBjaXR5IGRhdGEuXG4gKiBDaXRpZXMgYXJlIHVzZWQgZm9yIGxvY2F0aW9uLWJhc2VkIGZlYXR1cmVzIGFuZCB1c2VyIG9uYm9hcmRpbmcuXG4gKlxuICogQG1vZHVsZSBhcGkvcXVlcmllcy9jaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zLCBVc2VRdWVyeVJlc3VsdCB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBnZXRBcGlDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBRVUVSWSBLRVkgRkFDVE9SWVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgY2l0eUtleXMgPSB7XG4gIGFsbDogWydjaXRpZXMnXSBhcyBjb25zdCxcbiAgbGlzdHM6ICgpID0+IFsuLi5jaXR5S2V5cy5hbGwsICdsaXN0J10gYXMgY29uc3QsXG4gIGxpc3Q6IChmaWx0ZXJzPzogQ2l0eUZpbHRlcnMpID0+IFsuLi5jaXR5S2V5cy5saXN0cygpLCBmaWx0ZXJzXSBhcyBjb25zdCxcbiAgZGV0YWlsczogKCkgPT4gWy4uLmNpdHlLZXlzLmFsbCwgJ2RldGFpbCddIGFzIGNvbnN0LFxuICBkZXRhaWw6IChpZDogc3RyaW5nKSA9PiBbLi4uY2l0eUtleXMuZGV0YWlscygpLCBpZF0gYXMgY29uc3QsXG4gIGZlYXR1cmVkOiAoKSA9PiBbLi4uY2l0eUtleXMuYWxsLCAnZmVhdHVyZWQnXSBhcyBjb25zdCxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRZUEVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2l0eVJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjb3VudHJ5OiBzdHJpbmc7XG4gIGNvdW50cnlDb2RlOiBzdHJpbmcgfCBudWxsO1xuICB0aW1lem9uZTogc3RyaW5nIHwgbnVsbDtcbiAgbGF0aXR1ZGU6IG51bWJlciB8IG51bGw7XG4gIGxvbmdpdHVkZTogbnVtYmVyIHwgbnVsbDtcbiAgbWVtYmVyQ291bnQ6IG51bWJlcjtcbiAgaXNGZWF0dXJlZDogYm9vbGVhbjtcbiAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENpdHlGaWx0ZXJzIHtcbiAgc2VhcmNoPzogc3RyaW5nO1xuICBjb3VudHJ5Q29kZT86IHN0cmluZztcbiAgaXNGZWF0dXJlZD86IGJvb2xlYW47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFFVRVJZIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2V0IGxpc3Qgb2YgY2l0aWVzIHdpdGggb3B0aW9uYWwgZmlsdGVyc1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRmV0Y2hlcyBhdmFpbGFibGUgY2l0aWVzIGZvciBsb2NhdGlvbiBzZWxlY3Rpb24uXG4gKiBDYW4gYmUgZmlsdGVyZWQgYnkgbmFtZSBzZWFyY2gsIGNvdW50cnkgY29kZSwgb3IgZmVhdHVyZWQgc3RhdHVzLlxuICogUmVzdWx0cyBhcmUgb3JkZXJlZCBieSBmZWF0dXJlZCBzdGF0dXMsIG1lbWJlciBjb3VudCwgYW5kIG5hbWUuXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL2NpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUNpdGllcyB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBDaXR5UGlja2VyKCkge1xuICogICBjb25zdCB7IGRhdGE6IGNpdGllcywgaXNMb2FkaW5nIH0gPSB1c2VDaXRpZXMoKTtcbiAqXG4gKiAgIGlmIChpc0xvYWRpbmcpIHJldHVybiA8U3Bpbm5lciAvPjtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPHNlbGVjdD5cbiAqICAgICAgIHtjaXRpZXM/Lm1hcChjaXR5ID0+IChcbiAqICAgICAgICAgPG9wdGlvbiBrZXk9e2NpdHkuaWR9IHZhbHVlPXtjaXR5LmlkfT5cbiAqICAgICAgICAgICB7Y2l0eS5uYW1lfSwge2NpdHkuY291bnRyeX1cbiAqICAgICAgICAgPC9vcHRpb24+XG4gKiAgICAgICApKX1cbiAqICAgICA8L3NlbGVjdD5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHNlYXJjaCBmaWx0ZXI6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YTogY2l0aWVzIH0gPSB1c2VDaXRpZXMoeyBzZWFyY2g6ICdMb25kb24nIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIEZpbHRlciBieSBjb3VudHJ5OlxuICogYGBgdHN4XG4gKiBjb25zdCB7IGRhdGE6IHVrQ2l0aWVzIH0gPSB1c2VDaXRpZXMoeyBjb3VudHJ5Q29kZTogJ0dCJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyBmb3IgY2l0eSBzZWFyY2hcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgcmVzdWx0IHdpdGggYXJyYXkgb2YgY2l0aWVzXG4gKi9cbmludGVyZmFjZSBDaXRpZXNBcGlSZXNwb25zZSB7XG4gIGRhdGE6IENpdHlSZXNwb25zZVtdO1xuICBtZXRhOiB7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VDaXRpZXMoXG4gIGZpbHRlcnM/OiBDaXR5RmlsdGVycyxcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPENpdHlSZXNwb25zZVtdPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbik6IFVzZVF1ZXJ5UmVzdWx0PENpdHlSZXNwb25zZVtdPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGNpdHlLZXlzLmxpc3QoZmlsdGVycyksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2l0eVJlc3BvbnNlW10+ID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEFwaUNsaWVudCgpO1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuXG4gICAgICBpZiAoZmlsdGVycz8uc2VhcmNoKSBwYXJhbXMuYXBwZW5kKCdzZWFyY2gnLCBmaWx0ZXJzLnNlYXJjaCk7XG4gICAgICBpZiAoZmlsdGVycz8uY291bnRyeUNvZGUpIHBhcmFtcy5hcHBlbmQoJ2NvdW50cnlDb2RlJywgZmlsdGVycy5jb3VudHJ5Q29kZSk7XG4gICAgICBpZiAoZmlsdGVycz8uaXNGZWF0dXJlZCAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuYXBwZW5kKCdpc0ZlYXR1cmVkJywgU3RyaW5nKGZpbHRlcnMuaXNGZWF0dXJlZCkpO1xuXG4gICAgICBjb25zdCBxdWVyeVN0cmluZyA9IHBhcmFtcy50b1N0cmluZygpO1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvY2l0aWVzJHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YDtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PENpdGllc0FwaVJlc3BvbnNlPih1cmwpO1xuICAgICAgLy8gSGFuZGxlIGJvdGggd3JhcHBlZCBhbmQgdW53cmFwcGVkIHJlc3BvbnNlIGZvcm1hdHNcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJlc3BvbnNlLmRhdGEpID8gcmVzcG9uc2UuZGF0YSA6IHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgICB9LFxuICAgIHN0YWxlVGltZTogNSAqIDYwICogMTAwMCwgLy8gQ2l0aWVzIGRvbid0IGNoYW5nZSBvZnRlbiwgY2FjaGUgZm9yIDUgbWludXRlc1xuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBmZWF0dXJlZCBjaXRpZXNcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEZldGNoZXMgb25seSBjaXRpZXMgbWFya2VkIGFzIGZlYXR1cmVkLlxuICogVXNlZnVsIGZvciBzaG93aW5nIHBvcHVsYXIvcmVjb21tZW5kZWQgY2l0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgZGF0YTogZmVhdHVyZWRDaXRpZXMgfSA9IHVzZUZlYXR1cmVkQ2l0aWVzKCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IHJlc3VsdCB3aXRoIGFycmF5IG9mIGZlYXR1cmVkIGNpdGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmVhdHVyZWRDaXRpZXMoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxDaXR5UmVzcG9uc2VbXT4sICdxdWVyeUtleScgfCAncXVlcnlGbic+XG4pOiBVc2VRdWVyeVJlc3VsdDxDaXR5UmVzcG9uc2VbXT4ge1xuICByZXR1cm4gdXNlQ2l0aWVzKHsgaXNGZWF0dXJlZDogdHJ1ZSB9LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBHZXQgYSBzaW5nbGUgY2l0eSBieSBJRFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogRmV0Y2hlcyBkZXRhaWxzIGZvciBhIHNwZWNpZmljIGNpdHkuXG4gKlxuICogQGVuZHBvaW50IEdFVCAvYXBpL3YxL2NpdGllcy97aWR9XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBkYXRhOiBjaXR5IH0gPSB1c2VDaXR5KCdjaXR5LXV1aWQnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBpZCAtIENpdHkgSURcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgcmVzdWx0IHdpdGggY2l0eSBkYXRhXG4gKi9cbmludGVyZmFjZSBDaXR5QXBpUmVzcG9uc2Uge1xuICBkYXRhOiBDaXR5UmVzcG9uc2U7XG4gIG1ldGE6IHtcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNpdHkoXG4gIGlkOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxDaXR5UmVzcG9uc2U+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKTogVXNlUXVlcnlSZXN1bHQ8Q2l0eVJlc3BvbnNlPiB7XG4gIHJldHVybiB1c2VRdWVyeSh7XG4gICAgcXVlcnlLZXk6IGNpdHlLZXlzLmRldGFpbChpZCksXG4gICAgcXVlcnlGbjogYXN5bmMgKCk6IFByb21pc2U8Q2l0eVJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxDaXR5QXBpUmVzcG9uc2U+KGAvYXBpL3YxL2NpdGllcy8ke2lkfWApO1xuICAgICAgLy8gSGFuZGxlIGJvdGggd3JhcHBlZCBhbmQgdW53cmFwcGVkIHJlc3BvbnNlIGZvcm1hdHNcbiAgICAgIHJldHVybiAocmVzcG9uc2UuZGF0YSBhcyBhbnkpLmRhdGEgfHwgcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIGVuYWJsZWQ6ICEhaWQsXG4gICAgc3RhbGVUaW1lOiA1ICogNjAgKiAxMDAwLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuIl19
|
|
@@ -23,6 +23,7 @@ __exportStar(require("./admin"), exports);
|
|
|
23
23
|
__exportStar(require("./auth"), exports);
|
|
24
24
|
__exportStar(require("./bookings"), exports);
|
|
25
25
|
__exportStar(require("./businesses"), exports);
|
|
26
|
+
__exportStar(require("./cities"), exports);
|
|
26
27
|
__exportStar(require("./events"), exports);
|
|
27
28
|
__exportStar(require("./hubs"), exports);
|
|
28
29
|
__exportStar(require("./library"), exports);
|
|
@@ -37,4 +38,4 @@ __exportStar(require("./ambassadors"), exports);
|
|
|
37
38
|
__exportStar(require("./grow90"), exports);
|
|
38
39
|
__exportStar(require("./matching"), exports);
|
|
39
40
|
__exportStar(require("./event-chat"), exports);
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwwQ0FBd0I7QUFDeEIseUNBQXVCO0FBQ3ZCLDZDQUEyQjtBQUMzQiwrQ0FBNkI7QUFDN0IsMkNBQXlCO0FBQ3pCLDJDQUF5QjtBQUN6Qix5Q0FBdUI7QUFDdkIsNENBQTBCO0FBQzFCLHdDQUFzQjtBQUN0QixrREFBZ0M7QUFDaEMsMkNBQXlCO0FBQ3pCLGtEQUFnQztBQUNoQyw0Q0FBMEI7QUFDMUIsMENBQXdCO0FBQ3hCLHlDQUF1QjtBQUN2QixnREFBOEI7QUFDOUIsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1ZXJ5IEhvb2tzXG4gKlxuICogUmUtZXhwb3J0cyBhbGwgcXVlcnkgaG9va3MgZm9yIEFQSSBlbmRwb2ludHMuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9hZG1pbic7XG5leHBvcnQgKiBmcm9tICcuL2F1dGgnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29raW5ncyc7XG5leHBvcnQgKiBmcm9tICcuL2J1c2luZXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jaXRpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9odWJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGlicmFyeSc7XG5leHBvcnQgKiBmcm9tICcuL21hcCc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9vZmZlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vc3VwcG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vamFjayc7XG5leHBvcnQgKiBmcm9tICcuL2FtYmFzc2Fkb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JvdzkwJztcbmV4cG9ydCAqIGZyb20gJy4vbWF0Y2hpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudC1jaGF0JztcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -17,6 +17,9 @@ import type {
|
|
|
17
17
|
FirebaseAuthRequest,
|
|
18
18
|
AuthResponse,
|
|
19
19
|
TokenResponse,
|
|
20
|
+
SendOtpRequest,
|
|
21
|
+
OtpSentResponse,
|
|
22
|
+
VerifyOtpRequest,
|
|
20
23
|
} from '../types';
|
|
21
24
|
|
|
22
25
|
// ============================================================================
|
|
@@ -72,7 +75,7 @@ export function useRegister(
|
|
|
72
75
|
return useMutation({
|
|
73
76
|
mutationFn: async (data: RegisterRequest): Promise<AuthResponse> => {
|
|
74
77
|
const client = getApiClient();
|
|
75
|
-
const response = await client.post<AuthResponse>('/auth/register', data);
|
|
78
|
+
const response = await client.post<AuthResponse>('/api/v1/auth/register', data);
|
|
76
79
|
return response.data;
|
|
77
80
|
},
|
|
78
81
|
onSuccess: (data, variables, context) => {
|
|
@@ -147,7 +150,7 @@ export function useLogin(
|
|
|
147
150
|
return useMutation({
|
|
148
151
|
mutationFn: async (data: LoginRequest): Promise<AuthResponse> => {
|
|
149
152
|
const client = getApiClient();
|
|
150
|
-
const response = await client.post<AuthResponse>('/auth/login', data);
|
|
153
|
+
const response = await client.post<AuthResponse>('/api/v1/auth/login', data);
|
|
151
154
|
return response.data;
|
|
152
155
|
},
|
|
153
156
|
onSuccess: (data, variables, context) => {
|
|
@@ -238,7 +241,7 @@ export function useRefreshAuthToken(
|
|
|
238
241
|
return useMutation({
|
|
239
242
|
mutationFn: async (data: RefreshTokenRequest): Promise<TokenResponse> => {
|
|
240
243
|
const client = getApiClient();
|
|
241
|
-
const response = await client.post<TokenResponse>('/auth/refresh', data);
|
|
244
|
+
const response = await client.post<TokenResponse>('/api/v1/auth/refresh', data);
|
|
242
245
|
return response.data;
|
|
243
246
|
},
|
|
244
247
|
...options,
|
|
@@ -337,7 +340,7 @@ export function useFirebaseAuth(
|
|
|
337
340
|
return useMutation({
|
|
338
341
|
mutationFn: async (data: FirebaseAuthRequest): Promise<AuthResponse> => {
|
|
339
342
|
const client = getApiClient();
|
|
340
|
-
const response = await client.post<AuthResponse>('/auth/firebase', data);
|
|
343
|
+
const response = await client.post<AuthResponse>('/api/v1/auth/firebase', data);
|
|
341
344
|
return response.data;
|
|
342
345
|
},
|
|
343
346
|
onSuccess: (data, variables, context) => {
|
|
@@ -348,3 +351,114 @@ export function useFirebaseAuth(
|
|
|
348
351
|
...options,
|
|
349
352
|
});
|
|
350
353
|
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Response type for verify OTP including isNewUser flag
|
|
357
|
+
*/
|
|
358
|
+
export type VerifyOtpResponse = AuthResponse & { isNewUser: boolean };
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Send OTP to phone number
|
|
362
|
+
*
|
|
363
|
+
* @description
|
|
364
|
+
* Sends a verification code to the specified phone number via SMS or voice call.
|
|
365
|
+
* Used for passwordless authentication.
|
|
366
|
+
*
|
|
367
|
+
* @endpoint POST /auth/phone/send-otp
|
|
368
|
+
*
|
|
369
|
+
* @example
|
|
370
|
+
* ```tsx
|
|
371
|
+
* import { useSendOtp } from '@growsober/sdk';
|
|
372
|
+
*
|
|
373
|
+
* function PhoneInputScreen() {
|
|
374
|
+
* const { mutate: sendOtp, isPending, error } = useSendOtp({
|
|
375
|
+
* onSuccess: (data) => {
|
|
376
|
+
* console.log('OTP sent to:', data.phone);
|
|
377
|
+
* navigation.navigate('VerifyOtp', { phone });
|
|
378
|
+
* },
|
|
379
|
+
* onError: (error) => {
|
|
380
|
+
* Alert.alert('Error', error.message);
|
|
381
|
+
* },
|
|
382
|
+
* });
|
|
383
|
+
*
|
|
384
|
+
* const handleSend = () => {
|
|
385
|
+
* sendOtp({ phone: '+1234567890', channel: 'sms' });
|
|
386
|
+
* };
|
|
387
|
+
*
|
|
388
|
+
* return <Button onPress={handleSend} disabled={isPending} />;
|
|
389
|
+
* }
|
|
390
|
+
* ```
|
|
391
|
+
*
|
|
392
|
+
* @param options - TanStack Query mutation options
|
|
393
|
+
* @returns TanStack Query mutation result
|
|
394
|
+
*/
|
|
395
|
+
export function useSendOtp(
|
|
396
|
+
options?: Omit<UseMutationOptions<OtpSentResponse, Error, SendOtpRequest>, 'mutationFn'>
|
|
397
|
+
): UseMutationResult<OtpSentResponse, Error, SendOtpRequest> {
|
|
398
|
+
return useMutation({
|
|
399
|
+
mutationFn: async (data: SendOtpRequest): Promise<OtpSentResponse> => {
|
|
400
|
+
const client = getApiClient();
|
|
401
|
+
const response = await client.post<OtpSentResponse>('/api/v1/auth/phone/send-otp', data);
|
|
402
|
+
return response.data;
|
|
403
|
+
},
|
|
404
|
+
...options,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Verify OTP and authenticate
|
|
410
|
+
*
|
|
411
|
+
* @description
|
|
412
|
+
* Verifies the OTP code sent to the phone number and authenticates the user.
|
|
413
|
+
* If the user doesn't exist, a new account is created automatically.
|
|
414
|
+
* Returns authentication tokens and user information.
|
|
415
|
+
*
|
|
416
|
+
* @endpoint POST /auth/phone/verify-otp
|
|
417
|
+
*
|
|
418
|
+
* @example
|
|
419
|
+
* ```tsx
|
|
420
|
+
* import { useVerifyOtp } from '@growsober/sdk';
|
|
421
|
+
*
|
|
422
|
+
* function VerifyOtpScreen({ phone }) {
|
|
423
|
+
* const { mutate: verifyOtp, isPending, error } = useVerifyOtp({
|
|
424
|
+
* onSuccess: async (data) => {
|
|
425
|
+
* await SecureStore.setItemAsync('accessToken', data.accessToken);
|
|
426
|
+
* await SecureStore.setItemAsync('refreshToken', data.refreshToken);
|
|
427
|
+
*
|
|
428
|
+
* if (data.isNewUser) {
|
|
429
|
+
* navigation.navigate('Onboarding');
|
|
430
|
+
* } else {
|
|
431
|
+
* navigation.navigate('Home');
|
|
432
|
+
* }
|
|
433
|
+
* },
|
|
434
|
+
* });
|
|
435
|
+
*
|
|
436
|
+
* const handleVerify = (code: string) => {
|
|
437
|
+
* verifyOtp({ phone, code });
|
|
438
|
+
* };
|
|
439
|
+
*
|
|
440
|
+
* return <OtpInput onComplete={handleVerify} disabled={isPending} />;
|
|
441
|
+
* }
|
|
442
|
+
* ```
|
|
443
|
+
*
|
|
444
|
+
* @param options - TanStack Query mutation options
|
|
445
|
+
* @returns TanStack Query mutation result
|
|
446
|
+
*/
|
|
447
|
+
export function useVerifyOtp(
|
|
448
|
+
options?: Omit<UseMutationOptions<VerifyOtpResponse, Error, VerifyOtpRequest>, 'mutationFn'>
|
|
449
|
+
): UseMutationResult<VerifyOtpResponse, Error, VerifyOtpRequest> {
|
|
450
|
+
const queryClient = useQueryClient();
|
|
451
|
+
|
|
452
|
+
return useMutation({
|
|
453
|
+
mutationFn: async (data: VerifyOtpRequest): Promise<VerifyOtpResponse> => {
|
|
454
|
+
const client = getApiClient();
|
|
455
|
+
const response = await client.post<VerifyOtpResponse>('/api/v1/auth/phone/verify-otp', data);
|
|
456
|
+
return response.data;
|
|
457
|
+
},
|
|
458
|
+
onSuccess: (data, variables, context) => {
|
|
459
|
+
// Invalidate current user query to trigger refetch with new token
|
|
460
|
+
queryClient.invalidateQueries({ queryKey: userKeys.me() });
|
|
461
|
+
},
|
|
462
|
+
...options,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cities Query Hooks
|
|
3
|
+
*
|
|
4
|
+
* TanStack Query hooks for fetching city data.
|
|
5
|
+
* Cities are used for location-based features and user onboarding.
|
|
6
|
+
*
|
|
7
|
+
* @module api/queries/cities
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { useQuery, UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
|
|
11
|
+
import { getApiClient } from '../client';
|
|
12
|
+
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// QUERY KEY FACTORY
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
export const cityKeys = {
|
|
18
|
+
all: ['cities'] as const,
|
|
19
|
+
lists: () => [...cityKeys.all, 'list'] as const,
|
|
20
|
+
list: (filters?: CityFilters) => [...cityKeys.lists(), filters] as const,
|
|
21
|
+
details: () => [...cityKeys.all, 'detail'] as const,
|
|
22
|
+
detail: (id: string) => [...cityKeys.details(), id] as const,
|
|
23
|
+
featured: () => [...cityKeys.all, 'featured'] as const,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// TYPES
|
|
28
|
+
// ============================================================================
|
|
29
|
+
|
|
30
|
+
export interface CityResponse {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
country: string;
|
|
34
|
+
countryCode: string | null;
|
|
35
|
+
timezone: string | null;
|
|
36
|
+
latitude: number | null;
|
|
37
|
+
longitude: number | null;
|
|
38
|
+
memberCount: number;
|
|
39
|
+
isFeatured: boolean;
|
|
40
|
+
region: string | null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface CityFilters {
|
|
44
|
+
search?: string;
|
|
45
|
+
countryCode?: string;
|
|
46
|
+
isFeatured?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// QUERY HOOKS
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get list of cities with optional filters
|
|
55
|
+
*
|
|
56
|
+
* @description
|
|
57
|
+
* Fetches available cities for location selection.
|
|
58
|
+
* Can be filtered by name search, country code, or featured status.
|
|
59
|
+
* Results are ordered by featured status, member count, and name.
|
|
60
|
+
*
|
|
61
|
+
* @endpoint GET /api/v1/cities
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```tsx
|
|
65
|
+
* import { useCities } from '@growsober/sdk';
|
|
66
|
+
*
|
|
67
|
+
* function CityPicker() {
|
|
68
|
+
* const { data: cities, isLoading } = useCities();
|
|
69
|
+
*
|
|
70
|
+
* if (isLoading) return <Spinner />;
|
|
71
|
+
*
|
|
72
|
+
* return (
|
|
73
|
+
* <select>
|
|
74
|
+
* {cities?.map(city => (
|
|
75
|
+
* <option key={city.id} value={city.id}>
|
|
76
|
+
* {city.name}, {city.country}
|
|
77
|
+
* </option>
|
|
78
|
+
* ))}
|
|
79
|
+
* </select>
|
|
80
|
+
* );
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* With search filter:
|
|
86
|
+
* ```tsx
|
|
87
|
+
* const { data: cities } = useCities({ search: 'London' });
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* Filter by country:
|
|
92
|
+
* ```tsx
|
|
93
|
+
* const { data: ukCities } = useCities({ countryCode: 'GB' });
|
|
94
|
+
* ```
|
|
95
|
+
*
|
|
96
|
+
* @param filters - Optional filters for city search
|
|
97
|
+
* @param options - TanStack Query options
|
|
98
|
+
* @returns TanStack Query result with array of cities
|
|
99
|
+
*/
|
|
100
|
+
interface CitiesApiResponse {
|
|
101
|
+
data: CityResponse[];
|
|
102
|
+
meta: {
|
|
103
|
+
timestamp: string;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function useCities(
|
|
108
|
+
filters?: CityFilters,
|
|
109
|
+
options?: Omit<UseQueryOptions<CityResponse[]>, 'queryKey' | 'queryFn'>
|
|
110
|
+
): UseQueryResult<CityResponse[]> {
|
|
111
|
+
return useQuery({
|
|
112
|
+
queryKey: cityKeys.list(filters),
|
|
113
|
+
queryFn: async (): Promise<CityResponse[]> => {
|
|
114
|
+
const client = getApiClient();
|
|
115
|
+
const params = new URLSearchParams();
|
|
116
|
+
|
|
117
|
+
if (filters?.search) params.append('search', filters.search);
|
|
118
|
+
if (filters?.countryCode) params.append('countryCode', filters.countryCode);
|
|
119
|
+
if (filters?.isFeatured !== undefined) params.append('isFeatured', String(filters.isFeatured));
|
|
120
|
+
|
|
121
|
+
const queryString = params.toString();
|
|
122
|
+
const url = `/api/v1/cities${queryString ? `?${queryString}` : ''}`;
|
|
123
|
+
|
|
124
|
+
const response = await client.get<CitiesApiResponse>(url);
|
|
125
|
+
// Handle both wrapped and unwrapped response formats
|
|
126
|
+
return Array.isArray(response.data) ? response.data : response.data.data;
|
|
127
|
+
},
|
|
128
|
+
staleTime: 5 * 60 * 1000, // Cities don't change often, cache for 5 minutes
|
|
129
|
+
...options,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Get featured cities
|
|
135
|
+
*
|
|
136
|
+
* @description
|
|
137
|
+
* Fetches only cities marked as featured.
|
|
138
|
+
* Useful for showing popular/recommended cities.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```tsx
|
|
142
|
+
* const { data: featuredCities } = useFeaturedCities();
|
|
143
|
+
* ```
|
|
144
|
+
*
|
|
145
|
+
* @param options - TanStack Query options
|
|
146
|
+
* @returns TanStack Query result with array of featured cities
|
|
147
|
+
*/
|
|
148
|
+
export function useFeaturedCities(
|
|
149
|
+
options?: Omit<UseQueryOptions<CityResponse[]>, 'queryKey' | 'queryFn'>
|
|
150
|
+
): UseQueryResult<CityResponse[]> {
|
|
151
|
+
return useCities({ isFeatured: true }, options);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Get a single city by ID
|
|
156
|
+
*
|
|
157
|
+
* @description
|
|
158
|
+
* Fetches details for a specific city.
|
|
159
|
+
*
|
|
160
|
+
* @endpoint GET /api/v1/cities/{id}
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```tsx
|
|
164
|
+
* const { data: city } = useCity('city-uuid');
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* @param id - City ID
|
|
168
|
+
* @param options - TanStack Query options
|
|
169
|
+
* @returns TanStack Query result with city data
|
|
170
|
+
*/
|
|
171
|
+
interface CityApiResponse {
|
|
172
|
+
data: CityResponse;
|
|
173
|
+
meta: {
|
|
174
|
+
timestamp: string;
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function useCity(
|
|
179
|
+
id: string,
|
|
180
|
+
options?: Omit<UseQueryOptions<CityResponse>, 'queryKey' | 'queryFn'>
|
|
181
|
+
): UseQueryResult<CityResponse> {
|
|
182
|
+
return useQuery({
|
|
183
|
+
queryKey: cityKeys.detail(id),
|
|
184
|
+
queryFn: async (): Promise<CityResponse> => {
|
|
185
|
+
const client = getApiClient();
|
|
186
|
+
const response = await client.get<CityApiResponse>(`/api/v1/cities/${id}`);
|
|
187
|
+
// Handle both wrapped and unwrapped response formats
|
|
188
|
+
return (response.data as any).data || response.data;
|
|
189
|
+
},
|
|
190
|
+
enabled: !!id,
|
|
191
|
+
staleTime: 5 * 60 * 1000,
|
|
192
|
+
...options,
|
|
193
|
+
});
|
|
194
|
+
}
|
package/src/api/queries/index.ts
CHANGED