choigirang / why-chat

아왜진 커뮤니티 미니 프로젝트
https://fe.why-chat.site
0 stars 0 forks source link

비밀번호 유효성 검사 #26

Open choigirang opened 10 months ago

choigirang commented 6 months ago
export default function Password({ checkPass, setCheckPass }: PasswordProps) {
  const [pass, setPass] = useState({
    firstPass: '',
    secondPass: '',
    length: false,
    word: false,
    validation: false,
  });

  // 비밀번호 입력 이벤트
  const checkPassHandler = (event: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = event.target;

    if (name === 'firstPass') {
      setPass(prev => ({ ...prev, firstPass: value }));

      // 비밀번호 길이
      if (value.length >= 8 && value.length <= 20) setPass(prev => ({ ...prev, length: true }));
      else setPass(prev => ({ ...prev, length: false }));

      const check = /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+])[A-Za-z\d!@#$%^&*()_+]+$/;

      // 비밀번호 유효성
      if (check.test(value)) setPass(prev => ({ ...prev, word: true }));
      else setPass(prev => ({ ...prev, word: false }));
    }

    if (name === 'secondPass') {
      setPass(prev => ({ ...prev, secondPass: value }));

      if (pass.firstPass === value) {
        setPass(prev => ({ ...prev, validation: true }));
        setCheckPass({ pass: value, required: true });
      } else {
        setPass(prev => ({ ...prev, validation: false }));
        setCheckPass(prev => ({ ...prev, required: false }));
      }
    }
  };

  return (
    <PassContainer>
      <Label htmlFor="pass">비밀번호</Label>
      <PassBox className="pass-box">
        <input
          id="pass"
          type="password"
          name="firstPass"
          placeholder="비밀번호를 입력해주세요."
          onChange={checkPassHandler}
          required
          autoComplete="new-password"
        />
        <input
          type="password"
          placeholder="비밀번호를 다시 입력해주세요."
          name="secondPass"
          onChange={checkPassHandler}
          required
          autoComplete="new-password"
        />
        <OptionBox>
          <TextBox>
            <SmallTitle>비밀번호 필수 조건</SmallTitle>
            <NeedOption word={pass.word} length={pass.length} validation={pass.validation}>
              <AiFillCheckCircle className="word" />
              <span className="word">대소문자, 숫자, 특수문자 조합이어야 합니다.</span>
            </NeedOption>
            <NeedOption>
              <AiFillCheckCircle className="length" />
              <span className="length">8 ~ 20 글자입니다.</span>
            </NeedOption>
            <NeedOption>
              <AiFillCheckCircle className="validation" />
              <span className="validation">1차,2차 비밀번호가 일치해야 합니다.</span>
            </NeedOption>
          </TextBox>
        </OptionBox>
      </PassBox>
    </PassContainer>
  );
}