"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { updatePassword } from "@/features/auth/actions"; import { resetPasswordSchema, type ResetPasswordFormData, } from "@/features/auth/schemas/auth-schema"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { InlineSpinner } from "@/components/ui/loading-spinner"; import { useState } from "react"; const DEFAULT_ERROR_MESSAGE = "알 수 없는 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."; export default function ResetPasswordForm() { const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [serverError, setServerError] = useState(""); const { register, handleSubmit, formState: { errors }, watch, } = useForm({ resolver: zodResolver(resetPasswordSchema), mode: "onBlur", }); const password = watch("password"); const confirmPassword = watch("confirmPassword"); const onSubmit = async (data: ResetPasswordFormData) => { setServerError(""); setIsLoading(true); try { const formData = new FormData(); formData.append("password", data.password); const result = await updatePassword(formData); if (result?.ok) { const message = encodeURIComponent(result.message); router.replace(`/login?message=${message}`); return; } setServerError(result?.message || DEFAULT_ERROR_MESSAGE); } catch (error) { console.error("Password reset error:", error); setServerError(DEFAULT_ERROR_MESSAGE); } finally { setIsLoading(false); } }; return (
{serverError && (
{serverError}
)}

8자 이상, 대문자/소문자/숫자/특수문자를 각 1개 이상 포함해야 합니다.

{errors.password && (

{errors.password.message}

)}
{confirmPassword && password !== confirmPassword && !errors.confirmPassword && (

비밀번호가 일치하지 않습니다.

)} {confirmPassword && password === confirmPassword && !errors.confirmPassword && (

비밀번호가 일치합니다.

)} {errors.confirmPassword && (

{errors.confirmPassword.message}

)}
); }