@veliseev93/clerk-react-native 0.0.1-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +133 -0
- package/dist/index.d.mts +653 -0
- package/dist/index.d.ts +653 -0
- package/dist/index.js +648 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +611 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +71 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
ClerkApiError: () => ClerkApiError,
|
|
24
|
+
useAddIdentifier: () => useAddIdentifier,
|
|
25
|
+
useAuthWithIdentifier: () => useAuthWithIdentifier,
|
|
26
|
+
useAuthWithSSO: () => useAuthWithSSO,
|
|
27
|
+
useAuthWithTicket: () => useAuthWithTicket,
|
|
28
|
+
useChangePassword: () => useChangePassword,
|
|
29
|
+
useClerkResources: () => useClerkResources,
|
|
30
|
+
useGetSessionToken: () => useGetSessionToken,
|
|
31
|
+
useOtpVerification: () => useOtpVerification,
|
|
32
|
+
useResetPassword: () => useResetPassword,
|
|
33
|
+
useUpdateIdentifier: () => useUpdateIdentifier
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(index_exports);
|
|
36
|
+
|
|
37
|
+
// src/enums/api-error.ts
|
|
38
|
+
var ClerkApiError = /* @__PURE__ */ ((ClerkApiError2) => {
|
|
39
|
+
ClerkApiError2["SESSION_EXISTS"] = "session_exists";
|
|
40
|
+
ClerkApiError2["FORM_IDENTIFIER_EXIST"] = "form_identifier_exists";
|
|
41
|
+
ClerkApiError2["FORM_CODE_INCORRECT"] = "form_code_incorrect";
|
|
42
|
+
return ClerkApiError2;
|
|
43
|
+
})(ClerkApiError || {});
|
|
44
|
+
|
|
45
|
+
// src/hooks/use-clerk-resources.ts
|
|
46
|
+
var import_clerk_expo = require("@clerk/clerk-expo");
|
|
47
|
+
var useClerkResources = () => {
|
|
48
|
+
const clerk = (0, import_clerk_expo.getClerkInstance)();
|
|
49
|
+
const signUp = clerk.client?.signUp;
|
|
50
|
+
const signIn = clerk.client?.signIn;
|
|
51
|
+
const signOut = clerk.signOut;
|
|
52
|
+
const setActive = clerk.setActive;
|
|
53
|
+
return { signUp, signIn, setActive, signOut };
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// src/hooks/use-get-session-token.ts
|
|
57
|
+
var import_clerk_expo2 = require("@clerk/clerk-expo");
|
|
58
|
+
var useGetSessionToken = () => {
|
|
59
|
+
const clerk = (0, import_clerk_expo2.getClerkInstance)();
|
|
60
|
+
const getSessionToken = async ({ tokenTemplate }) => {
|
|
61
|
+
try {
|
|
62
|
+
const token = await clerk.session?.getToken({ template: tokenTemplate });
|
|
63
|
+
const sessionToken = token || clerk.session?.lastActiveToken?.getRawString();
|
|
64
|
+
if (sessionToken) {
|
|
65
|
+
return {
|
|
66
|
+
sessionToken,
|
|
67
|
+
isSuccess: true
|
|
68
|
+
};
|
|
69
|
+
} else {
|
|
70
|
+
return {
|
|
71
|
+
sessionToken: null,
|
|
72
|
+
isSuccess: false
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
return {
|
|
77
|
+
sessionToken: null,
|
|
78
|
+
error,
|
|
79
|
+
isSuccess: false
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
return { getSessionToken };
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/hooks/use-auth-with-sso.ts
|
|
87
|
+
var import_clerk_expo3 = require("@clerk/clerk-expo");
|
|
88
|
+
var import_react = require("react");
|
|
89
|
+
function useAuthWithSSO() {
|
|
90
|
+
const { startSSOFlow: clerkStartSSOFlow } = (0, import_clerk_expo3.useSSO)();
|
|
91
|
+
const { getSessionToken } = useGetSessionToken();
|
|
92
|
+
const [isLoading, setIsLoading] = (0, import_react.useState)(false);
|
|
93
|
+
const startSSOFlow = async ({
|
|
94
|
+
strategy,
|
|
95
|
+
redirectUrl,
|
|
96
|
+
tokenTemplate
|
|
97
|
+
}) => {
|
|
98
|
+
try {
|
|
99
|
+
setIsLoading(true);
|
|
100
|
+
const { createdSessionId, setActive, signIn, signUp } = await clerkStartSSOFlow({
|
|
101
|
+
strategy,
|
|
102
|
+
redirectUrl
|
|
103
|
+
});
|
|
104
|
+
if (!createdSessionId) {
|
|
105
|
+
return { sessionToken: null };
|
|
106
|
+
}
|
|
107
|
+
await setActive?.({ session: createdSessionId });
|
|
108
|
+
const { sessionToken } = await getSessionToken({ tokenTemplate });
|
|
109
|
+
if (sessionToken) {
|
|
110
|
+
return {
|
|
111
|
+
sessionToken,
|
|
112
|
+
signIn,
|
|
113
|
+
signUp,
|
|
114
|
+
isSuccess: true
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
signIn,
|
|
119
|
+
signUp,
|
|
120
|
+
isSuccess: false
|
|
121
|
+
};
|
|
122
|
+
} catch (error) {
|
|
123
|
+
return {
|
|
124
|
+
error,
|
|
125
|
+
isSuccess: false
|
|
126
|
+
};
|
|
127
|
+
} finally {
|
|
128
|
+
setIsLoading(false);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
return { startSSOFlow, isLoading };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// src/hooks/use-auth-with-ticket.ts
|
|
135
|
+
var import_react2 = require("react");
|
|
136
|
+
function useAuthWithTicket() {
|
|
137
|
+
const { signIn, setActive } = useClerkResources();
|
|
138
|
+
const { getSessionToken } = useGetSessionToken();
|
|
139
|
+
const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
|
|
140
|
+
const startAuthorization = async ({ ticket, tokenTemplate }) => {
|
|
141
|
+
if (signIn) {
|
|
142
|
+
setIsLoading(true);
|
|
143
|
+
try {
|
|
144
|
+
const signInAttempt = await signIn.create({
|
|
145
|
+
strategy: "ticket",
|
|
146
|
+
ticket
|
|
147
|
+
});
|
|
148
|
+
if (signInAttempt.status === "complete") {
|
|
149
|
+
await setActive({
|
|
150
|
+
session: signInAttempt.createdSessionId
|
|
151
|
+
});
|
|
152
|
+
const { sessionToken, error } = await getSessionToken({ tokenTemplate });
|
|
153
|
+
if (sessionToken) {
|
|
154
|
+
return {
|
|
155
|
+
sessionToken,
|
|
156
|
+
signIn,
|
|
157
|
+
isSuccess: true
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
signIn,
|
|
162
|
+
error,
|
|
163
|
+
isSuccess: false
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
} catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
signIn,
|
|
169
|
+
error,
|
|
170
|
+
isSuccess: false
|
|
171
|
+
};
|
|
172
|
+
} finally {
|
|
173
|
+
setIsLoading(false);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
sessionToken: null,
|
|
178
|
+
signIn,
|
|
179
|
+
isSuccess: false
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
return {
|
|
183
|
+
startAuthorization,
|
|
184
|
+
isLoading
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/hooks/use-otp-verification.ts
|
|
189
|
+
var import_react3 = require("react");
|
|
190
|
+
function useOtpVerification() {
|
|
191
|
+
const { signUp, signIn, setActive } = useClerkResources();
|
|
192
|
+
const { getSessionToken } = useGetSessionToken();
|
|
193
|
+
const [isVerifying, setIsVerifying] = (0, import_react3.useState)(false);
|
|
194
|
+
const sendSignInOtpCode = async (strategy, isSecondFactor = false) => {
|
|
195
|
+
const codeFactors = isSecondFactor ? signIn?.supportedSecondFactors : signIn?.supportedFirstFactors;
|
|
196
|
+
const prepareFactor = isSecondFactor ? signIn?.prepareSecondFactor : signIn?.prepareFirstFactor;
|
|
197
|
+
const codeFactor = codeFactors?.find(
|
|
198
|
+
(factor) => factor.strategy === strategy
|
|
199
|
+
);
|
|
200
|
+
if (codeFactor && "emailAddressId" in codeFactor) {
|
|
201
|
+
await prepareFactor?.({ strategy: "email_code", emailAddressId: codeFactor.emailAddressId });
|
|
202
|
+
} else if (codeFactor && "phoneNumberId" in codeFactor) {
|
|
203
|
+
await prepareFactor?.({ strategy: "phone_code", phoneNumberId: codeFactor.phoneNumberId });
|
|
204
|
+
} else {
|
|
205
|
+
throw new Error(`No ${isSecondFactor ? "second " : ""}factor found for strategy: ${strategy}`);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
const sendSignUpOtpCode = async (strategy) => {
|
|
209
|
+
if (!signUp) return;
|
|
210
|
+
await signUp.prepareVerification({ strategy });
|
|
211
|
+
};
|
|
212
|
+
const sendOtpCode = async ({ strategy, isSignUp, isSecondFactor }) => {
|
|
213
|
+
if (isSignUp) {
|
|
214
|
+
await sendSignUpOtpCode(strategy);
|
|
215
|
+
} else {
|
|
216
|
+
await sendSignInOtpCode(strategy, !!isSecondFactor);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
const verifyCode = async ({
|
|
220
|
+
code,
|
|
221
|
+
strategy,
|
|
222
|
+
tokenTemplate,
|
|
223
|
+
isSignUp,
|
|
224
|
+
isSecondFactor
|
|
225
|
+
}) => {
|
|
226
|
+
try {
|
|
227
|
+
setIsVerifying(true);
|
|
228
|
+
if (isSignUp) {
|
|
229
|
+
const completeSignUp = await signUp?.attemptVerification({
|
|
230
|
+
strategy,
|
|
231
|
+
code
|
|
232
|
+
});
|
|
233
|
+
if (completeSignUp?.status === "complete") {
|
|
234
|
+
await setActive?.({ session: completeSignUp.createdSessionId });
|
|
235
|
+
const { sessionToken, error } = await getSessionToken({ tokenTemplate });
|
|
236
|
+
if (sessionToken) {
|
|
237
|
+
return {
|
|
238
|
+
sessionToken,
|
|
239
|
+
signIn,
|
|
240
|
+
signUp,
|
|
241
|
+
isSuccess: true
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
signIn,
|
|
246
|
+
signUp,
|
|
247
|
+
error,
|
|
248
|
+
isSuccess: false
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
} else {
|
|
252
|
+
const attemptSignIn = isSecondFactor ? signIn?.attemptSecondFactor : signIn?.attemptFirstFactor;
|
|
253
|
+
const completeSignIn = await attemptSignIn?.({ strategy, code });
|
|
254
|
+
if (completeSignIn?.status === "complete") {
|
|
255
|
+
await setActive?.({ session: completeSignIn.createdSessionId });
|
|
256
|
+
const sessionToken = (await getSessionToken({ tokenTemplate })).sessionToken;
|
|
257
|
+
if (sessionToken) {
|
|
258
|
+
return { sessionToken, signIn, signUp, isSuccess: true };
|
|
259
|
+
}
|
|
260
|
+
return { sessionToken: null, signIn, signUp, isSuccess: false };
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
signIn,
|
|
265
|
+
signUp,
|
|
266
|
+
isSuccess: false
|
|
267
|
+
};
|
|
268
|
+
} catch (error) {
|
|
269
|
+
return {
|
|
270
|
+
signIn,
|
|
271
|
+
signUp,
|
|
272
|
+
error,
|
|
273
|
+
isSuccess: false
|
|
274
|
+
};
|
|
275
|
+
} finally {
|
|
276
|
+
setIsVerifying(false);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
return {
|
|
280
|
+
sendOtpCode,
|
|
281
|
+
verifyCode,
|
|
282
|
+
isVerifying
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// src/hooks/use-auth-with-identifier.ts
|
|
287
|
+
var import_clerk_expo4 = require("@clerk/clerk-expo");
|
|
288
|
+
var import_react4 = require("react");
|
|
289
|
+
function useAuthWithIdentifier(method, verifyBy) {
|
|
290
|
+
const { signUp, signIn, setActive } = useClerkResources();
|
|
291
|
+
const { sendOtpCode, verifyCode: verifyOtpCode, isVerifying } = useOtpVerification();
|
|
292
|
+
const { getSessionToken } = useGetSessionToken();
|
|
293
|
+
const [isAuthorizing, setIsAuthorizing] = (0, import_react4.useState)(false);
|
|
294
|
+
const [isLoading, setIsLoading] = (0, import_react4.useState)(false);
|
|
295
|
+
const strategy = method === "emailAddress" ? "email_code" : "phone_code";
|
|
296
|
+
const handleSessionToken = async (tokenTemplate) => {
|
|
297
|
+
const { sessionToken, error } = await getSessionToken({ tokenTemplate });
|
|
298
|
+
return { sessionToken: sessionToken || void 0, error };
|
|
299
|
+
};
|
|
300
|
+
const handleSignInWithPassword = async (signInAttempt, isSignUp, tokenTemplate) => {
|
|
301
|
+
await setActive?.({ session: signInAttempt.createdSessionId });
|
|
302
|
+
const { sessionToken, error } = await handleSessionToken(tokenTemplate);
|
|
303
|
+
if (isSignUp) {
|
|
304
|
+
return {
|
|
305
|
+
signUp,
|
|
306
|
+
error,
|
|
307
|
+
sessionToken,
|
|
308
|
+
isSuccess: !!sessionToken
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
signIn,
|
|
313
|
+
error,
|
|
314
|
+
sessionToken,
|
|
315
|
+
isSuccess: !!sessionToken
|
|
316
|
+
};
|
|
317
|
+
};
|
|
318
|
+
const handleUsernameAuth = async (params, isSignUp) => {
|
|
319
|
+
const { identifier, password, tokenTemplate } = params;
|
|
320
|
+
const authMethod = isSignUp ? signUp : signIn;
|
|
321
|
+
const authAttempt = await authMethod?.create({ username: identifier, password });
|
|
322
|
+
if (authAttempt?.status === "complete" && "createdSessionId" in authAttempt) {
|
|
323
|
+
return handleSignInWithPassword(authAttempt, isSignUp, tokenTemplate);
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
isSuccess: false,
|
|
327
|
+
[isSignUp ? "signUp" : "signIn"]: authMethod
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
const handleEmailPhoneAuth = async (params, isSignUp) => {
|
|
331
|
+
const { identifier } = params;
|
|
332
|
+
const authMethod = isSignUp ? signUp : signIn;
|
|
333
|
+
const identifierFieldName = isSignUp ? method : "identifier";
|
|
334
|
+
if (verifyBy === "password") {
|
|
335
|
+
try {
|
|
336
|
+
const { password, tokenTemplate } = params;
|
|
337
|
+
const authAttempt = await authMethod?.create({ [identifierFieldName]: identifier, password });
|
|
338
|
+
if (authAttempt?.status === "complete" && "createdSessionId" in authAttempt) {
|
|
339
|
+
return handleSignInWithPassword(authAttempt, isSignUp, tokenTemplate);
|
|
340
|
+
} else {
|
|
341
|
+
return { isSuccess: false, signIn, signUp, status: authAttempt?.status, error: null };
|
|
342
|
+
}
|
|
343
|
+
} catch (error) {
|
|
344
|
+
return { error, signIn, signUp };
|
|
345
|
+
}
|
|
346
|
+
} else if (verifyBy === "otp") {
|
|
347
|
+
try {
|
|
348
|
+
await authMethod?.create({ [identifierFieldName]: identifier });
|
|
349
|
+
await sendOtpCode({ strategy, isSignUp });
|
|
350
|
+
} catch (error) {
|
|
351
|
+
return { error, signIn, signUp };
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
isSuccess: true,
|
|
356
|
+
[isSignUp ? "signUp" : "signIn"]: authMethod
|
|
357
|
+
};
|
|
358
|
+
};
|
|
359
|
+
const startSignUp = async (params) => {
|
|
360
|
+
try {
|
|
361
|
+
setIsLoading(true);
|
|
362
|
+
return method === "username" ? await handleUsernameAuth(params, true) : await handleEmailPhoneAuth(params, true);
|
|
363
|
+
} catch (error) {
|
|
364
|
+
return { error, signUp, isSuccess: false };
|
|
365
|
+
} finally {
|
|
366
|
+
setIsLoading(false);
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
const startSignIn = async (params) => {
|
|
370
|
+
try {
|
|
371
|
+
setIsLoading(true);
|
|
372
|
+
return method === "username" ? await handleUsernameAuth(params, false) : await handleEmailPhoneAuth(params, false);
|
|
373
|
+
} catch (error) {
|
|
374
|
+
return { error, signIn, isSuccess: false };
|
|
375
|
+
} finally {
|
|
376
|
+
setIsLoading(false);
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
const startAuthorization = async (params) => {
|
|
380
|
+
try {
|
|
381
|
+
setIsAuthorizing(true);
|
|
382
|
+
const result = await startSignUp(params);
|
|
383
|
+
if (result?.error && (0, import_clerk_expo4.isClerkAPIResponseError)(result.error)) {
|
|
384
|
+
const error = result.error.errors[0];
|
|
385
|
+
if (error?.code === "form_identifier_exists" /* FORM_IDENTIFIER_EXIST */) {
|
|
386
|
+
const signInResult = await startSignIn(params);
|
|
387
|
+
return { ...signInResult, isSignUp: false };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return { ...result, isSignUp: true };
|
|
391
|
+
} catch (error) {
|
|
392
|
+
return { error, signIn, signUp, isSuccess: false };
|
|
393
|
+
} finally {
|
|
394
|
+
setIsAuthorizing(false);
|
|
395
|
+
}
|
|
396
|
+
};
|
|
397
|
+
const verifyCode = async ({
|
|
398
|
+
code,
|
|
399
|
+
isSignUp,
|
|
400
|
+
tokenTemplate
|
|
401
|
+
}) => {
|
|
402
|
+
setIsLoading(true);
|
|
403
|
+
try {
|
|
404
|
+
return await verifyOtpCode({ code, strategy, tokenTemplate, isSignUp });
|
|
405
|
+
} finally {
|
|
406
|
+
setIsLoading(false);
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
if (method === "username") {
|
|
410
|
+
return {
|
|
411
|
+
startSignIn,
|
|
412
|
+
startSignUp,
|
|
413
|
+
startAuthorization,
|
|
414
|
+
isLoading: isAuthorizing || isLoading
|
|
415
|
+
};
|
|
416
|
+
} else {
|
|
417
|
+
return {
|
|
418
|
+
startSignIn,
|
|
419
|
+
startSignUp,
|
|
420
|
+
startAuthorization,
|
|
421
|
+
isLoading: isAuthorizing || isLoading,
|
|
422
|
+
verifyCode,
|
|
423
|
+
isVerifying
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// src/hooks/use-add-identifier.ts
|
|
429
|
+
var import_clerk_expo5 = require("@clerk/clerk-expo");
|
|
430
|
+
var import_react5 = require("react");
|
|
431
|
+
function useAddIdentifier(type) {
|
|
432
|
+
const { user } = (0, import_clerk_expo5.useUser)();
|
|
433
|
+
const [isCreating, setIsCreating] = (0, import_react5.useState)(false);
|
|
434
|
+
const [isVerifying, setIsVerifying] = (0, import_react5.useState)(false);
|
|
435
|
+
const isEmail = type === "email";
|
|
436
|
+
const createIdentifier = async ({ identifier }) => {
|
|
437
|
+
setIsCreating(true);
|
|
438
|
+
try {
|
|
439
|
+
let resource = getIdentifierResource(identifier);
|
|
440
|
+
if (!resource) {
|
|
441
|
+
resource = isEmail ? await user?.createEmailAddress({ email: identifier }) : await user?.createPhoneNumber({ phoneNumber: identifier });
|
|
442
|
+
await user?.reload();
|
|
443
|
+
}
|
|
444
|
+
await prepareVerification({ isEmail, identifier });
|
|
445
|
+
return { isSuccess: true, user };
|
|
446
|
+
} catch (e) {
|
|
447
|
+
if ((0, import_clerk_expo5.isClerkAPIResponseError)(e)) {
|
|
448
|
+
return { error: e, user };
|
|
449
|
+
}
|
|
450
|
+
return { isSuccess: false, user };
|
|
451
|
+
} finally {
|
|
452
|
+
setIsCreating(false);
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
const verifyCode = async ({ code, identifier }) => {
|
|
456
|
+
setIsVerifying(true);
|
|
457
|
+
try {
|
|
458
|
+
const resource = getIdentifierResource(identifier);
|
|
459
|
+
const verifyAttempt = await resource?.attemptVerification({ code });
|
|
460
|
+
if (verifyAttempt?.verification?.status === "verified") {
|
|
461
|
+
return { isSuccess: true, user };
|
|
462
|
+
} else {
|
|
463
|
+
return { isSuccess: false, verifyAttempt };
|
|
464
|
+
}
|
|
465
|
+
} catch (error) {
|
|
466
|
+
return { error, user };
|
|
467
|
+
} finally {
|
|
468
|
+
setIsVerifying(false);
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
const prepareVerification = async ({
|
|
472
|
+
isEmail: isEmail2,
|
|
473
|
+
identifier
|
|
474
|
+
}) => {
|
|
475
|
+
const phoneResource = user?.phoneNumbers?.find((a) => a.phoneNumber === identifier);
|
|
476
|
+
const emailResource = user?.emailAddresses?.find((a) => a.emailAddress === identifier);
|
|
477
|
+
await (isEmail2 ? emailResource?.prepareVerification({ strategy: "email_code" }) : phoneResource?.prepareVerification());
|
|
478
|
+
};
|
|
479
|
+
const getIdentifierResource = (identifier) => {
|
|
480
|
+
return isEmail ? user?.emailAddresses.find((a) => a.emailAddress === identifier) : user?.phoneNumbers.find((a) => a.phoneNumber === identifier);
|
|
481
|
+
};
|
|
482
|
+
return { createIdentifier, verifyCode, isCreating, isVerifying };
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// src/hooks/use-reset-password.ts
|
|
486
|
+
var import_react6 = require("react");
|
|
487
|
+
function useResetPassword({ method }) {
|
|
488
|
+
const { signIn, setActive } = useClerkResources();
|
|
489
|
+
const { getSessionToken } = useGetSessionToken();
|
|
490
|
+
const [isCodeSending, setIsCodeSending] = (0, import_react6.useState)(false);
|
|
491
|
+
const [isVerifying, setIsVerifying] = (0, import_react6.useState)(false);
|
|
492
|
+
const [isResetting, setIsResetting] = (0, import_react6.useState)(false);
|
|
493
|
+
const strategy = method === "emailAddress" ? "reset_password_email_code" : "reset_password_phone_code";
|
|
494
|
+
const startResetPassword = async ({ identifier }) => {
|
|
495
|
+
setIsCodeSending(true);
|
|
496
|
+
try {
|
|
497
|
+
await signIn?.create({
|
|
498
|
+
strategy,
|
|
499
|
+
identifier
|
|
500
|
+
});
|
|
501
|
+
return { isSuccess: true, signIn };
|
|
502
|
+
} catch (error) {
|
|
503
|
+
return { isSuccess: false, signIn, error };
|
|
504
|
+
} finally {
|
|
505
|
+
setIsCodeSending(false);
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
const verifyCode = async ({ code }) => {
|
|
509
|
+
setIsVerifying(true);
|
|
510
|
+
try {
|
|
511
|
+
await signIn?.attemptFirstFactor({
|
|
512
|
+
strategy,
|
|
513
|
+
code
|
|
514
|
+
});
|
|
515
|
+
return { isSuccess: true, signIn };
|
|
516
|
+
} catch (error) {
|
|
517
|
+
return { isSuccess: false, signIn, error };
|
|
518
|
+
} finally {
|
|
519
|
+
setIsVerifying(false);
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
const resetPassword = async ({ password, tokenTemplate }) => {
|
|
523
|
+
setIsResetting(true);
|
|
524
|
+
try {
|
|
525
|
+
const result = await signIn?.resetPassword({
|
|
526
|
+
password
|
|
527
|
+
});
|
|
528
|
+
await setActive({ session: result?.createdSessionId });
|
|
529
|
+
const { sessionToken, error } = await getSessionToken({ tokenTemplate });
|
|
530
|
+
if (sessionToken) {
|
|
531
|
+
return {
|
|
532
|
+
isSuccess: true,
|
|
533
|
+
signIn,
|
|
534
|
+
sessionToken
|
|
535
|
+
};
|
|
536
|
+
} else {
|
|
537
|
+
return {
|
|
538
|
+
signIn,
|
|
539
|
+
error,
|
|
540
|
+
isSuccess: false
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
} catch (error) {
|
|
544
|
+
return { isSuccess: false, signIn, error };
|
|
545
|
+
} finally {
|
|
546
|
+
setIsResetting(false);
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
return {
|
|
550
|
+
startResetPassword,
|
|
551
|
+
verifyCode,
|
|
552
|
+
resetPassword,
|
|
553
|
+
isCodeSending,
|
|
554
|
+
isVerifying,
|
|
555
|
+
isResetting
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// src/hooks/use-update-password.ts
|
|
560
|
+
var import_clerk_expo6 = require("@clerk/clerk-expo");
|
|
561
|
+
var import_react7 = require("react");
|
|
562
|
+
var useChangePassword = () => {
|
|
563
|
+
const { user } = (0, import_clerk_expo6.useUser)();
|
|
564
|
+
const [isPasswordUpdating, setIsPasswordUpdating] = (0, import_react7.useState)(false);
|
|
565
|
+
const updatePassword = async (params) => {
|
|
566
|
+
const { newPassword, currentPassword } = params;
|
|
567
|
+
try {
|
|
568
|
+
setIsPasswordUpdating(true);
|
|
569
|
+
await user?.updatePassword({ newPassword, currentPassword });
|
|
570
|
+
return { isSuccess: true };
|
|
571
|
+
} catch (error) {
|
|
572
|
+
return { isSuccess: false, error };
|
|
573
|
+
} finally {
|
|
574
|
+
setIsPasswordUpdating(false);
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
return { updatePassword, isPasswordUpdating };
|
|
578
|
+
};
|
|
579
|
+
|
|
580
|
+
// src/hooks/use-update-identifier.ts
|
|
581
|
+
var import_clerk_expo7 = require("@clerk/clerk-expo");
|
|
582
|
+
var import_react8 = require("react");
|
|
583
|
+
function useUpdateIdentifier(type) {
|
|
584
|
+
const { user } = (0, import_clerk_expo7.useUser)();
|
|
585
|
+
const isEmail = type === "email";
|
|
586
|
+
const { createIdentifier, verifyCode: verifyAddIdentifierCode, isCreating, isVerifying } = useAddIdentifier(type);
|
|
587
|
+
const [isUpdating, setIsUpdating] = (0, import_react8.useState)(false);
|
|
588
|
+
const getIdentifierResource = (identifier) => {
|
|
589
|
+
return isEmail ? user?.emailAddresses?.find((a) => a.emailAddress === identifier) : user?.phoneNumbers?.find((a) => a.phoneNumber === identifier);
|
|
590
|
+
};
|
|
591
|
+
const swapPrimaryIdentifier = async (identifier) => {
|
|
592
|
+
const newResource = getIdentifierResource(identifier);
|
|
593
|
+
if (!newResource || newResource.verification?.status !== "verified") {
|
|
594
|
+
throw new Error("Identifier not found or not verified");
|
|
595
|
+
}
|
|
596
|
+
const currentPrimaryId = isEmail ? user?.primaryEmailAddressId : user?.primaryPhoneNumberId;
|
|
597
|
+
const resources = isEmail ? user?.emailAddresses : user?.phoneNumbers;
|
|
598
|
+
const oldPrimaryResource = resources?.find((r) => r.id === currentPrimaryId);
|
|
599
|
+
if (isEmail) {
|
|
600
|
+
await user?.update({ primaryEmailAddressId: newResource.id });
|
|
601
|
+
} else {
|
|
602
|
+
await user?.update({ primaryPhoneNumberId: newResource.id });
|
|
603
|
+
}
|
|
604
|
+
if (oldPrimaryResource && oldPrimaryResource.id !== newResource.id) {
|
|
605
|
+
await oldPrimaryResource.destroy();
|
|
606
|
+
}
|
|
607
|
+
await user?.reload();
|
|
608
|
+
};
|
|
609
|
+
const verifyCode = async ({ code, identifier }) => {
|
|
610
|
+
setIsUpdating(true);
|
|
611
|
+
const result = await verifyAddIdentifierCode({ code, identifier });
|
|
612
|
+
await user?.reload();
|
|
613
|
+
if (!result.isSuccess) {
|
|
614
|
+
setIsUpdating(false);
|
|
615
|
+
return result;
|
|
616
|
+
}
|
|
617
|
+
try {
|
|
618
|
+
await swapPrimaryIdentifier(identifier);
|
|
619
|
+
return { isSuccess: true, user };
|
|
620
|
+
} catch (error) {
|
|
621
|
+
return { isSuccess: false, error, user };
|
|
622
|
+
} finally {
|
|
623
|
+
setIsUpdating(false);
|
|
624
|
+
}
|
|
625
|
+
};
|
|
626
|
+
return {
|
|
627
|
+
createIdentifier,
|
|
628
|
+
verifyCode,
|
|
629
|
+
isCreating,
|
|
630
|
+
isVerifying,
|
|
631
|
+
isUpdating
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
635
|
+
0 && (module.exports = {
|
|
636
|
+
ClerkApiError,
|
|
637
|
+
useAddIdentifier,
|
|
638
|
+
useAuthWithIdentifier,
|
|
639
|
+
useAuthWithSSO,
|
|
640
|
+
useAuthWithTicket,
|
|
641
|
+
useChangePassword,
|
|
642
|
+
useClerkResources,
|
|
643
|
+
useGetSessionToken,
|
|
644
|
+
useOtpVerification,
|
|
645
|
+
useResetPassword,
|
|
646
|
+
useUpdateIdentifier
|
|
647
|
+
});
|
|
648
|
+
//# sourceMappingURL=index.js.map
|