@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.
@@ -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
@@ -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.3",
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
  // ============================================================================
@@ -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
+ }
@@ -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';