"use client" import { zodResolver } from "@hookform/resolvers/zod" import type { BetterFetchOption } from "better-auth/react" import { Loader2 } from "lucide-react" import { useContext, useEffect } from "react" import { useForm } from "react-hook-form" import * as z from "zod" import { useCaptcha } from "../../../hooks/use-captcha" import { useIsHydrated } from "../../../hooks/use-hydrated" import { AuthUIContext } from "../../../lib/auth-ui-provider" import { cn, getLocalizedError } from "../../../lib/utils" import type { AuthLocalization } from "../../../localization/auth-localization" import { Captcha } from "../../captcha/captcha" import { Button } from "../../ui/button" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "../../ui/form" import { Input } from "../../ui/input" import type { AuthFormClassNames } from "../auth-form" export interface ForgotPasswordFormProps { className?: string classNames?: AuthFormClassNames isSubmitting?: boolean localization: Partial setIsSubmitting?: (value: boolean) => void } export function ForgotPasswordForm({ className, classNames, isSubmitting, localization, setIsSubmitting }: ForgotPasswordFormProps) { const isHydrated = useIsHydrated() const { captchaRef, getCaptchaHeaders, resetCaptcha } = useCaptcha({ localization }) const { authClient, basePath, baseURL, localization: contextLocalization, navigate, toast, viewPaths, localizeErrors } = useContext(AuthUIContext) localization = { ...contextLocalization, ...localization } const formSchema = z.object({ email: z .string() .email({ message: `${localization.EMAIL} ${localization.IS_INVALID}` }) .min(1, { message: `${localization.EMAIL} ${localization.IS_REQUIRED}` }) }) const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { email: "" } }) isSubmitting = isSubmitting || form.formState.isSubmitting useEffect(() => { setIsSubmitting?.(form.formState.isSubmitting) }, [form.formState.isSubmitting, setIsSubmitting]) async function forgotPassword({ email }: z.infer) { try { const fetchOptions: BetterFetchOption = { throw: true, headers: await getCaptchaHeaders("/forget-password") } await authClient.requestPasswordReset({ email, redirectTo: `${baseURL}${basePath}/${viewPaths.RESET_PASSWORD}`, fetchOptions }) toast({ variant: "success", message: localization.FORGOT_PASSWORD_EMAIL }) navigate( `${basePath}/${viewPaths.SIGN_IN}${window.location.search}` ) } catch (error) { toast({ variant: "error", message: getLocalizedError({ error, localization, localizeErrors }) }) resetCaptcha() } } return (
( {localization.EMAIL} )} /> ) }