"use client"; import { useEffect } from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { Resolver, useForm } from "react-hook-form"; import { z } from "zod/v4"; import { toast } from "sonner"; import { changeSelfPassword } from "@/lib/api/admin"; import { Button } from "@/components/ui/button"; import { Field, FieldContent, FieldError, FieldLabel, } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { ProjectDialog } from "@/components/project-dialog"; const changePasswordSchema = z .object({ password: z.string().trim().min(1, "新密码不能为空"), confirmPassword: z.string().trim().min(1, "确认密码不能为空"), }) .refine((data) => data.password === data.confirmPassword, { path: ["confirmPassword"], message: "两次输入的密码不一致", }); type ChangePasswordForm = z.infer; const changePasswordResolver = zodResolver( changePasswordSchema as never, ) as Resolver< z.input, undefined, z.output >; const emptyForm: ChangePasswordForm = { password: "", confirmPassword: "", }; type ChangePasswordDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; onSuccess: () => Promise; }; export function ChangePasswordDialog({ open, onOpenChange, onSuccess, }: ChangePasswordDialogProps) { const form = useForm< z.input, undefined, z.output >({ resolver: changePasswordResolver, defaultValues: emptyForm, }); const { handleSubmit, register, reset, formState: { errors, isSubmitting }, } = form; useEffect(() => { if (open) { reset(emptyForm); } }, [open, reset]); async function onSubmit(values: ChangePasswordForm) { try { await changeSelfPassword(values.password.trim()); toast.success("密码已修改,请重新登录"); onOpenChange(false); await onSuccess(); } catch (error) { toast.error(error instanceof Error ? error.message : "修改密码失败"); } } return ( } >
新密码 确认密码
); }