"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { signUp, type SignUpData } from "@/lib/services"; // 비밀번호 검증 함수 (영문/숫자 포함 8자 이상) const validatePassword = (password: string): boolean => { const hasLetter = /[A-Za-z]/.test(password); const hasNumber = /\d/.test(password); const isLongEnough = password.length >= 8; return hasLetter && hasNumber && isLongEnough; }; const SignUpForm = () => { const { register, handleSubmit, watch, setError, formState: { errors, isSubmitting }, } = useForm({ mode: "onChange", defaultValues: { userId: "", userPassword: "", userCheckPassword: "", userName: "", userPhone: "", authCode: "", }, }); const password = watch("userPassword"); const [submitError, setSubmitError] = useState(null); const router = useRouter(); const onSubmit = async (data: SignUpData) => { setSubmitError(null); try { await signUp(data); // 회원가입 성공 alert("회원가입이 완료되었습니다. 로그인해주세요."); router.push("/login"); } catch (err) { const errorMessage = err instanceof Error ? err.message : "회원가입에 실패했습니다."; // 아이디 중복 에러 if (errorMessage.includes("아이디")) { setError("userId", { type: "manual", message: errorMessage, }); } // 전화번호 중복 에러 else if (errorMessage.includes("전화번호")) { setError("userPhone", { type: "manual", message: errorMessage, }); } // 기타 에러 else { setSubmitError(errorMessage); } } }; return (
{/* 아이디 */}
{errors.userId && (

{errors.userId.message}

)}
{/* 비밀번호 */}
validatePassword(value) || "영문과 숫자를 포함하여 8자 이상 입력해주세요", }, })} disabled={isSubmitting} placeholder="영문/숫자 포함 8자 이상" className={`w-full h-12 px-4 py-3 bg-gray-50 border rounded-xl focus:outline-none focus:ring-2 focus:border-transparent disabled:opacity-50 transition-all ${ errors.userPassword ? "border-red-300 focus:ring-red-400" : "border-gray-200 focus:ring-[#6b95c6]" }`} /> {errors.userPassword && (

{errors.userPassword.message}

)}
{/* 비밀번호 확인 */}
value === password || "비밀번호가 일치하지 않습니다", }, })} disabled={isSubmitting} placeholder="비밀번호를 다시 입력해주세요" className={`w-full h-12 px-4 py-3 bg-gray-50 border rounded-xl focus:outline-none focus:ring-2 focus:border-transparent disabled:opacity-50 transition-all ${ errors.userCheckPassword ? "border-red-300 focus:ring-red-400" : "border-gray-200 focus:ring-[#6b95c6]" }`} /> {errors.userCheckPassword && (

{errors.userCheckPassword.message}

)}
{/* 이름 */}
{errors.userName && (

{errors.userName.message}

)}
{/* 전화번호 */}
{errors.userPhone && (

{errors.userPhone.message}

)}
{/* 승인번호 */}
{errors.authCode && (

{errors.authCode.message}

)}
{/* 제출 에러 메시지 */} {submitError && (
{submitError}
)} {/* 로그인 페이지로 */}
이미 계정이 있으신가요? 로그인
{/* 홈으로 돌아가기 */} ← 홈으로 돌아가기
); }; export default SignUpForm;