"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { KeyRound } from "lucide-react"; import { apiOperations } from "@/lib/api"; export default function ResetPasswordPage() { const [enabled, setEnabled] = useState(false); const [email, setEmail] = useState(""); const [code, setCode] = useState(""); const [password, setPassword] = useState(""); const [busy, setBusy] = useState(false); const [sending, setSending] = useState(false); const [error, setError] = useState(""); const [message, setMessage] = useState(""); useEffect(() => { apiOperations<{ password_reset: boolean }>("/api/site-state") .then((s) => setEnabled(s.password_reset)) .catch(() => setError("暂时无法读取站点状态")); }, []); async function sendCode() { if (sending || !email) return; setSending(true); setError(""); setMessage(""); try { const r = await apiOperations<{ message: string }>("/api/auth/code", "POST", { email, purpose: "reset", }); setMessage(r.message); } catch (e) { setError((e as Error).message); } finally { setSending(false); } } async function resetPassword(e: React.FormEvent) { e.preventDefault(); if (busy) return; setBusy(true); setError(""); setMessage(""); try { const r = await apiOperations<{ message: string }>("/api/auth/reset-password", "POST", { email, code, password, }); setMessage(r.message); } catch (err) { setError((err as Error).message); } finally { setBusy(false); } } return (

找回密码

通过邮箱验证码重置登录密码

{error && (
{error}
)} {!enabled ? (

站点暂未开放邮件找回密码。

) : ( <>
setEmail(e.target.value)} autoComplete="email" placeholder="you@example.com" />
setCode(e.target.value)} required autoComplete="one-time-code" inputMode="numeric" placeholder="6 位验证码" />
setPassword(e.target.value)} placeholder="至少 6 位" />
)} {message && (

{message}

)}

返回登录

); }