import { useForm } from "@tanstack/react-form"; import { Link, createFileRoute } from "@tanstack/react-router"; import { AuthPageCard, AuthPageShell, authRedirectSearchSchema, } from "@/client/features/auth/AuthPage"; import { getFieldError, getFormError } from "@/client/lib/forms"; import { authClient } from "@/lib/auth-client"; import { isHostedClientAuthMode } from "@/lib/auth-mode"; import { getSignInSearch, normalizeAuthRedirect } from "@/lib/auth-redirect"; import { z } from "zod"; const forgotPasswordSchema = z.object({ email: z.string().trim().email("Enter a valid email address."), }); export const Route = createFileRoute("/forgot-password")({ validateSearch: authRedirectSearchSchema, component: ForgotPasswordPage, }); function ForgotPasswordPage() { const search = Route.useSearch(); const redirectTo = normalizeAuthRedirect(search.redirect); const isHostedMode = isHostedClientAuthMode(); const form = useForm({ defaultValues: { email: "", }, validators: { onSubmit: forgotPasswordSchema, }, onSubmit: async ({ formApi, value }) => { try { const redirectUrl = new URL("/reset-password", window.location.origin); if (redirectTo !== "/") redirectUrl.searchParams.set("redirect", redirectTo); const result = await authClient.requestPasswordReset({ email: value.email.trim(), redirectTo: redirectUrl.toString(), }); if (result.error) { formApi.setErrorMap({ onSubmit: { form: result.error.message || "We couldn't send the reset email.", fields: {}, }, }); return; } } catch { formApi.setErrorMap({ onSubmit: { form: "We couldn't send the reset email right now. Please try again.", fields: {}, }, }); } }, }); return ( ({ isSuccess: state.isSubmitSuccessful && !state.errorMap.onSubmit, submittedEmail: state.values.email, submitError: state.errorMap.onSubmit, isSubmitting: state.isSubmitting, })} > {({ isSuccess, submittedEmail, submitError, isSubmitting }) => { const errorMessage = getFormError(submitError); return ( Back to sign in

} > {isSuccess ? (
If an account exists for that email, you'll receive password reset instructions shortly.
) : (
{ event.preventDefault(); void form.handleSubmit(); }} > {(field) => { const error = getFieldError(field.state.meta.errors); return (
field.handleChange(event.target.value) } autoComplete="email" disabled={!isHostedMode} required /> {error ? (

{error}

) : null}
); }}
{errorMessage ? (

{errorMessage}

) : null}
)}
); }}
); }