: 소문자, 대문자, 숫자로만 이루어진 1자에서 10자까지의 문자열을 검증
const regex = /^[a-zA-Z0-9]{1,10}$/;
: 유효한 이메일 주소 형식을 검증하는 정규표현식
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
: 숫자와 특수문자를 포함한 최소 8자 이상의 문자열을 검증
const regex = /^(?=.*\d)(?=.*[!@#$%^&*])[a-zA-Z\d!@#$%^&*]{8,}$/;
const validation = {
name: (text: string) => {
const regex = /^[a-zA-Z0-9]{1,10}$/;
if (text === "") return "이름을 입력해주세요.";
if (text.length < 2) return "이름은 2글자 이상이어야 합니다.";
if (text.length > 10) return "이름은 최대 10자까지 입력 할 수 있습니다.";
if (!regex.test(text))
return "이름에는 특수문자나 공백이 포함될 수 없습니다.";
return;
},
email: (text: string) => {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (text === "") return "이메일을 입력해주세요.";
if (!regex.test(text)) return "유효한 이메일 주소를 입력하세요.";
return;
},
password: (pass: string, confirmPass: string) => {
const regex = /^(?=.*\d)(?=.*[!@#$%^&*])[a-zA-Z\d!@#$%^&*]{8,}$/;
if (pass === "") return "비밀번호를 입력해주세요.";
if (!regex.test(pass))
return "비밀번호는 숫자와 특수문자를 포함해야 하며, 최소 8자 이상이어야 합니다.";
if (confirmPass !== undefined && pass !== confirmPass)
return "비밀번호가 일치하지 않습니다.";
return;
},
validate 함수를 사용하여 입력 필드 별 에러 메시지를 반환하는 커스텀 훅을 생성함.
입력 필드의 값이 변경될 때마다 유효성 검사를 수행하고, 그 결과를 상태로 관리하여 반환함.
import { validate } from "@/utils/validate";
import { useEffect, useState } from "react";
type Props = {
name: string;
email: string;
password: string;
confirmPassword: string;
};
export function useErrorMessage({
name,
email,
password,
confirmPassword,
}: Props) {
const [nameError, setNameError] = useState<string | null>(null);
const [emailError, setEmailError] = useState<string | null>(null);
const [passwordError, setPasswordError] = useState<string | null>(null);
const [confirmPasswordError, setConfirmPasswordError] = useState<
string | null
>(null);
useEffect(() => {
const timer = setTimeout(() => {
setNameError(name ? validate.name(name) : null);
setEmailError(email ? validate.email(email) : null);
setPasswordError(password ? validate.password(password) : null);
setConfirmPasswordError(
confirmPassword
? validate.confirmPassword(password, confirmPassword)
: null
);
}, 500);
return () => clearTimeout(timer);
}, [name, email, password, confirmPassword]);
return {
nameError,
emailError,
passwordError,
confirmPasswordError,
setEmailError,
};
}