useSignUpFlow()
import { useSignUpFlow } from '@auth/clerk'
- useSignUpFlow()
Use this hook to build custom sign-up experiences with built-in form state and verification flow. This hook wraps Clerk’s useSignUp()
and our useSocialAuthFlow()
to manage creating the user, sending the email verification code, and completing the session.
Usage
SignUpScreen.tsx
import { useSignUpFlow } from '@auth/clerk'
export const SignUpScreen = () => {
const {
formState,
isLoaded,
isLoading,
isPendingVerification,
onSignUpPressed,
onVerifyCodePressed,
signUpError,
} = useSignUpFlow({
forceRedirectUrl: '/',
initialValues: { emailAddress: '', password: '' },
})
if (!isLoaded) return null
return (
<View>
<TextInput
value={formState.values.emailAddress}
onChangeText={(v) => formState.setFieldValue('emailAddress', v)}
placeholder="Email"
autoCapitalize="none"
/>
<TextInput
value={formState.values.password}
onChangeText={(v) => formState.setFieldValue('password', v)}
placeholder="Password"
secureTextEntry
/>
{!isPendingVerification ? (
<Button disabled={isLoading} onPress={onSignUpPressed} title="Create account" />
) : (
<>
<TextInput
value={formState.values.code}
onChangeText={(v) => formState.setFieldValue('code', v)}
placeholder="Verification code"
/>
<Button disabled={isLoading} onPress={onVerifyCodePressed} title="Verify email" />
</>
)}
<Button disabled={isLoading} onPress={() => onPressSocialSignIn('oauth_google')} title="Continue with Google" />
{!!signUpError && <Text>{signUpError}</Text>}
</View>
)
}
API
Parameters
forceRedirectUrl?: string | null
— After success, navigate to this URL (defaults to/
).initialValues?: Partial<SignUpFormState>
— Prefill the form state. Ifcode
is preset, the hook starts in verification mode.
Returned values
formState: UseFormState<SignUpFormState>
— Controlled form state withvalues
,setFieldValue
, etc.isLoaded: boolean
— Underlying ClerkuseSignUp()
loaded state.isLoading: boolean
— Local submitting/processing state.isPendingVerification: boolean
— Whether the flow is waiting for the email verification code.onSignUpPressed: () => Promise<void>
— Creates the sign-up and triggers email verification.onVerifyCodePressed: () => Promise<void>
— Verifies the email code and completes the session.router
— Universal navigation object fromuseRouter()
.signUp
— ClerksignUp
resource.signUpStatus: SignUpStatus | null
— Most recent sign-up status when notcomplete
.setActive
— ClerksetActive
to set the active session on success.setIsLoading
,setSignUpStatus
,setSignUpError
— Local setters.signUpError: string | null
— Last user-facing error message.
Form shape
type SignUpFormState = {
emailAddress: string
password: string
firstName?: string
lastName?: string
username?: string
phoneNumber?: string
legalAccepted?: boolean
code?: string // 6 digits, triggers verification mode when present
errors?: Record<string, string[]>
}
See Clerk’s guide on error handling for custom flows: https://clerk.com/docs/guides/development/custom-flows/error-handling