"use client" import { Button } from "@/components/ui/button" import { IconInput } from "@/components/ui/icon-input" import { Label } from "@/components/ui/label" import { resetPassword, sendForgotPasswordCode } from "@/lib/api" import { toApiError } from "@/lib/errors" import { notifyInfo, notifySuccess } from "@/lib/toast" import { standardSchemaResolver } from "@hookform/resolvers/standard-schema" import { KeyRound, Lock, Mail } from "lucide-react" import Link from "next/link" import { useRouter } from "next/navigation" import { useEffect, useState } from "react" import { useForm } from "react-hook-form" import { z } from "zod" const forgotSchema = z .object({ email: z.string().email("请输入正确的邮箱地址"), vcode: z.string().min(6, "验证码至少6位"), newPassword: z.string().min(8, "密码至少8位"), confirmPassword: z.string(), }) .refine((data) => data.newPassword === data.confirmPassword, { message: "两次输入的密码不一致", path: ["confirmPassword"], }) export default function ForgotPasswordPage() { const router = useRouter() const [countdown, setCountdown] = useState(0) const { register, handleSubmit, getValues, trigger, formState: { errors, isSubmitting }, } = useForm({ resolver: standardSchemaResolver(forgotSchema), }) useEffect(() => { if (countdown <= 0) return const timer = setInterval(() => setCountdown((c) => c - 1), 1000) return () => clearInterval(timer) }, [countdown]) const handleSendCode = async () => { const isValid = await trigger("email") if (!isValid) return try { const email = getValues("email") await sendForgotPasswordCode(email) setCountdown(60) notifySuccess("验证码已发送到你的邮箱") } catch (err) { notifyInfo(toApiError(err).msg) } } const onSubmit = async (data: z.infer) => { try { await resetPassword({ email: data.email, vcode: data.vcode, newPassword: data.newPassword }) notifySuccess("密码已重置") router.push("/login") } catch (err) { notifyInfo(toApiError(err).msg) } } return ( <>

找回密码

输入注册邮箱和新密码进行重置

} type="email" placeholder="输入注册邮箱" {...register("email")} /> {errors.email && (

{errors.email.message as string}

)}
} placeholder="输入6位验证码" {...register("vcode")} />
{errors.vcode && (

{errors.vcode.message as string}

)}
} type="password" placeholder="输入新密码" {...register("newPassword")} /> {errors.newPassword && (

{errors.newPassword.message as string}

)}
} type="password" placeholder="再次输入新密码" {...register("confirmPassword")} /> {errors.confirmPassword && (

{errors.confirmPassword.message as string}

)}

想起密码了?{" "} 返回登录

) }