@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/enums/api-error.ts","../src/hooks/use-clerk-resources.ts","../src/hooks/use-get-session-token.ts","../src/hooks/use-auth-with-sso.ts","../src/hooks/use-auth-with-ticket.ts","../src/hooks/use-otp-verification.ts","../src/hooks/use-auth-with-identifier.ts","../src/hooks/use-add-identifier.ts","../src/hooks/use-reset-password.ts","../src/hooks/use-update-password.ts","../src/hooks/use-update-identifier.ts"],"sourcesContent":["/**\n * Enum containing common Clerk API error codes\n */\nexport enum ClerkApiError {\n /** Error when a session already exists */\n SESSION_EXISTS = 'session_exists',\n /** Error when an identifier (email/phone) already exists */\n FORM_IDENTIFIER_EXIST = 'form_identifier_exists',\n /** Error when the verification code is incorrect */\n FORM_CODE_INCORRECT = 'form_code_incorrect',\n}\n","import { getClerkInstance } from '@clerk/clerk-expo';\nimport { UseClerkResourcesReturn } from '../types';\n\n/**\n * Hook that provides access to essential Clerk methods and objects.\n *\n * @returns {UseClerkResourcesReturn} Object containing Clerk resources:\n * - `signUp` - Provides access to SignUp object: https://clerk.com/docs/references/javascript/sign-up\n * - `signIn` - Provides access to SignIn object: https://clerk.com/docs/references/javascript/sign-in\n * - `setActive` - A function that sets the active session\n * - `signOut` - A function that signs out the current user\n */\nexport const useClerkResources = (): UseClerkResourcesReturn => {\n const clerk = getClerkInstance();\n const signUp = clerk.client?.signUp;\n const signIn = clerk.client?.signIn;\n const signOut = clerk.signOut;\n const setActive = clerk.setActive;\n\n return { signUp, signIn, setActive, signOut };\n};\n","import { getClerkInstance } from '@clerk/clerk-expo';\nimport { UseGetSessionTokenReturn } from '../types';\n\n/**\n * Hook that provides functionality for getting session tokens.\n *\n * @returns {UseGetSessionTokenReturn} Object containing:\n * - `getSessionToken` - A function to retrieve the session token. It takes an optional tokenTemplate parameter to specify a template for the token\n */\nexport const useGetSessionToken = (): UseGetSessionTokenReturn => {\n const clerk = getClerkInstance();\n\n const getSessionToken: UseGetSessionTokenReturn['getSessionToken'] = async ({ tokenTemplate }) => {\n try {\n const token = await clerk.session?.getToken({ template: tokenTemplate });\n const sessionToken = token || clerk.session?.lastActiveToken?.getRawString();\n\n if (sessionToken) {\n return {\n sessionToken,\n isSuccess: true,\n };\n } else {\n return {\n sessionToken: null,\n isSuccess: false,\n };\n }\n } catch (error) {\n return {\n sessionToken: null,\n error,\n isSuccess: false,\n };\n }\n };\n\n return { getSessionToken };\n};\n","import { useSSO } from '@clerk/clerk-expo';\nimport { useState } from 'react';\nimport { StartSSOArgs, UseAuthWithSSOReturn } from '../types';\nimport { useGetSessionToken } from './use-get-session-token';\n\n/**\n * Hook that provides functionality to handle SSO authentication flows.\n *\n * @returns {UseAuthWithSSOReturn} Object containing:\n * - `startSSOFlow` - A function to initiate an SSO flow. It takes a strategy, redirectUrl, and optional tokenTemplate as parameters, starting the SSO authentication and returning session information or errors upon completion\n * - `isLoading` - A boolean indicating whether an SSO process is currently ongoing\n */\nexport function useAuthWithSSO(): UseAuthWithSSOReturn {\n const { startSSOFlow: clerkStartSSOFlow } = useSSO();\n const { getSessionToken } = useGetSessionToken();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n\n const startSSOFlow: UseAuthWithSSOReturn['startSSOFlow'] = async ({\n strategy,\n redirectUrl,\n tokenTemplate,\n }: StartSSOArgs) => {\n try {\n setIsLoading(true);\n\n const { createdSessionId, setActive, signIn, signUp } = await clerkStartSSOFlow({\n strategy,\n redirectUrl,\n });\n\n if (!createdSessionId) {\n return { sessionToken: null };\n }\n\n await setActive?.({ session: createdSessionId });\n const { sessionToken } = await getSessionToken({ tokenTemplate });\n\n if (sessionToken) {\n return {\n sessionToken,\n signIn,\n signUp,\n isSuccess: true,\n };\n }\n\n return {\n signIn,\n signUp,\n isSuccess: false,\n };\n } catch (error) {\n return {\n error,\n isSuccess: false,\n };\n } finally {\n setIsLoading(false);\n }\n };\n\n return { startSSOFlow, isLoading };\n}\n","import { useState } from 'react';\nimport { UseAuthWithTicketReturn } from '../types';\nimport { useClerkResources } from './use-clerk-resources';\nimport { useGetSessionToken } from './use-get-session-token';\n\n/**\n * Hook that facilitates user authentication using a ticket-based strategy (ticket is a token generated from the Backend API).\n *\n * @returns {UseAuthWithTicketReturn} Object containing:\n * - `startAuthorization` - A function to initiate authentication with a ticket. It accepts an object with ticket and optional tokenTemplate parameters to kick off the authorization process and returns the session details\n * - `isLoading` - A boolean indicating whether the ticket-based authorization process is ongoing\n */\nexport function useAuthWithTicket(): UseAuthWithTicketReturn {\n const { signIn, setActive } = useClerkResources();\n const { getSessionToken } = useGetSessionToken();\n const [isLoading, setIsLoading] = useState(false);\n\n const startAuthorization: UseAuthWithTicketReturn['startAuthorization'] = async ({ ticket, tokenTemplate }) => {\n if (signIn) {\n setIsLoading(true);\n\n try {\n const signInAttempt = await signIn.create({\n strategy: 'ticket',\n ticket,\n });\n\n if (signInAttempt.status === 'complete') {\n await setActive({\n session: signInAttempt.createdSessionId,\n });\n const { sessionToken, error } = await getSessionToken({ tokenTemplate });\n\n if (sessionToken) {\n return {\n sessionToken,\n signIn,\n isSuccess: true,\n };\n }\n\n return {\n signIn,\n error,\n isSuccess: false,\n };\n }\n } catch (error) {\n return {\n signIn,\n error,\n isSuccess: false,\n };\n } finally {\n setIsLoading(false);\n }\n }\n\n return {\n sessionToken: null,\n signIn,\n isSuccess: false,\n };\n };\n\n return {\n startAuthorization,\n isLoading,\n };\n}\n","import { EmailCodeFactor, PhoneCodeFactor } from '@clerk/types';\nimport { useState } from 'react';\nimport { OtpStrategy, UseOtpVerificationReturn } from '../types';\nimport { useClerkResources } from './use-clerk-resources';\nimport { useGetSessionToken } from './use-get-session-token';\n\n/**\n * Hook that provides functionality for managing OTP (One Time Password) verification in user authentication workflows, supporting both sign-up and sign-in processes.\n *\n * @returns {UseOtpVerificationReturn} Object containing:\n * - `sendOtpCode` - Sends an OTP code to the user's identifier (email or phone number) based on the specified strategy\n * - `verifyCode` - Verifies the OTP code provided by the user, completing the authentication process\n * - `isVerifying` - A boolean indicating whether a verification attempt is currently in progress\n */\nexport function useOtpVerification(): UseOtpVerificationReturn {\n const { signUp, signIn, setActive } = useClerkResources();\n const { getSessionToken } = useGetSessionToken();\n const [isVerifying, setIsVerifying] = useState(false);\n\n const sendSignInOtpCode = async (strategy: OtpStrategy, isSecondFactor: boolean = false): Promise<void> => {\n const codeFactors = isSecondFactor ? signIn?.supportedSecondFactors : signIn?.supportedFirstFactors;\n const prepareFactor = isSecondFactor ? signIn?.prepareSecondFactor : signIn?.prepareFirstFactor;\n const codeFactor = codeFactors?.find(\n (factor): factor is EmailCodeFactor | PhoneCodeFactor => factor.strategy === strategy,\n );\n\n if (codeFactor && 'emailAddressId' in codeFactor) {\n await prepareFactor?.({ strategy: 'email_code', emailAddressId: codeFactor.emailAddressId });\n } else if (codeFactor && 'phoneNumberId' in codeFactor) {\n await prepareFactor?.({ strategy: 'phone_code', phoneNumberId: codeFactor.phoneNumberId });\n } else {\n throw new Error(`No ${isSecondFactor ? 'second ' : ''}factor found for strategy: ${strategy}`);\n }\n };\n\n const sendSignUpOtpCode = async (strategy: OtpStrategy): Promise<void> => {\n if (!signUp) return;\n await signUp.prepareVerification({ strategy });\n };\n\n const sendOtpCode: UseOtpVerificationReturn['sendOtpCode'] = async ({ strategy, isSignUp, isSecondFactor }) => {\n if (isSignUp) {\n await sendSignUpOtpCode(strategy);\n } else {\n await sendSignInOtpCode(strategy, !!isSecondFactor);\n }\n };\n\n const verifyCode: UseOtpVerificationReturn['verifyCode'] = async ({\n code,\n strategy,\n tokenTemplate,\n isSignUp,\n isSecondFactor,\n }) => {\n try {\n setIsVerifying(true);\n\n if (isSignUp) {\n const completeSignUp = await signUp?.attemptVerification({\n strategy,\n code,\n });\n\n if (completeSignUp?.status === 'complete') {\n await setActive?.({ session: completeSignUp.createdSessionId });\n const { sessionToken, error } = await getSessionToken({ tokenTemplate });\n\n if (sessionToken) {\n return {\n sessionToken,\n signIn,\n signUp,\n isSuccess: true,\n };\n }\n\n return {\n signIn,\n signUp,\n error,\n isSuccess: false,\n };\n }\n } else {\n const attemptSignIn = isSecondFactor ? signIn?.attemptSecondFactor : signIn?.attemptFirstFactor;\n const completeSignIn = await attemptSignIn?.({ strategy, code });\n\n if (completeSignIn?.status === 'complete') {\n await setActive?.({ session: completeSignIn.createdSessionId });\n const sessionToken = (await getSessionToken({ tokenTemplate })).sessionToken;\n\n if (sessionToken) {\n return { sessionToken, signIn, signUp, isSuccess: true };\n }\n\n return { sessionToken: null, signIn, signUp, isSuccess: false };\n }\n }\n\n return {\n signIn,\n signUp,\n isSuccess: false,\n };\n } catch (error) {\n return {\n signIn,\n signUp,\n error,\n isSuccess: false,\n };\n } finally {\n setIsVerifying(false);\n }\n };\n\n return {\n sendOtpCode,\n verifyCode,\n isVerifying,\n };\n}\n","import { isClerkAPIResponseError } from '@clerk/clerk-expo';\nimport { SignInResource } from '@clerk/types';\nimport { useState } from 'react';\nimport { ClerkApiError } from '../enums';\nimport {\n AuthIdentifierVerifyBy,\n AuthorizationFinishedReturn,\n IdentifierMethodFor,\n StartAuthParams,\n StartSignInWithIdentifierReturn,\n StartSignUpParams,\n StartSignUpWithIdentifierReturn,\n UseAuthWithIdentifierReturn,\n} from '../types';\nimport { useClerkResources } from './use-clerk-resources';\nimport { useGetSessionToken } from './use-get-session-token';\nimport { useOtpVerification } from './use-otp-verification';\n\n/**\n * Hook that provides functionality to handle user sign-up and sign-in processes using an identifier such as an email, phone number, or username. It supports both OTP (One Time Password) and password-based authentication methods.\n *\n * @template {AuthIdentifierVerifyBy} TVerifyBy - The verification method type\n * @template {IdentifierMethodFor<TVerifyBy>} TMethod - The identifier method type\n * @param {TMethod} method - Specifies the type of identifier used for authentication (e.g., 'emailAddress', 'phoneNumber', 'username')\n * @param {TVerifyBy} verifyBy - Specifies the verification method ('otp' for one-time passwords or 'password')\n *\n * @returns {UseAuthWithIdentifierReturn<TVerifyBy, TMethod>} Object containing:\n * - `startSignUp` - Initiates a new user registration using the specified identifier and verification method\n * - `startSignIn` - Initiates authentication of an existing user using the specified identifier and verification method\n * - `startAuthorization` - Determines whether to initiate a sign-up or sign-in based on whether the user has been registered previously\n * - `verifyCode` - Verifies an OTP code if the verification method is 'otp' (only available for non-username methods)\n * - `isLoading` - Indicates whether an authentication request is in progress\n * - `isVerifying` - Indicates whether an OTP verification is in progress (only available for non-username methods)\n */\nexport function useAuthWithIdentifier<\n TVerifyBy extends AuthIdentifierVerifyBy,\n TMethod extends IdentifierMethodFor<TVerifyBy>,\n>(method: TMethod, verifyBy: TVerifyBy): UseAuthWithIdentifierReturn<TVerifyBy, TMethod> {\n const { signUp, signIn, setActive } = useClerkResources();\n const { sendOtpCode, verifyCode: verifyOtpCode, isVerifying } = useOtpVerification();\n const { getSessionToken } = useGetSessionToken();\n\n const [isAuthorizing, setIsAuthorizing] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const strategy = method === 'emailAddress' ? 'email_code' : 'phone_code';\n\n const handleSessionToken = async (tokenTemplate?: string): Promise<{ sessionToken?: string; error?: unknown }> => {\n const { sessionToken, error } = await getSessionToken({ tokenTemplate });\n\n return { sessionToken: sessionToken || undefined, error };\n };\n\n const handleSignInWithPassword = async (\n signInAttempt: SignInResource,\n isSignUp: boolean,\n tokenTemplate?: string,\n ): Promise<StartSignInWithIdentifierReturn<TVerifyBy> | StartSignUpWithIdentifierReturn<TMethod>> => {\n await setActive?.({ session: signInAttempt.createdSessionId });\n const { sessionToken, error } = await handleSessionToken(tokenTemplate);\n\n if (isSignUp) {\n return {\n signUp,\n error,\n sessionToken,\n isSuccess: !!sessionToken,\n } as StartSignUpWithIdentifierReturn<TMethod>;\n }\n\n return {\n signIn,\n error,\n sessionToken,\n isSuccess: !!sessionToken,\n } as StartSignInWithIdentifierReturn<TVerifyBy>;\n };\n\n const handleUsernameAuth = async (\n params: StartAuthParams<'password'>,\n isSignUp: boolean,\n ): Promise<StartSignInWithIdentifierReturn<TVerifyBy> | StartSignUpWithIdentifierReturn<TMethod>> => {\n const { identifier, password, tokenTemplate } = params;\n const authMethod = isSignUp ? signUp : signIn;\n\n const authAttempt = await authMethod?.create({ username: identifier, password });\n\n if (authAttempt?.status === 'complete' && 'createdSessionId' in authAttempt) {\n return handleSignInWithPassword(authAttempt as SignInResource, isSignUp, tokenTemplate);\n }\n\n return {\n isSuccess: false,\n [isSignUp ? 'signUp' : 'signIn']: authMethod,\n } as StartSignInWithIdentifierReturn<TVerifyBy> | StartSignUpWithIdentifierReturn<TMethod>;\n };\n\n const handleEmailPhoneAuth = async (\n params: StartAuthParams<TVerifyBy>,\n isSignUp: boolean,\n ): Promise<StartSignInWithIdentifierReturn<TVerifyBy> | StartSignUpWithIdentifierReturn<TMethod>> => {\n const { identifier } = params;\n const authMethod = isSignUp ? signUp : signIn;\n const identifierFieldName = isSignUp ? method : 'identifier';\n\n if (verifyBy === 'password') {\n try {\n const { password, tokenTemplate } = params as StartAuthParams<'password'>;\n const authAttempt = await authMethod?.create({ [identifierFieldName]: identifier, password });\n\n if (authAttempt?.status === 'complete' && 'createdSessionId' in authAttempt) {\n return handleSignInWithPassword(authAttempt as SignInResource, isSignUp, tokenTemplate);\n } else {\n return { isSuccess: false, signIn, signUp, status: authAttempt?.status, error: null };\n }\n } catch (error) {\n return { error, signIn, signUp };\n }\n } else if (verifyBy === 'otp') {\n try {\n await authMethod?.create({ [identifierFieldName]: identifier });\n await sendOtpCode({ strategy, isSignUp });\n } catch (error) {\n return { error, signIn, signUp };\n }\n }\n\n return {\n isSuccess: true,\n [isSignUp ? 'signUp' : 'signIn']: authMethod,\n } as StartSignInWithIdentifierReturn<TVerifyBy> | StartSignUpWithIdentifierReturn<TMethod>;\n };\n\n const startSignUp: UseAuthWithIdentifierReturn<TVerifyBy, TMethod>['startSignUp'] = async (params) => {\n try {\n setIsLoading(true);\n\n return method === 'username'\n ? await handleUsernameAuth(params as StartAuthParams<'password'>, true)\n : await handleEmailPhoneAuth(params, true);\n } catch (error) {\n return { error, signUp, isSuccess: false } as StartSignUpWithIdentifierReturn<TMethod>;\n } finally {\n setIsLoading(false);\n }\n };\n\n const startSignIn: UseAuthWithIdentifierReturn<TVerifyBy, TMethod>['startSignIn'] = async (params) => {\n try {\n setIsLoading(true);\n\n return method === 'username'\n ? await handleUsernameAuth(params as StartAuthParams<'password'>, false)\n : await handleEmailPhoneAuth(params, false);\n } catch (error) {\n return { error, signIn, isSuccess: false } as StartSignInWithIdentifierReturn<TVerifyBy>;\n } finally {\n setIsLoading(false);\n }\n };\n\n const startAuthorization: UseAuthWithIdentifierReturn<TVerifyBy, TMethod>['startAuthorization'] = async (params) => {\n try {\n setIsAuthorizing(true);\n\n const result = await startSignUp(params as StartSignUpParams<TVerifyBy>);\n\n if (result?.error && isClerkAPIResponseError(result.error)) {\n const error = result.error.errors[0];\n\n if (error?.code === ClerkApiError.FORM_IDENTIFIER_EXIST) {\n const signInResult = await startSignIn(params);\n\n return { ...signInResult, isSignUp: false };\n }\n }\n\n return { ...result, isSignUp: true };\n } catch (error) {\n return { error, signIn, signUp, isSuccess: false } as StartSignInWithIdentifierReturn<TVerifyBy>;\n } finally {\n setIsAuthorizing(false);\n }\n };\n\n const verifyCode = async ({\n code,\n isSignUp,\n tokenTemplate,\n }: {\n code: string;\n isSignUp: boolean;\n tokenTemplate?: string;\n }): Promise<AuthorizationFinishedReturn> => {\n setIsLoading(true);\n\n try {\n return await verifyOtpCode({ code, strategy, tokenTemplate, isSignUp });\n } finally {\n setIsLoading(false);\n }\n };\n\n if (method === 'username') {\n return {\n startSignIn,\n startSignUp,\n startAuthorization,\n isLoading: isAuthorizing || isLoading,\n } as UseAuthWithIdentifierReturn<TVerifyBy, TMethod>;\n } else {\n return {\n startSignIn,\n startSignUp,\n startAuthorization,\n isLoading: isAuthorizing || isLoading,\n verifyCode,\n isVerifying,\n } as UseAuthWithIdentifierReturn<TVerifyBy, TMethod>;\n }\n}\n","import { isClerkAPIResponseError, useUser } from '@clerk/clerk-expo';\nimport { EmailAddressResource, PhoneNumberResource } from '@clerk/types';\nimport { useState } from 'react';\nimport { IdentifierType, UseAddIdentifierReturn } from '../types';\n\n/**\n * Hook that provides functionality to add new email or phone number identifiers to a user's account and verify them using verification codes.\n *\n * @param {IdentifierType} type - Specifies the type of identifier (e.g., 'phone', 'email')\n *\n * @returns {UseAddIdentifierReturn} Object containing:\n * - `createIdentifier` - A function to add a new email or phone number identifier to the user's account and prepare it for verification\n * - `verifyCode` - A function to verify a code sent to the identifier, completing the verification process\n * - `isCreating` - A boolean indicating whether an identifier is currently being added\n * - `isVerifying` - A boolean indicating whether a verification code is currently being processed\n */\nexport function useAddIdentifier(type: IdentifierType): UseAddIdentifierReturn {\n const { user } = useUser();\n const [isCreating, setIsCreating] = useState(false);\n const [isVerifying, setIsVerifying] = useState(false);\n\n const isEmail = type === 'email';\n\n const createIdentifier: UseAddIdentifierReturn['createIdentifier'] = async ({ identifier }) => {\n setIsCreating(true);\n\n try {\n let resource = getIdentifierResource(identifier);\n\n // If the resource already exists, re-creating it will cause an error,\n // so skip the creation step and go to the send verification code flow.\n if (!resource) {\n resource = isEmail\n ? await user?.createEmailAddress({ email: identifier })\n : await user?.createPhoneNumber({ phoneNumber: identifier });\n\n await user?.reload();\n }\n await prepareVerification({ isEmail, identifier });\n\n return { isSuccess: true, user };\n } catch (e) {\n if (isClerkAPIResponseError(e)) {\n return { error: e, user };\n }\n\n return { isSuccess: false, user };\n } finally {\n setIsCreating(false);\n }\n };\n\n const verifyCode: UseAddIdentifierReturn['verifyCode'] = async ({ code, identifier }) => {\n setIsVerifying(true);\n\n try {\n const resource = getIdentifierResource(identifier);\n\n const verifyAttempt = await resource?.attemptVerification({ code });\n\n if (verifyAttempt?.verification?.status === 'verified') {\n return { isSuccess: true, user };\n } else {\n return { isSuccess: false, verifyAttempt };\n }\n } catch (error) {\n return { error, user };\n } finally {\n setIsVerifying(false);\n }\n };\n\n const prepareVerification = async ({\n isEmail,\n identifier,\n }: {\n identifier: string;\n isEmail: boolean;\n }): Promise<void> => {\n const phoneResource = user?.phoneNumbers?.find((a) => a.phoneNumber === identifier);\n const emailResource = user?.emailAddresses?.find((a) => a.emailAddress === identifier);\n\n await (isEmail\n ? emailResource?.prepareVerification({ strategy: 'email_code' })\n : phoneResource?.prepareVerification());\n };\n\n const getIdentifierResource = (identifier: string): EmailAddressResource | PhoneNumberResource | undefined => {\n return isEmail\n ? user?.emailAddresses.find((a) => a.emailAddress === identifier)\n : user?.phoneNumbers.find((a) => a.phoneNumber === identifier);\n };\n\n return { createIdentifier, verifyCode, isCreating, isVerifying };\n}\n","import { useState } from 'react';\nimport { OtpMethod, UseResetPasswordReturn } from '../types';\nimport { useClerkResources } from './use-clerk-resources';\nimport { useGetSessionToken } from './use-get-session-token';\n\n/**\n * Hook that provides methods to handle password reset functionality through email or phone-based OTP.\n *\n * @param {Object} params - Parameters for the hook\n * @param {OtpMethod} params.method - The method to use for OTP (emailAddress or phoneNumber)\n *\n * @returns {UseResetPasswordReturn} Object containing:\n * - `startResetPassword` - A function to initiate the password reset process by sending a verification code to the user's email or phone number\n * - `resetPassword` - A function to reset the user's password and setting a new password\n * - `verifyCode` - A function to verify a code sent to the identifier, completing the verification process\n * - `isCodeSending` - A boolean indicating if the verification code is being sent\n * - `isResetting` - A boolean indicating if the password is being reset\n * - `isVerifying` - A boolean indicating whether a verification code is currently being processed\n */\nexport function useResetPassword({ method }: { method: OtpMethod }): UseResetPasswordReturn {\n const { signIn, setActive } = useClerkResources();\n const { getSessionToken } = useGetSessionToken();\n\n const [isCodeSending, setIsCodeSending] = useState(false);\n const [isVerifying, setIsVerifying] = useState(false);\n const [isResetting, setIsResetting] = useState(false);\n\n const strategy = method === 'emailAddress' ? 'reset_password_email_code' : 'reset_password_phone_code';\n\n const startResetPassword: UseResetPasswordReturn['startResetPassword'] = async ({ identifier }) => {\n setIsCodeSending(true);\n\n try {\n await signIn?.create({\n strategy,\n identifier,\n });\n\n return { isSuccess: true, signIn };\n } catch (error) {\n return { isSuccess: false, signIn, error };\n } finally {\n setIsCodeSending(false);\n }\n };\n\n const verifyCode: UseResetPasswordReturn['verifyCode'] = async ({ code }) => {\n setIsVerifying(true);\n\n try {\n await signIn?.attemptFirstFactor({\n strategy,\n code,\n });\n\n return { isSuccess: true, signIn };\n } catch (error) {\n return { isSuccess: false, signIn, error };\n } finally {\n setIsVerifying(false);\n }\n };\n\n const resetPassword: UseResetPasswordReturn['resetPassword'] = async ({ password, tokenTemplate }) => {\n setIsResetting(true);\n\n try {\n const result = await signIn?.resetPassword({\n password,\n });\n\n await setActive({ session: result?.createdSessionId });\n\n const { sessionToken, error } = await getSessionToken({ tokenTemplate });\n\n if (sessionToken) {\n return {\n isSuccess: true,\n signIn,\n sessionToken,\n };\n } else {\n return {\n signIn,\n error,\n isSuccess: false,\n };\n }\n } catch (error) {\n return { isSuccess: false, signIn, error };\n } finally {\n setIsResetting(false);\n }\n };\n\n return {\n startResetPassword,\n verifyCode,\n resetPassword,\n isCodeSending,\n isVerifying,\n isResetting,\n };\n}\n","import { useUser } from '@clerk/clerk-expo';\nimport { useState } from 'react';\nimport { UseUpdatePasswordReturn } from '../types';\n\n/**\n * Hook that provides functionality to update the current user's password.\n *\n * Requires the user to supply both the current password (for verification) and\n * the new password. On success, the user's password is updated in Clerk; on\n * failure, the hook returns an error without throwing.\n *\n * @returns {UseUpdatePasswordReturn} Object containing:\n * - `updatePassword` — Updates the user's password using current and new password\n * - `isPasswordUpdating` — Indicates whether a password update is currently in progress\n */\nexport const useChangePassword = (): UseUpdatePasswordReturn => {\n const { user } = useUser();\n const [isPasswordUpdating, setIsPasswordUpdating] = useState(false);\n\n const updatePassword: UseUpdatePasswordReturn['updatePassword'] = async (params) => {\n const { newPassword, currentPassword } = params;\n\n try {\n setIsPasswordUpdating(true);\n\n await user?.updatePassword({ newPassword, currentPassword });\n\n return { isSuccess: true };\n } catch (error) {\n return { isSuccess: false, error };\n } finally {\n setIsPasswordUpdating(false);\n }\n };\n\n return { updatePassword, isPasswordUpdating };\n};\n","import { useUser } from '@clerk/clerk-expo';\nimport { EmailAddressResource, PhoneNumberResource } from '@clerk/types';\nimport { useState } from 'react';\nimport { IdentifierType, UseUpdateIdentifierReturn } from '../types';\nimport { useAddIdentifier } from './use-add-identifier';\n\n/**\n * Hook that provides functionality to update an existing primary identifier\n * (email address or phone number) for the current user.\n *\n * This hook is a higher-level abstraction built on top of `useAddIdentifier`.\n * It reuses the identifier creation and verification flow, but extends it with\n * additional logic that, upon successful verification, automatically:\n *\n * - Sets the newly verified identifier as the primary one\n * - Removes the previously primary identifier (if different)\n *\n * The update process follows these stages:\n * 1. `createIdentifier` — adds a new identifier and initiates its verification flow\n * 2. `verifyCode` — verifies the received code and, if successful, updates the\n * user's primary identifier\n *\n * All basic method signatures and return types are inherited from `useAddIdentifier`, ensuring full compatibility\n *\n * @param {IdentifierType} type - Specifies the type of identifier (e.g., 'phone', 'email')\n *\n * @returns {UseUpdateIdentifierReturn} Object containing:\n * - `createIdentifier` — Adds a new email or phone identifier and prepares it for verification\n * - `verifyCode` — Verifies the code sent to the identifier and, on success,\n * updates the user's primary identifier\n * - `isCreating` — Indicates whether an identifier is currently being added\n * - `isVerifying` — Indicates whether a verification request is currently being processed\n * - `isUpdating` — Indicates whether the primary identifier update is currently in progress\n */\nexport function useUpdateIdentifier(type: IdentifierType): UseUpdateIdentifierReturn {\n const { user } = useUser();\n const isEmail = type === 'email';\n\n const { createIdentifier, verifyCode: verifyAddIdentifierCode, isCreating, isVerifying } = useAddIdentifier(type);\n\n const [isUpdating, setIsUpdating] = useState(false);\n\n const getIdentifierResource = (identifier: string): EmailAddressResource | PhoneNumberResource | undefined => {\n return isEmail\n ? user?.emailAddresses?.find((a) => a.emailAddress === identifier)\n : user?.phoneNumbers?.find((a) => a.phoneNumber === identifier);\n };\n\n const swapPrimaryIdentifier = async (identifier: string): Promise<void> => {\n const newResource = getIdentifierResource(identifier);\n\n if (!newResource || newResource.verification?.status !== 'verified') {\n throw new Error('Identifier not found or not verified');\n }\n\n const currentPrimaryId = isEmail ? user?.primaryEmailAddressId : user?.primaryPhoneNumberId;\n\n const resources = isEmail ? user?.emailAddresses : user?.phoneNumbers;\n const oldPrimaryResource = resources?.find((r) => r.id === currentPrimaryId);\n\n if (isEmail) {\n await user?.update({ primaryEmailAddressId: newResource.id });\n } else {\n await user?.update({ primaryPhoneNumberId: newResource.id });\n }\n\n if (oldPrimaryResource && oldPrimaryResource.id !== newResource.id) {\n await oldPrimaryResource.destroy();\n }\n\n await user?.reload();\n };\n\n const verifyCode: UseUpdateIdentifierReturn['verifyCode'] = async ({ code, identifier }) => {\n setIsUpdating(true);\n\n const result = await verifyAddIdentifierCode({ code, identifier });\n\n // Important to reload user model after adding new fields\n await user?.reload();\n\n if (!result.isSuccess) {\n setIsUpdating(false);\n\n return result;\n }\n\n try {\n await swapPrimaryIdentifier(identifier);\n\n return { isSuccess: true, user };\n } catch (error) {\n return { isSuccess: false, error, user };\n } finally {\n setIsUpdating(false);\n }\n };\n\n return {\n createIdentifier,\n verifyCode,\n isCreating,\n isVerifying,\n isUpdating,\n } satisfies UseUpdateIdentifierReturn;\n}\n"],"mappings":"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","names":["ClerkApiError","getClerkInstance","useState","useState","useState","useState","useState","useState","isClerkAPIResponseError","useState","isEmail","useState","useState","useUser","useState","useUser","useState","useUser","useState"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@veliseev93/clerk-react-native",
|
|
3
|
+
"version": "0.0.1-dev.0",
|
|
4
|
+
"description": "Hooks and helpers for Clerk authentication in React Native / Expo apps",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsup-node",
|
|
13
|
+
"release": "npm publish",
|
|
14
|
+
"lint": "npx tsc && npx eslint ./",
|
|
15
|
+
"format": "npx prettier --write . && npm run lint -- --fix",
|
|
16
|
+
"prepare": "husky"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/veliseev93/clerk-react-native-test.git"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"clerk",
|
|
24
|
+
"react-native",
|
|
25
|
+
"expo",
|
|
26
|
+
"authentication",
|
|
27
|
+
"sso",
|
|
28
|
+
"otp"
|
|
29
|
+
],
|
|
30
|
+
"author": "Ronas IT",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/veliseev93/clerk-react-native-test/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/veliseev93/clerk-react-native-test#readme",
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@clerk/clerk-expo": "^2.19.18",
|
|
41
|
+
"@clerk/types": "^4.101.11",
|
|
42
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@clerk/clerk-expo": "^2.19.18",
|
|
46
|
+
"@clerk/types": "^4.101.11",
|
|
47
|
+
"@eslint/compat": "^1.2.5",
|
|
48
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
49
|
+
"@eslint/js": "^9.18.0",
|
|
50
|
+
"@stylistic/eslint-plugin": "^2.13.0",
|
|
51
|
+
"@types/react": "~19.1.10",
|
|
52
|
+
"eslint": "^9.18.0",
|
|
53
|
+
"eslint-config-prettier": "^9.1.0",
|
|
54
|
+
"eslint-import-resolver-typescript": "^3.7.0",
|
|
55
|
+
"eslint-plugin-import": "^2.31.0",
|
|
56
|
+
"eslint-plugin-unused-imports": "^4.1.4",
|
|
57
|
+
"husky": "^9.1.7",
|
|
58
|
+
"lint-staged": "^15.4.1",
|
|
59
|
+
"prettier": "^3.4.2",
|
|
60
|
+
"react": "19.1.0",
|
|
61
|
+
"react-dom": "19.1.0",
|
|
62
|
+
"react-native": "0.81.4",
|
|
63
|
+
"tsup": "^8.3.5",
|
|
64
|
+
"typescript": "^5.7.3",
|
|
65
|
+
"typescript-eslint": "^8.20.0"
|
|
66
|
+
},
|
|
67
|
+
"lint-staged": {
|
|
68
|
+
"*.{js,ts}": "eslint --cache --fix",
|
|
69
|
+
"*.{js,ts,css,md}": "prettier --write"
|
|
70
|
+
}
|
|
71
|
+
}
|