diff --git a/.cursor/work/loginpagework.md b/.cursor/work/loginpagework.md index 2327f7c..721afa2 100644 --- a/.cursor/work/loginpagework.md +++ b/.cursor/work/loginpagework.md @@ -1,4 +1,6 @@ -# 로그인 페이지 작업 리스트 -0. [x] 로그인 페이지 생성 -1. [ ] dffd -2. [ ] df df +1. 네비게이션바 + - +2. fo + - oter +2. 메인을 플렉스로 vertical방향으로 3개로 구분 + - \ No newline at end of file diff --git a/app/register/page.tsx b/app/register/page.tsx index 9a8a93f..0994a3f 100644 --- a/app/register/page.tsx +++ b/app/register/page.tsx @@ -10,6 +10,9 @@ export default function RegisterPage() { password: '', passwordConfirm: '', phone: '', + gender: 'male', + birthDate: '', + verificationCode: '', }); const [errors, setErrors] = useState({ @@ -18,6 +21,8 @@ export default function RegisterPage() { password: '', passwordConfirm: '', phone: '', + birthDate: '', + verificationCode: '', }); // 입력 필드 변경 핸들러 @@ -47,11 +52,11 @@ export default function RegisterPage() { return password.length >= 8 && /[a-zA-Z]/.test(password) && /[0-9]/.test(password); }; - // 전화번호 유효성 검사 + // 전화번호 유효성 검사 (하이픈 없이) const validatePhone = (phone: string) => { if (phone === '') return true; // 선택 항목 - const phoneRegex = /^010-\d{4}-\d{4}$/; - return phoneRegex.test(phone); + const phoneRegex = /^010\d{8}$/; + return phoneRegex.test(phone.replace(/[^\d]/g, '')); }; // 폼 제출 전 유효성 검사 @@ -101,7 +106,7 @@ export default function RegisterPage() { // 전화번호 검사 (선택 항목) if (formData.phone && !validatePhone(formData.phone)) { - newErrors.phone = '올바른 전화번호 형식이 아닙니다. (예: 010-1234-5678)'; + newErrors.phone = '올바른 전화번호 형식이 아닙니다. (예: 01012345678)'; isValid = false; } @@ -109,23 +114,38 @@ export default function RegisterPage() { return isValid; }; - // 전화번호 자동 포맷팅 + // 전화번호 자동 포맷팅 (하이픈 없이) const handlePhoneChange = (e: React.ChangeEvent) => { let value = e.target.value.replace(/[^\d]/g, ''); if (value.length > 11) value = value.slice(0, 11); - if (value.length > 7) { - value = value.slice(0, 3) + '-' + value.slice(3, 7) + '-' + value.slice(7); - } else if (value.length > 3) { - value = value.slice(0, 3) + '-' + value.slice(3); - } - setFormData((prev) => ({ ...prev, phone: value, })); }; + // 인증번호 전송 핸들러 + const handleSendVerificationCode = () => { + if (!formData.email || !validateEmail(formData.email)) { + setErrors((prev) => ({ + ...prev, + email: '올바른 이메일을 입력해주세요.', + })); + return; + } + // TODO: 인증번호 전송 API 호출 + alert('인증번호가 전송되었습니다.'); + }; + + // 생년월일 핸들러 + const handleBirthDateChange = (e: React.ChangeEvent) => { + setFormData((prev) => ({ + ...prev, + birthDate: e.target.value, + })); + }; + // 폼 제출 핸들러 const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -144,171 +164,241 @@ export default function RegisterPage() { formData.passwordConfirm !== ''; return ( -
-
- {/* 회원가입 카드 */} -
- {/* 제목 */} -

회원가입

+
+
+ {/* 제목 */} +
+

회원가입

+
- {/* 단계 표시 */} -
-
- 01 약관 동의 - > - - 02 회원정보입력 - - > - 03 회원가입완료 + {/* 단계 표시 */} +
+
+
+

01

+

약관 동의

+
+ > +
+

02

+

회원정보입력

+
+ > +
+

03

+

회원가입완료

+
- {/* 회원정보 입력 폼 */} -
- {/* 이름 */} -
- - - {errors.name && ( -

{errors.name}

- )} -
+ {/* 회원정보 입력 폼 */} + + {/* 이름 */} +
+ + + {errors.name && ( +

{errors.name}

+ )} +
- {/* 이메일 */} -
- + {/* 휴대폰 */} +
+ + + {errors.phone && ( +

{errors.phone}

+ )} +
+ + {/* 아이디(이메일) */} +
+ +
- {errors.email && ( -

{errors.email}

- )} -
- - {/* 비밀번호 */} -
- - - {errors.password && ( -

{errors.password}

- )} -
- - {/* 비밀번호 확인 */} -
- - - {errors.passwordConfirm && ( -

{errors.passwordConfirm}

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

{errors.phone}

- )} -
- - {/* 버튼 영역 */} -
- - 이전 단계 -
- -
+ {errors.email && ( +

{errors.email}

+ )} +
- {/* 카피라이트 */} -
- Copyright © 2025 XL LMS. All rights reserved -
+ {/* 비밀번호 */} +
+ + + {errors.password && ( +

{errors.password}

+ )} +
+ + {/* 비밀번호 확인 */} +
+ + + {errors.passwordConfirm && ( +

{errors.passwordConfirm}

+ )} +
+ + {/* 성별 */} +
+ +
+ + +
+
+ + {/* 생년월일 */} +
+ +
+ + + + +
+ {errors.birthDate && ( +

{errors.birthDate}

+ )} +
+ + {/* 버튼 영역 */} +
+ + 이전 + + +
+ +
+ + {/* 카피라이트 */} +
+

Copyright ⓒ 2025 XL LMS. All rights reserved

);