@growsober/sdk 1.0.1 → 1.0.2

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.
@@ -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");
@@ -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('/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('/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvbXV0YXRpb25zL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7O0FBOERILGtDQWtCQztBQXlERCw0QkFrQkM7QUEyRUQsa0RBV0M7QUFzRkQsMENBa0JDO0FBMENELGdDQVdDO0FBeUNELG9DQWlCQztBQXRjRCx1REFBMkc7QUFDM0csc0NBQXlDO0FBQ3pDLDRDQUE0QztBQWE1QywrRUFBK0U7QUFDL0UsaUJBQWlCO0FBQ2pCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUNILFNBQWdCLFdBQVcsQ0FDekIsT0FBc0Y7SUFFdEYsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFxQixFQUF5QixFQUFFO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBZSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsa0VBQWtFO1lBQ2xFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsU0FBZ0IsUUFBUSxDQUN0QixPQUFtRjtJQUVuRixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFjLEdBQUUsQ0FBQztJQUVyQyxPQUFPLElBQUEseUJBQVcsRUFBQztRQUNqQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQWtCLEVBQXlCLEVBQUU7WUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7WUFDOUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFlLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsa0VBQWtFO1lBQ2xFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxnQkFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0VHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQ2pDLE9BQTJGO0lBRTNGLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBeUIsRUFBMEIsRUFBRTtZQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQWdCLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRkc7QUFDSCxTQUFnQixlQUFlLENBQzdCLE9BQTBGO0lBRTFGLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWMsR0FBRSxDQUFDO0lBRXJDLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBeUIsRUFBeUIsRUFBRTtZQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQWUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekUsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLGtFQUFrRTtZQUNsRSxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsZ0JBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDM0QsbURBQW1EO1FBQ3JELENBQUM7UUFDRCxHQUFHLE9BQU87S0FDWCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFnQixVQUFVLENBQ3hCLE9BQXdGO0lBRXhGLE9BQU8sSUFBQSx5QkFBVyxFQUFDO1FBQ2pCLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBb0IsRUFBNEIsRUFBRTtZQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQWtCLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQztRQUN2QixDQUFDO1FBQ0QsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUNILFNBQWdCLFlBQVksQ0FDMUIsT0FBNEY7SUFFNUYsTUFBTSxXQUFXLEdBQUcsSUFBQSw0QkFBYyxHQUFFLENBQUM7SUFFckMsT0FBTyxJQUFBLHlCQUFXLEVBQUM7UUFDakIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFzQixFQUE4QixFQUFFO1lBQ3ZFLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBb0Isd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdEYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLGtFQUFrRTtZQUNsRSxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsZ0JBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dGggTXV0YXRpb24gSG9va3NcbiAqXG4gKiBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBob29rcyBmb3IgYXV0aGVudGljYXRpb24tcmVsYXRlZCB3cml0ZSBvcGVyYXRpb25zLlxuICogVGhlc2UgaG9va3MgaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uLCBsb2dpbiwgdG9rZW4gcmVmcmVzaCwgYW5kIEZpcmViYXNlIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBtb2R1bGUgYXBpL211dGF0aW9ucy9hdXRoXG4gKi9cblxuaW1wb3J0IHsgdXNlTXV0YXRpb24sIFVzZU11dGF0aW9uT3B0aW9ucywgVXNlTXV0YXRpb25SZXN1bHQsIHVzZVF1ZXJ5Q2xpZW50IH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IGdldEFwaUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgeyB1c2VyS2V5cyB9IGZyb20gJy4uL3F1ZXJpZXMvdXNlcnMnO1xuaW1wb3J0IHR5cGUge1xuICBSZWdpc3RlclJlcXVlc3QsXG4gIExvZ2luUmVxdWVzdCxcbiAgUmVmcmVzaFRva2VuUmVxdWVzdCxcbiAgRmlyZWJhc2VBdXRoUmVxdWVzdCxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBTZW5kT3RwUmVxdWVzdCxcbiAgT3RwU2VudFJlc3BvbnNlLFxuICBWZXJpZnlPdHBSZXF1ZXN0LFxufSBmcm9tICcuLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1VVEFUSU9OIEhPT0tTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBuZXcgdXNlciBhY2NvdW50XG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGVzIGEgbmV3IHVzZXIgYWNjb3VudCB3aXRoIGVtYWlsL3Bob25lIGFuZCBwYXNzd29yZC5cbiAqIFJldHVybnMgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCB1c2VyIGluZm9ybWF0aW9uIHVwb24gc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcmVnaXN0ZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VSZWdpc3RlciB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBSZWdpc3RlckZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiByZWdpc3RlciwgaXNQZW5kaW5nLCBlcnJvciB9ID0gdXNlUmVnaXN0ZXIoe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIHRva2VucyBzZWN1cmVseVxuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKiAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdPbmJvYXJkaW5nJyk7XG4gKiAgICAgfSxcbiAqICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICAgIEFsZXJ0LmFsZXJ0KCdSZWdpc3RyYXRpb24gZmFpbGVkJywgZXJyb3IubWVzc2FnZSk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gKiAgICAgcmVnaXN0ZXIoe1xuICogICAgICAgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgICAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzc3dvcmQxMjMhJyxcbiAqICAgICAgIG5hbWU6ICdKb2huIERvZScsXG4gKiAgICAgfSk7XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4gPEJ1dHRvbiBvblByZXNzPXtoYW5kbGVTdWJtaXR9IGRpc2FibGVkPXtpc1BlbmRpbmd9IC8+O1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBUYW5TdGFjayBRdWVyeSBtdXRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZ2lzdGVyKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QXV0aFJlc3BvbnNlLCBFcnJvciwgUmVnaXN0ZXJSZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8QXV0aFJlc3BvbnNlLCBFcnJvciwgUmVnaXN0ZXJSZXF1ZXN0PiB7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gdXNlUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGFzeW5jIChkYXRhOiBSZWdpc3RlclJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEF1dGhSZXNwb25zZT4oJy9hdXRoL3JlZ2lzdGVyJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjdXJyZW50IHVzZXIgcXVlcnkgdG8gdHJpZ2dlciByZWZldGNoIHdpdGggbmV3IHRva2VuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiB1c2VyS2V5cy5tZSgpIH0pO1xuICAgICAgLy8gVXNlcidzIG9uU3VjY2VzcyBpcyBoYW5kbGVkIGJ5IHNwcmVhZGluZyBvcHRpb25zXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dpbiB3aXRoIGVtYWlsL3Bob25lIGFuZCBwYXNzd29yZFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQXV0aGVudGljYXRlcyBhbiBleGlzdGluZyB1c2VyIHdpdGggdGhlaXIgY3JlZGVudGlhbHMuXG4gKiBSZXR1cm5zIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgdXNlciBpbmZvcm1hdGlvbiB1cG9uIHN1Y2Nlc3NmdWwgbG9naW4uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvbG9naW5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBpbXBvcnQgeyB1c2VMb2dpbiB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBMb2dpbkZvcm0oKSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiBsb2dpbiwgaXNQZW5kaW5nLCBlcnJvciB9ID0gdXNlTG9naW4oe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIHRva2VucyBzZWN1cmVseVxuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKiAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdIb21lJyk7XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gKiAgICAgbG9naW4oe1xuICogICAgICAgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgICAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzc3dvcmQxMjMhJyxcbiAqICAgICB9KTtcbiAqICAgfTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgLz5cbiAqICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiAvPlxuICogICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgZGlzYWJsZWQ9e2lzUGVuZGluZ30+XG4gKiAgICAgICAgIHtpc1BlbmRpbmcgPyAnTG9nZ2luZyBpbi4uLicgOiAnTG9naW4nfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgICB7ZXJyb3IgJiYgPHAgY2xhc3NOYW1lPVwiZXJyb3JcIj57ZXJyb3IubWVzc2FnZX08L3A+fVxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBMb2dpbiB3aXRoIHBob25lIG51bWJlcjpcbiAqIGBgYHRzeFxuICogbG9naW4oe1xuICogICBwaG9uZTogJysxMjM0NTY3ODkwJyxcbiAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzd29yZDEyMyEnLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlTG9naW4oXG4gIG9wdGlvbnM/OiBPbWl0PFVzZU11dGF0aW9uT3B0aW9uczxBdXRoUmVzcG9uc2UsIEVycm9yLCBMb2dpblJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxBdXRoUmVzcG9uc2UsIEVycm9yLCBMb2dpblJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IExvZ2luUmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8QXV0aFJlc3BvbnNlPignL2F1dGgvbG9naW4nLCBkYXRhKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICAgIH0sXG4gICAgb25TdWNjZXNzOiAoZGF0YSwgdmFyaWFibGVzLCBjb250ZXh0KSA9PiB7XG4gICAgICAvLyBJbnZhbGlkYXRlIGN1cnJlbnQgdXNlciBxdWVyeSB0byB0cmlnZ2VyIHJlZmV0Y2ggd2l0aCBuZXcgdG9rZW5cbiAgICAgIHF1ZXJ5Q2xpZW50LmludmFsaWRhdGVRdWVyaWVzKHsgcXVlcnlLZXk6IHVzZXJLZXlzLm1lKCkgfSk7XG4gICAgICAvLyBVc2VyJ3Mgb25TdWNjZXNzIGlzIGhhbmRsZWQgYnkgc3ByZWFkaW5nIG9wdGlvbnNcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggYWNjZXNzIHRva2VuIHVzaW5nIHJlZnJlc2ggdG9rZW5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIE9idGFpbnMgYSBuZXcgYWNjZXNzIHRva2VuIHVzaW5nIGEgdmFsaWQgcmVmcmVzaCB0b2tlbi5cbiAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYWNjZXNzIHRva2VuIGV4cGlyZXMuXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcmVmcmVzaFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVJlZnJlc2hBdXRoVG9rZW4gfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gdXNlVG9rZW5SZWZyZXNoKCkge1xuICogICBjb25zdCB7IG11dGF0ZUFzeW5jOiByZWZyZXNoVG9rZW4gfSA9IHVzZVJlZnJlc2hBdXRoVG9rZW4oKTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVRva2VuRXhwaXJlZCA9IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCBzdG9yZWRSZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICpcbiAqICAgICBpZiAoIXN0b3JlZFJlZnJlc2hUb2tlbikge1xuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICAgIHJldHVybjtcbiAqICAgICB9XG4gKlxuICogICAgIHRyeSB7XG4gKiAgICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbiB9ID0gYXdhaXQgcmVmcmVzaFRva2VuKHtcbiAqICAgICAgICAgcmVmcmVzaFRva2VuOiBzdG9yZWRSZWZyZXNoVG9rZW4sXG4gKiAgICAgICB9KTtcbiAqXG4gKiAgICAgICAvLyBTdG9yZSBuZXcgdG9rZW5zXG4gKiAgICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ2FjY2Vzc1Rva2VuJywgYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBuZXdSZWZyZXNoVG9rZW4pO1xuICogICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgICAvLyBSZWZyZXNoIHRva2VuIGlzIGludmFsaWQgb3IgZXhwaXJlZFxuICogICAgICAgbmF2aWdhdGlvbi5uYXZpZ2F0ZSgnTG9naW4nKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4geyBoYW5kbGVUb2tlbkV4cGlyZWQgfTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBJbnRlZ3JhdGUgd2l0aCBTREsgY29uZmlndXJhdGlvbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgY29uZmlndXJlU0RLIH0gZnJvbSAnQGdyb3dzb2Jlci9zZGsnO1xuICpcbiAqIGNvbmZpZ3VyZVNESyh7XG4gKiAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5ncm93c29iZXIuYXBwJyxcbiAqICAgZ2V0QWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICByZXR1cm4gYXdhaXQgU2VjdXJlU3RvcmUuZ2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicpO1xuICogICB9LFxuICogICByZWZyZXNoQWNjZXNzVG9rZW46IGFzeW5jICgpID0+IHtcbiAqICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBhd2FpdCBTZWN1cmVTdG9yZS5nZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicpO1xuICogICAgIGNvbnN0IHsgYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbjogbmV3UmVmcmVzaFRva2VuIH0gPSBhd2FpdCBmZXRjaCgnL2F1dGgvcmVmcmVzaCcsIHtcbiAqICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICogICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByZWZyZXNoVG9rZW4gfSksXG4gKiAgICAgfSkudGhlbihyID0+IHIuanNvbigpKTtcbiAqXG4gKiAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGFjY2Vzc1Rva2VuKTtcbiAqICAgICBhd2FpdCBTZWN1cmVTdG9yZS5zZXRJdGVtQXN5bmMoJ3JlZnJlc2hUb2tlbicsIG5ld1JlZnJlc2hUb2tlbik7XG4gKlxuICogICAgIHJldHVybiBhY2Nlc3NUb2tlbjtcbiAqICAgfSxcbiAqICAgb25VbmF1dGhvcml6ZWQ6ICgpID0+IHtcbiAqICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdMb2dpbicpO1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaEF1dGhUb2tlbihcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPFRva2VuUmVzcG9uc2UsIEVycm9yLCBSZWZyZXNoVG9rZW5SZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8VG9rZW5SZXNwb25zZSwgRXJyb3IsIFJlZnJlc2hUb2tlblJlcXVlc3Q+IHtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogUmVmcmVzaFRva2VuUmVxdWVzdCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PFRva2VuUmVzcG9uc2U+KCcvYXV0aC9yZWZyZXNoJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIEF1dGhlbnRpY2F0ZSB3aXRoIEZpcmViYXNlIElEIHRva2VuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBdXRoZW50aWNhdGVzIGEgdXNlciB1c2luZyBhIEZpcmViYXNlIElEIHRva2VuLlxuICogQ3JlYXRlcyBhIG5ldyB1c2VyIGFjY291bnQgaWYgb25lIGRvZXNuJ3QgZXhpc3QsIG9yIGxvZ3MgaW4gYW4gZXhpc3RpbmcgdXNlci5cbiAqIFJldHVybnMgR3Jvd1NvYmVyIGF1dGhlbnRpY2F0aW9uIHRva2VucyBhbmQgdXNlciBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAZW5kcG9pbnQgUE9TVCAvYXV0aC9maXJlYmFzZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZUZpcmViYXNlQXV0aCB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqIGltcG9ydCB7IHNpZ25JbldpdGhQaG9uZU51bWJlciB9IGZyb20gJ2ZpcmViYXNlL2F1dGgnO1xuICpcbiAqIGZ1bmN0aW9uIFBob25lQXV0aFNjcmVlbigpIHtcbiAqICAgY29uc3QgeyBtdXRhdGU6IGZpcmViYXNlQXV0aCwgaXNQZW5kaW5nIH0gPSB1c2VGaXJlYmFzZUF1dGgoe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIC8vIFN0b3JlIEdyb3dTb2JlciB0b2tlbnNcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygnYWNjZXNzVG9rZW4nLCBkYXRhLmFjY2Vzc1Rva2VuKTtcbiAqICAgICAgIGF3YWl0IFNlY3VyZVN0b3JlLnNldEl0ZW1Bc3luYygncmVmcmVzaFRva2VuJywgZGF0YS5yZWZyZXNoVG9rZW4pO1xuICpcbiAqICAgICAgIGlmIChkYXRhLnVzZXIub25ib2FyZGluZ0NvbXBsZXRlZCkge1xuICogICAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdIb21lJyk7XG4gKiAgICAgICB9IGVsc2Uge1xuICogICAgICAgICBuYXZpZ2F0aW9uLm5hdmlnYXRlKCdPbmJvYXJkaW5nJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICAgIEFsZXJ0LmFsZXJ0KCdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBlcnJvci5tZXNzYWdlKTtcbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVBob25lQXV0aCA9IGFzeW5jIChwaG9uZU51bWJlcjogc3RyaW5nKSA9PiB7XG4gKiAgICAgdHJ5IHtcbiAqICAgICAgIC8vIEZpcmViYXNlIGF1dGhlbnRpY2F0aW9uIGZsb3dcbiAqICAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlcik7XG4gKiAgICAgICBjb25zdCBjb2RlID0gYXdhaXQgcHJvbXB0VXNlckZvckNvZGUoKTsgLy8gWW91ciBVSSB0byBnZXQgdmVyaWZpY2F0aW9uIGNvZGVcbiAqICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb24uY29uZmlybShjb2RlKTtcbiAqXG4gKiAgICAgICAvLyBHZXQgRmlyZWJhc2UgSUQgdG9rZW5cbiAqICAgICAgIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBjcmVkZW50aWFsLnVzZXIuZ2V0SWRUb2tlbigpO1xuICpcbiAqICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB3aXRoIEdyb3dTb2JlciBiYWNrZW5kXG4gKiAgICAgICBmaXJlYmFzZUF1dGgoeyBpZFRva2VuIH0pO1xuICogICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgICBjb25zb2xlLmVycm9yKCdQaG9uZSBhdXRoIGVycm9yOicsIGVycm9yKTtcbiAqICAgICB9XG4gKiAgIH07XG4gKlxuICogICByZXR1cm4gPFBob25lSW5wdXQgb25TdWJtaXQ9e2hhbmRsZVBob25lQXV0aH0gZGlzYWJsZWQ9e2lzUGVuZGluZ30gLz47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBHb29nbGUgU2lnbi1JbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0IHsgR29vZ2xlU2lnbmluIH0gZnJvbSAnQHJlYWN0LW5hdGl2ZS1nb29nbGUtc2lnbmluL2dvb2dsZS1zaWduaW4nO1xuICpcbiAqIGNvbnN0IGhhbmRsZUdvb2dsZVNpZ25JbiA9IGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgeyBpZFRva2VuIH0gPSBhd2FpdCBHb29nbGVTaWduaW4uc2lnbkluKCk7XG4gKiAgIGZpcmViYXNlQXV0aCh7IGlkVG9rZW4gfSk7XG4gKiB9O1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggQXBwbGUgU2lnbi1JbjpcbiAqIGBgYHRzeFxuICogaW1wb3J0ICogYXMgQXBwbGVBdXRoZW50aWNhdGlvbiBmcm9tICdleHBvLWFwcGxlLWF1dGhlbnRpY2F0aW9uJztcbiAqXG4gKiBjb25zdCBoYW5kbGVBcHBsZVNpZ25JbiA9IGFzeW5jICgpID0+IHtcbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IGF3YWl0IEFwcGxlQXV0aGVudGljYXRpb24uc2lnbkluQXN5bmMoe1xuICogICAgIHJlcXVlc3RlZFNjb3BlczogW1xuICogICAgICAgQXBwbGVBdXRoZW50aWNhdGlvbi5BcHBsZUF1dGhlbnRpY2F0aW9uU2NvcGUuRlVMTF9OQU1FLFxuICogICAgICAgQXBwbGVBdXRoZW50aWNhdGlvbi5BcHBsZUF1dGhlbnRpY2F0aW9uU2NvcGUuRU1BSUwsXG4gKiAgICAgXSxcbiAqICAgfSk7XG4gKiAgIGZpcmViYXNlQXV0aCh7IGlkVG9rZW46IGNyZWRlbnRpYWwuaWRlbnRpdHlUb2tlbiB9KTtcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRmlyZWJhc2VBdXRoKFxuICBvcHRpb25zPzogT21pdDxVc2VNdXRhdGlvbk9wdGlvbnM8QXV0aFJlc3BvbnNlLCBFcnJvciwgRmlyZWJhc2VBdXRoUmVxdWVzdD4sICdtdXRhdGlvbkZuJz5cbik6IFVzZU11dGF0aW9uUmVzdWx0PEF1dGhSZXNwb25zZSwgRXJyb3IsIEZpcmViYXNlQXV0aFJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IEZpcmViYXNlQXV0aFJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PEF1dGhSZXNwb25zZT4oJy9hdXRoL2ZpcmViYXNlJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjdXJyZW50IHVzZXIgcXVlcnkgdG8gdHJpZ2dlciByZWZldGNoIHdpdGggbmV3IHRva2VuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiB1c2VyS2V5cy5tZSgpIH0pO1xuICAgICAgLy8gVXNlcidzIG9uU3VjY2VzcyBpcyBoYW5kbGVkIGJ5IHNwcmVhZGluZyBvcHRpb25zXG4gICAgfSxcbiAgICAuLi5vcHRpb25zLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNwb25zZSB0eXBlIGZvciB2ZXJpZnkgT1RQIGluY2x1ZGluZyBpc05ld1VzZXIgZmxhZ1xuICovXG5leHBvcnQgdHlwZSBWZXJpZnlPdHBSZXNwb25zZSA9IEF1dGhSZXNwb25zZSAmIHsgaXNOZXdVc2VyOiBib29sZWFuIH07XG5cbi8qKlxuICogU2VuZCBPVFAgdG8gcGhvbmUgbnVtYmVyXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBTZW5kcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHRvIHRoZSBzcGVjaWZpZWQgcGhvbmUgbnVtYmVyIHZpYSBTTVMgb3Igdm9pY2UgY2FsbC5cbiAqIFVzZWQgZm9yIHBhc3N3b3JkbGVzcyBhdXRoZW50aWNhdGlvbi5cbiAqXG4gKiBAZW5kcG9pbnQgUE9TVCAvYXV0aC9waG9uZS9zZW5kLW90cFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVNlbmRPdHAgfSBmcm9tICdAZ3Jvd3NvYmVyL3Nkayc7XG4gKlxuICogZnVuY3Rpb24gUGhvbmVJbnB1dFNjcmVlbigpIHtcbiAqICAgY29uc3QgeyBtdXRhdGU6IHNlbmRPdHAsIGlzUGVuZGluZywgZXJyb3IgfSA9IHVzZVNlbmRPdHAoe1xuICogICAgIG9uU3VjY2VzczogKGRhdGEpID0+IHtcbiAqICAgICAgIGNvbnNvbGUubG9nKCdPVFAgc2VudCB0bzonLCBkYXRhLnBob25lKTtcbiAqICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ1ZlcmlmeU90cCcsIHsgcGhvbmUgfSk7XG4gKiAgICAgfSxcbiAqICAgICBvbkVycm9yOiAoZXJyb3IpID0+IHtcbiAqICAgICAgIEFsZXJ0LmFsZXJ0KCdFcnJvcicsIGVycm9yLm1lc3NhZ2UpO1xuICogICAgIH0sXG4gKiAgIH0pO1xuICpcbiAqICAgY29uc3QgaGFuZGxlU2VuZCA9ICgpID0+IHtcbiAqICAgICBzZW5kT3RwKHsgcGhvbmU6ICcrMTIzNDU2Nzg5MCcsIGNoYW5uZWw6ICdzbXMnIH0pO1xuICogICB9O1xuICpcbiAqICAgcmV0dXJuIDxCdXR0b24gb25QcmVzcz17aGFuZGxlU2VuZH0gZGlzYWJsZWQ9e2lzUGVuZGluZ30gLz47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIG9wdGlvbnNcbiAqIEByZXR1cm5zIFRhblN0YWNrIFF1ZXJ5IG11dGF0aW9uIHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2VuZE90cChcbiAgb3B0aW9ucz86IE9taXQ8VXNlTXV0YXRpb25PcHRpb25zPE90cFNlbnRSZXNwb25zZSwgRXJyb3IsIFNlbmRPdHBSZXF1ZXN0PiwgJ211dGF0aW9uRm4nPlxuKTogVXNlTXV0YXRpb25SZXN1bHQ8T3RwU2VudFJlc3BvbnNlLCBFcnJvciwgU2VuZE90cFJlcXVlc3Q+IHtcbiAgcmV0dXJuIHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBhc3luYyAoZGF0YTogU2VuZE90cFJlcXVlc3QpOiBQcm9taXNlPE90cFNlbnRSZXNwb25zZT4gPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0QXBpQ2xpZW50KCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PE90cFNlbnRSZXNwb25zZT4oJy9hdXRoL3Bob25lL3NlbmQtb3RwJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xufVxuXG4vKipcbiAqIFZlcmlmeSBPVFAgYW5kIGF1dGhlbnRpY2F0ZVxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVmVyaWZpZXMgdGhlIE9UUCBjb2RlIHNlbnQgdG8gdGhlIHBob25lIG51bWJlciBhbmQgYXV0aGVudGljYXRlcyB0aGUgdXNlci5cbiAqIElmIHRoZSB1c2VyIGRvZXNuJ3QgZXhpc3QsIGEgbmV3IGFjY291bnQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICogUmV0dXJucyBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIHVzZXIgaW5mb3JtYXRpb24uXG4gKlxuICogQGVuZHBvaW50IFBPU1QgL2F1dGgvcGhvbmUvdmVyaWZ5LW90cFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGltcG9ydCB7IHVzZVZlcmlmeU90cCB9IGZyb20gJ0Bncm93c29iZXIvc2RrJztcbiAqXG4gKiBmdW5jdGlvbiBWZXJpZnlPdHBTY3JlZW4oeyBwaG9uZSB9KSB7XG4gKiAgIGNvbnN0IHsgbXV0YXRlOiB2ZXJpZnlPdHAsIGlzUGVuZGluZywgZXJyb3IgfSA9IHVzZVZlcmlmeU90cCh7XG4gKiAgICAgb25TdWNjZXNzOiBhc3luYyAoZGF0YSkgPT4ge1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdhY2Nlc3NUb2tlbicsIGRhdGEuYWNjZXNzVG9rZW4pO1xuICogICAgICAgYXdhaXQgU2VjdXJlU3RvcmUuc2V0SXRlbUFzeW5jKCdyZWZyZXNoVG9rZW4nLCBkYXRhLnJlZnJlc2hUb2tlbik7XG4gKlxuICogICAgICAgaWYgKGRhdGEuaXNOZXdVc2VyKSB7XG4gKiAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ09uYm9hcmRpbmcnKTtcbiAqICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoJ0hvbWUnKTtcbiAqICAgICAgIH1cbiAqICAgICB9LFxuICogICB9KTtcbiAqXG4gKiAgIGNvbnN0IGhhbmRsZVZlcmlmeSA9IChjb2RlOiBzdHJpbmcpID0+IHtcbiAqICAgICB2ZXJpZnlPdHAoeyBwaG9uZSwgY29kZSB9KTtcbiAqICAgfTtcbiAqXG4gKiAgIHJldHVybiA8T3RwSW5wdXQgb25Db21wbGV0ZT17aGFuZGxlVmVyaWZ5fSBkaXNhYmxlZD17aXNQZW5kaW5nfSAvPjtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgVGFuU3RhY2sgUXVlcnkgbXV0YXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VWZXJpZnlPdHAoXG4gIG9wdGlvbnM/OiBPbWl0PFVzZU11dGF0aW9uT3B0aW9uczxWZXJpZnlPdHBSZXNwb25zZSwgRXJyb3IsIFZlcmlmeU90cFJlcXVlc3Q+LCAnbXV0YXRpb25Gbic+XG4pOiBVc2VNdXRhdGlvblJlc3VsdDxWZXJpZnlPdHBSZXNwb25zZSwgRXJyb3IsIFZlcmlmeU90cFJlcXVlc3Q+IHtcbiAgY29uc3QgcXVlcnlDbGllbnQgPSB1c2VRdWVyeUNsaWVudCgpO1xuXG4gIHJldHVybiB1c2VNdXRhdGlvbih7XG4gICAgbXV0YXRpb25GbjogYXN5bmMgKGRhdGE6IFZlcmlmeU90cFJlcXVlc3QpOiBQcm9taXNlPFZlcmlmeU90cFJlc3BvbnNlPiA9PiB7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRBcGlDbGllbnQoKTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3Q8VmVyaWZ5T3RwUmVzcG9uc2U+KCcvYXV0aC9waG9uZS92ZXJpZnktb3RwJywgZGF0YSk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9LFxuICAgIG9uU3VjY2VzczogKGRhdGEsIHZhcmlhYmxlcywgY29udGV4dCkgPT4ge1xuICAgICAgLy8gSW52YWxpZGF0ZSBjdXJyZW50IHVzZXIgcXVlcnkgdG8gdHJpZ2dlciByZWZldGNoIHdpdGggbmV3IHRva2VuXG4gICAgICBxdWVyeUNsaWVudC5pbnZhbGlkYXRlUXVlcmllcyh7IHF1ZXJ5S2V5OiB1c2VyS2V5cy5tZSgpIH0pO1xuICAgIH0sXG4gICAgLi4ub3B0aW9ucyxcbiAgfSk7XG59XG4iXX0=
@@ -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
@@ -7,6 +7,7 @@ export * from './admin';
7
7
  export * from './auth';
8
8
  export * from './bookings';
9
9
  export * from './businesses';
10
+ export * from './cities';
10
11
  export * from './events';
11
12
  export * from './hubs';
12
13
  export * from './library';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwwQ0FBd0I7QUFDeEIseUNBQXVCO0FBQ3ZCLDZDQUEyQjtBQUMzQiwrQ0FBNkI7QUFDN0IsMkNBQXlCO0FBQ3pCLHlDQUF1QjtBQUN2Qiw0Q0FBMEI7QUFDMUIsd0NBQXNCO0FBQ3RCLGtEQUFnQztBQUNoQywyQ0FBeUI7QUFDekIsa0RBQWdDO0FBQ2hDLDRDQUEwQjtBQUMxQiwwQ0FBd0I7QUFDeEIseUNBQXVCO0FBQ3ZCLGdEQUE4QjtBQUM5QiwyQ0FBeUI7QUFDekIsNkNBQTJCO0FBQzNCLCtDQUE2QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUXVlcnkgSG9va3NcbiAqXG4gKiBSZS1leHBvcnRzIGFsbCBxdWVyeSBob29rcyBmb3IgQVBJIGVuZHBvaW50cy5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2FkbWluJztcbmV4cG9ydCAqIGZyb20gJy4vYXV0aCc7XG5leHBvcnQgKiBmcm9tICcuL2Jvb2tpbmdzJztcbmV4cG9ydCAqIGZyb20gJy4vYnVzaW5lc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL2V2ZW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2h1YnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWJyYXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vbWFwJztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL29mZmVycyc7XG5leHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdXBwb3J0JztcbmV4cG9ydCAqIGZyb20gJy4vdXNlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9qYWNrJztcbmV4cG9ydCAqIGZyb20gJy4vYW1iYXNzYWRvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9ncm93OTAnO1xuZXhwb3J0ICogZnJvbSAnLi9tYXRjaGluZyc7XG5leHBvcnQgKiBmcm9tICcuL2V2ZW50LWNoYXQnO1xuIl19
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3F1ZXJpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwwQ0FBd0I7QUFDeEIseUNBQXVCO0FBQ3ZCLDZDQUEyQjtBQUMzQiwrQ0FBNkI7QUFDN0IsMkNBQXlCO0FBQ3pCLDJDQUF5QjtBQUN6Qix5Q0FBdUI7QUFDdkIsNENBQTBCO0FBQzFCLHdDQUFzQjtBQUN0QixrREFBZ0M7QUFDaEMsMkNBQXlCO0FBQ3pCLGtEQUFnQztBQUNoQyw0Q0FBMEI7QUFDMUIsMENBQXdCO0FBQ3hCLHlDQUF1QjtBQUN2QixnREFBOEI7QUFDOUIsMkNBQXlCO0FBQ3pCLDZDQUEyQjtBQUMzQiwrQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFF1ZXJ5IEhvb2tzXG4gKlxuICogUmUtZXhwb3J0cyBhbGwgcXVlcnkgaG9va3MgZm9yIEFQSSBlbmRwb2ludHMuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9hZG1pbic7XG5leHBvcnQgKiBmcm9tICcuL2F1dGgnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29raW5ncyc7XG5leHBvcnQgKiBmcm9tICcuL2J1c2luZXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jaXRpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9odWJzJztcbmV4cG9ydCAqIGZyb20gJy4vbGlicmFyeSc7XG5leHBvcnQgKiBmcm9tICcuL21hcCc7XG5leHBvcnQgKiBmcm9tICcuL25vdGlmaWNhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9vZmZlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vc3VwcG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL3VzZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vamFjayc7XG5leHBvcnQgKiBmcm9tICcuL2FtYmFzc2Fkb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZ3JvdzkwJztcbmV4cG9ydCAqIGZyb20gJy4vbWF0Y2hpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9ldmVudC1jaGF0JztcbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growsober/sdk",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Shared TypeScript SDK for GrowSober API - TanStack Query hooks, API client, and utilities",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -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
  // ============================================================================
@@ -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>('/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>('/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
+ }
@@ -8,6 +8,7 @@ export * from './admin';
8
8
  export * from './auth';
9
9
  export * from './bookings';
10
10
  export * from './businesses';
11
+ export * from './cities';
11
12
  export * from './events';
12
13
  export * from './hubs';
13
14
  export * from './library';