"use client"; import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from "@hexahost/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { Link } from "@/i18n/navigation"; import { ApiError, forgotPassword } from "@/lib/api/auth"; import { createForgotPasswordSchema, type ForgotPasswordFormValues } from "@/lib/schemas/auth"; const inputClassName = "flex h-10 w-full rounded-md border border-zinc-300 bg-white px-3 text-sm text-zinc-900 placeholder:text-zinc-400 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sky-500 dark:border-zinc-700 dark:bg-zinc-950 dark:text-zinc-100"; export function ForgotPasswordForm() { const t = useTranslations("auth"); const tv = useTranslations("validation"); const [apiError, setApiError] = useState(null); const [submitted, setSubmitted] = useState(false); const schema = createForgotPasswordSchema({ emailRequired: tv("emailRequired"), emailInvalid: tv("emailInvalid"), }); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(schema), defaultValues: { email: "" }, }); async function onSubmit(values: ForgotPasswordFormValues) { setApiError(null); try { await forgotPassword(values.email); setSubmitted(true); } catch (error) { if (error instanceof ApiError) { setApiError(error.detail ?? error.title); } else { setApiError(t("errors.generic")); } } } if (submitted) { return ( {t("forgotPasswordTitle")} {t("forgotPasswordSent")} {t("backToLogin")} ); } return ( {t("forgotPasswordTitle")} {t("forgotPasswordSubtitle")}
{errors.email ? ( ) : null}
{apiError ? (

{apiError}

) : null}

{t("backToLogin")}

); }