import { useState, useCallback } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { toast } from "sonner"; const resetSchema = z.object({ email: z .string() .min(1, "이메일을 입력해주세요.") .email("올바른 이메일 형식을 입력해주세요."), }); type ResetForm = z.infer; interface Props { open: boolean; onClose: () => void; } export default function ResetPasswordModal({ open, onClose }: Props) { const [shakeFields, setShakeFields] = useState>(new Set()); const { register, handleSubmit, reset, formState: { errors }, } = useForm({ resolver: zodResolver(resetSchema), }); const triggerShake = useCallback((fieldNames: string[]) => { setShakeFields(new Set(fieldNames)); setTimeout(() => setShakeFields(new Set()), 400); }, []); /* 유효성 통과 → 발송 처리 */ const onSubmit = (_data: ResetForm) => { // TODO: API 연동 reset(); onClose(); toast.success("임시 비밀번호가 발송되었습니다."); }; /* 유효성 실패 → shake */ const onError = (fieldErrors: typeof errors) => { triggerShake(Object.keys(fieldErrors)); }; /* 닫기 */ const handleClose = () => { reset(); onClose(); }; if (!open) return null; return (
{ if (e.target === e.currentTarget) handleClose(); }} >
{/* 헤더 */}

비밀번호 재설정

가입하신 이메일 주소를 입력하시면 임시 비밀번호를 보내드립니다.

{/* 폼 */}
{errors.email && (
error {errors.email.message}
)}
{/* 버튼 */}
{/* 풋터 */}

도움이 필요하신가요?{" "}

); }