"use client"; import { useEffect, useMemo } 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 { useI18n } from "@/i18n/provider"; 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"; function createChangePasswordSchema(t: (key: string) => string) { return z .object({ password: z.string().trim().min(1, t("account.passwordRequired")), confirmPassword: z.string().trim().min(1, t("account.confirmPasswordRequired")), }) .refine((data) => data.password === data.confirmPassword, { path: ["confirmPassword"], message: t("account.passwordMismatch"), }); } type ChangePasswordForm = { password: string; confirmPassword: string; }; const emptyForm: ChangePasswordForm = { password: "", confirmPassword: "", }; type ChangePasswordDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; onSuccess: () => Promise; }; export function ChangePasswordDialog({ open, onOpenChange, onSuccess, }: ChangePasswordDialogProps) { const t = useI18n(); const changePasswordSchema = useMemo(() => createChangePasswordSchema(t), [t]); const changePasswordResolver = useMemo( () => zodResolver(changePasswordSchema as never) as Resolver< z.input, undefined, z.output >, [changePasswordSchema], ); 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(t("account.passwordChanged")); onOpenChange(false); await onSuccess(); } catch (error) { toast.error(error instanceof Error ? error.message : t("account.changePasswordFailed")); } } return ( } >
{t("account.newPassword")} {t("account.confirmPassword")}
); }