"use client"; import { KeyRound, Lock, Mail } from "lucide-react"; import Link from "next/link"; import { signIn } from "next-auth/react"; import { useTranslations } from "next-intl"; import { type FormEvent, useState } from "react"; import { precheckLogin } from "@/actions/auth-precheck"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; export default function LoginPage() { const t = useTranslations("pages.login"); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [code, setCode] = useState(""); const [needs2fa, setNeeds2fa] = useState(false); const [error, setError] = useState(null); const [pending, setPending] = useState(false); async function onSubmit(e: FormEvent) { e.preventDefault(); setError(null); setPending(true); try { if (!needs2fa) { const pre = await precheckLogin(username, password); if (pre === "invalid") { setError(t("errorInvalidCredentials")); return; } if (pre === "twofactor") { setNeeds2fa(true); return; } } const res = await signIn("credentials", { username, password, code, redirect: false, }); if (!res || res.error) { setError( needs2fa ? t("errorInvalid2fa") : t("errorInvalidCredentials"), ); return; } window.location.href = "/"; } finally { setPending(false); } } return (

{t("title")}

{needs2fa ? t("subtitle2fa") : t("subtitle")}

{needs2fa ? t("subtitle2fa") : t("subtitle")} {needs2fa ? "Enter your authentication code" : "Sign in to your account"}
setUsername(e.target.value)} placeholder={t("usernamePlaceholder")} autoComplete="username" disabled={needs2fa} className="w-full rounded-xl border-2 border-[var(--input-border-color)] bg-[var(--color-background)] px-10 py-2.5 text-sm transition-all duration-200 focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20" />
setPassword(e.target.value)} placeholder={t("passwordPlaceholder")} autoComplete="current-password" disabled={needs2fa} className="w-full rounded-xl border-2 border-[var(--input-border-color)] bg-[var(--color-background)] px-10 py-2.5 text-sm transition-all duration-200 focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20" />
{needs2fa ? ( setCode(e.target.value)} placeholder={t("codePlaceholder")} inputMode="numeric" autoComplete="one-time-code" autoFocus className="w-full rounded-xl border-2 border-[var(--input-border-color)] bg-[var(--color-background)] px-4 py-2.5 text-sm transition-all duration-200 focus:border-[var(--color-primary)] focus:ring-2 focus:ring-[var(--color-primary)]/20" /> ) : null}
{error ? (

{error}

) : null}
{!needs2fa ? ( <>
{t("or")}
) : null}

{t("noAccount")}{" "} {t("createOne")} ยท {t("forgotPassword")}

); }