"use client"; import Image from "next/image"; import { useRouter } from "next/navigation"; import { FormEvent, InputHTMLAttributes, ReactNode, useState, } from "react"; import ManaLogo from "@/components/ui/ManaLogo"; import { ApiError } from "@/lib/api"; import { useAuth } from "@/lib/auth"; type AuthMode = "login" | "register"; type LoginMethod = "password" | "otp"; function AuthFormInner() { const router = useRouter(); const { login, sendLoginOtp, loginWithOtp, registerSendCode, registerVerify, } = useAuth(); const [mode, setMode] = useState("login"); const [loginMethod, setLoginMethod] = useState("password"); const [otpSent, setOtpSent] = useState(false); const [registerOtpSent, setRegisterOtpSent] = useState(false); const [pendingCell, setPendingCell] = useState(""); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); const isLogin = mode === "login"; function afterAuth(_role: string) { router.replace("/account"); } async function handleLoginPassword(event?: FormEvent) { event?.preventDefault(); event?.stopPropagation(); setError(null); setBusy(true); const formEl = event?.currentTarget ?? (document.getElementById("auth-login-form") as HTMLFormElement | null); if (!formEl) { setError("فرم ورود پیدا نشد"); setBusy(false); return; } const form = new FormData(formEl); const cellNumber = String(form.get("cellNumber") ?? "") .trim() .replace(/[۰-۹]/g, (d) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(d))); const password = String(form.get("password") ?? ""); try { const user = await login(cellNumber, password); afterAuth(user.role); } catch (err) { setError(err instanceof ApiError ? err.message : "ورود ناموفق بود"); } finally { setBusy(false); } } async function handleLoginOtp(event?: FormEvent) { event?.preventDefault(); event?.stopPropagation(); setError(null); setBusy(true); const formEl = event?.currentTarget ?? (document.getElementById("auth-login-form") as HTMLFormElement | null); if (!formEl) { setError("فرم ورود پیدا نشد"); setBusy(false); return; } const form = new FormData(formEl); const cellNumber = String(form.get("cellNumber") ?? "") .trim() .replace(/[۰-۹]/g, (d) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(d))); const code = String(form.get("code") ?? "").trim(); try { if (!otpSent) { await sendLoginOtp(cellNumber); setPendingCell(cellNumber); setOtpSent(true); } else { const user = await loginWithOtp(cellNumber || pendingCell, code); afterAuth(user.role); } } catch (err) { setError(err instanceof ApiError ? err.message : "خطا در ورود با کد"); } finally { setBusy(false); } } async function handleRegister(event?: FormEvent) { event?.preventDefault(); event?.stopPropagation(); setError(null); setBusy(true); const formEl = event?.currentTarget ?? (document.getElementById("auth-register-form") as HTMLFormElement | null); if (!formEl) { setError("فرم ثبت‌نام پیدا نشد"); setBusy(false); return; } const form = new FormData(formEl); const firstName = String(form.get("firstName") ?? "").trim(); const lastName = String(form.get("lastName") ?? "").trim(); const cellNumber = String(form.get("cellNumber") ?? "") .trim() .replace(/[۰-۹]/g, (d) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(d))); const password = String(form.get("password") ?? ""); const confirm = String(form.get("confirm") ?? ""); const code = String(form.get("code") ?? "").trim(); try { if (!registerOtpSent) { if (password !== confirm) { setError("رمز عبور و تکرار آن یکسان نیست"); return; } await registerSendCode({ firstName, lastName, cellNumber, password }); setPendingCell(cellNumber); setRegisterOtpSent(true); } else { const user = await registerVerify(cellNumber || pendingCell, code); afterAuth(user.role); } } catch (err) { setError(err instanceof ApiError ? err.message : "ثبت‌نام ناموفق بود"); } finally { setBusy(false); } } return (
{error ? (

{error}

) : null}
{isLogin ? ( {loginMethod === "password" ? ( ) : otpSent ? ( ) : null}
{loginMethod === "password" ? ( ) : ( )}
) : ( {!registerOtpSent ? ( <>
) : ( <> )}
)}

با ادامه، شرایط استفاده و حریم خصوصی مانا را می‌پذیرید.

); } export default function AuthForm() { return ; } function AuthPanel({ formId, title, subtitle, onSubmit, children, }: { formId: string; title: string; subtitle: string; onSubmit: (event?: FormEvent) => void; children: ReactNode; }) { return (

{title}

{subtitle}

{ event.preventDefault(); event.stopPropagation(); onSubmit(event); }} className="flex w-full flex-col gap-4" autoComplete="off" > {children}
); } function Field({ id, label, autoComplete = "off", ...props }: { id: string; label: string; } & InputHTMLAttributes) { return (
); } function OtpIcon() { return ( ); } function KeyMiniIcon() { return ( ); }