"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter, useSearchParams } from "next/navigation"; import { Suspense } from "react"; import { useAuth } from "@/lib/auth"; import { useToast } from "@/lib/toast"; import { useI18n } from "@/lib/i18n"; import { resolveAuthNext } from "@/lib/authNext"; import SiteShell from "@/components/SiteShell"; function LoginForm() { const { login, register, demoLogin } = useAuth(); const { toast } = useToast(); const { t } = useI18n(); const router = useRouter(); const searchParams = useSearchParams(); const meta = resolveAuthNext(searchParams.get("next"), t.login); const [mode, setMode] = useState<"login" | "register">("login"); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [name, setName] = useState(""); const [showPwd, setShowPwd] = useState(false); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const goAfterAuth = (msg: string) => { toast(msg, "success", { href: meta.path, label: meta.label }); setTimeout(() => { router.replace(meta.path); }, 400); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(""); if (mode === "register") { if (!name.trim() || name.trim().length < 2) { setError(t.login.nameMin); return; } if (password.length < 6) { setError(t.login.pwdMin); return; } } setLoading(true); const ok = mode === "login" ? await login(email, password) : await register(email, password, name.trim()); setLoading(false); if (ok) { goAfterAuth( mode === "login" ? meta.welcomeToast : t.login.registerToast ); } else { setError(mode === "login" ? t.login.loginError : t.login.registerError); } }; const handleDemo = async () => { setLoading(true); const ok = await demoLogin(); setLoading(false); if (ok) goAfterAuth(t.login.demoToast); }; const headerHint = mode === "login" ? meta.hint : t.login.registerHint; return (
{headerHint}
{t.login.planMergeNote}
)}{t.login.redirectTo} {meta.label}
{meta.demoHint}
加载中…
}>