// src/app/signup/page.tsx 'use client'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { useRouter } from 'next/navigation'; import { signup, verifyEmail } from '@/api/auth'; import { SignupRequest } from '@/types'; import Link from 'next/link'; export default function SignupPage() { const router = useRouter(); const [step, setStep] = useState<'FORM' | 'VERIFY'>('FORM'); // 단계 관리 const [loading, setLoading] = useState(false); const [registeredEmail, setRegisteredEmail] = useState(''); // 인증할 이메일 저장 // React Hook Form 설정 const { register, handleSubmit, formState: { errors }, watch } = useForm(); const [verifyCode, setVerifyCode] = useState(''); // 1단계: 회원가입 정보 제출 const onSignupSubmit = async (data: SignupRequest) => { setLoading(true); try { const res = await signup(data); if (res.code === 'SUCCESS') { alert(`📧 ${data.email}로 인증 코드를 보냈습니다!`); setRegisteredEmail(data.email); // 이메일 기억하기 setStep('VERIFY'); // 2단계로 이동 } else { alert('회원가입 실패: ' + res.message); } } catch (error: any) { alert('오류 발생: ' + (error.response?.data?.message || error.message)); } finally { setLoading(false); } }; // 2단계: 인증 코드 제출 const onVerifySubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!verifyCode) return alert('인증 코드를 입력해주세요.'); setLoading(true); try { const res = await verifyEmail({ email: registeredEmail, code: verifyCode }); if (res.code === 'SUCCESS') { alert('✅ 인증되었습니다! 로그인 페이지로 이동합니다.'); router.push('/login'); } else { alert('인증 실패: ' + res.message); } } catch (error: any) { alert('오류 발생: ' + (error.response?.data?.message || error.message)); } finally { setLoading(false); } }; return (
{/* 헤더 */}

회원가입 🚀

{step === 'FORM' ? '정보를 입력하고 인증 메일을 받으세요.' : '이메일로 전송된 6자리 코드를 입력하세요.'}

{/* STEP 1: 가입 정보 입력 폼 */} {step === 'FORM' && (
{errors.email &&

{errors.email.message}

}
{errors.nickname &&

{errors.nickname.message}

}
{errors.password &&

{errors.password.message}

}
)} {/* STEP 2: 인증 코드 입력 폼 */} {step === 'VERIFY' && (
setVerifyCode(e.target.value)} maxLength={6} className="w-full px-4 py-3 rounded-lg border border-gray-300 focus:ring-2 focus:ring-blue-500 outline-none text-center text-2xl tracking-widest" placeholder="000000" />
)} {/* 하단 링크 */}
이미 계정이 있으신가요?{' '} 로그인하기
); }