"use client"; import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from "@hexahost/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useSearchParams } from "next/navigation"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { Link, useRouter } from "@/i18n/navigation"; import { ApiError, submitLogin } from "@/lib/api/auth"; import { createLoginSchema, type LoginFormValues } from "@/lib/schemas/auth"; import { useAuth } from "@/components/providers/auth-provider"; 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 LoginForm() { const t = useTranslations("auth"); const tv = useTranslations("validation"); const router = useRouter(); const searchParams = useSearchParams(); const { refresh } = useAuth(); const [apiError, setApiError] = useState(null); const schema = createLoginSchema({ emailRequired: tv("emailRequired"), emailInvalid: tv("emailInvalid"), passwordRequired: tv("passwordRequired"), passwordMin: tv("passwordMin"), }); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(schema), defaultValues: { email: "", password: "" }, }); async function onSubmit(values: LoginFormValues) { setApiError(null); try { const result = await submitLogin(values); if (result.twoFactorRequired && result.challengeId) { router.push(`/login/2fa?challenge=${encodeURIComponent(result.challengeId)}`); return; } await refresh(); const redirectTo = searchParams.get("redirect"); router.push(redirectTo?.startsWith("/") ? redirectTo : "/dashboard"); } catch (error) { if (error instanceof ApiError) { setApiError(error.detail ?? error.title); } else { setApiError(t("errors.generic")); } } } return ( {t("loginTitle")} {t("loginSubtitle")}
{errors.email ? ( ) : null}
{t("forgotPasswordLink")}
{errors.password ? ( ) : null}
{apiError ? (

{apiError}

) : null}

{t("noAccount")}{" "} {t("registerTitle")}

); }