+
{/* 인증 메시지 처리 넣어줘야함 */}
(false);
const [idDuplicateMessage, setidDuplicateMessage] = useState('');
const [messageColor, setMessageColor] = useState('');
+ const [userIdValidationMessages, setUserIdValidationMessages] = useState([]);
+ const [passwordValidationMessages, setPasswordValidationMessages] = useState([]);
//재가입을 위한 유저 이메일 체크용 상태관리에서 이메일 받아오기
const email = useSignupStore(state => state.email);
+
const userId = useSignupStore(state => state.userId);
const setuserId = useSignupStore(state => state.setuserId);
const password = useSignupStore(state => state.password);
@@ -286,10 +427,12 @@ export function SignupStep2() {
validateField(name, value);
if (name === 'userId') {
setuserId(value); // userId만 업데이트
+ validateUserId(value);
setidDuplicateMessage(''); // userId가 변경되면 중복 메시지 초기화
setCanUseId(false); // userId가 변경되면 중복 확인 여부 초기화화
} else if (name === 'password') {
setpassword(value); // password만 업데이트
+ validatePassword(value);
}
};
@@ -311,17 +454,17 @@ export function SignupStep2() {
if (response.data === true) {
setCanUseId(false);
setidDuplicateMessage('This ID is already exist');
- setMessageColor('text-red-500');
+ setMessageColor('red');
}
else {
setCanUseId(true);
- setidDuplicateMessage('This ID is available');
- setMessageColor('text-green-500');
+ setidDuplicateMessage('✓ This ID is available');
+ setMessageColor('green');
}
}).catch(function () {
setCanUseId(false);
setidDuplicateMessage('Failed to check ID');
- setMessageColor('text-red-500');
+ setMessageColor('red');
});
}
@@ -347,6 +490,73 @@ export function SignupStep2() {
router.push('/signup/step3');
}
+ const validateUserId = (value: string) => {
+ const messages: string[] = [];
+
+ // 1. 최소 4자 이상, 최대 20자 이하
+ if (value.length < 4 || value.length > 20) {
+ messages.push('User ID must be between 4 and 20 characters.');
+ } else {
+ messages.push('✓ User ID length is valid.');
+ }
+
+ // 2. 숫자로 시작하지 않음
+ if (/^\d/.test(value)) {
+ messages.push('User ID cannot start with a number.');
+ } else {
+ messages.push('✓ User ID does not start with a number.');
+ }
+
+ // 3. 알파벳 포함
+ if (!/[a-zA-Z]/.test(value)) {
+ messages.push('User ID must contain at least one letter.');
+ } else {
+ messages.push('✓ User ID contains a letter.');
+ }
+
+ // 4. 문자와 숫자만 포함
+ if (!/^[a-zA-Z0-9]+$/.test(value)) {
+ messages.push('User ID can only contain letters and numbers.');
+ } else {
+ messages.push('✓ User ID contains only letters and numbers.');
+ }
+
+ setUserIdValidationMessages(messages);
+ };
+ const validatePassword = (value: string) => {
+ const messages: string[] = [];
+
+ // 1. 최소 8자 이상, 최대 20자 이하
+ if (value.length < 8 || value.length > 20) {
+ messages.push('Password must be between 8 and 20 characters.');
+ } else {
+ messages.push('✓ Password length is valid.');
+ }
+
+ // 2. 알파벳 포함
+ if (!/[a-zA-Z]/.test(value)) {
+ messages.push('Password must contain at least one letter.');
+ } else {
+ messages.push('✓ Password contains a letter.');
+ }
+
+ // 3. 숫자 포함
+ if (!/\d/.test(value)) {
+ messages.push('Password must contain at least one number.');
+ } else {
+ messages.push('✓ Password contains a number.');
+ }
+
+ // 4. 특수문자 포함
+ if (!/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
+ messages.push('Password must contain at least one special character.');
+ } else {
+ messages.push('✓ Password contains a special character.');
+ }
+
+ setPasswordValidationMessages(messages);
+ };
+
return (
@@ -370,9 +580,18 @@ export function SignupStep2() {