Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[손재헌] sprint4 #106

Conversation

Jaeheon96
Copy link
Collaborator

요구사항

기본

  • 이메일 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 “이메일을 입력해주세요.” 빨강색 에러 메세지를 보입니다.
  • 이메일 input에서 focus out 할 때, 이메일 형식에 맞지 않는 경우 input에 빨강색 테두리와 아래에 “잘못된 이메일 형식입니다” 빨강색 에러 메세지를 보입니다.
  • 닉네임 input에서 focus out 할 때, 값이 없을 경우 input에 빨강색 테두리와 아래에 “닉네임을 입력해주세요.” 빨강색 에러 메세지를 보입니다.
  • 비밀번호 input에서 focus out 할 때, 값이 없을 경우 아래에 “비밀번호를 입력해주세요.” 에러 메세지를 보입니다
  • 비밀번호 input에서 focus out 할 때, 값이 8자 미만일 경우 아래에 “비밀번호를 8자 이상 입력해주세요.” 에러 메세지를 보입니다.
  • 비밀번호 input과 비밀번호 확인 input의 값이 다른 경우, 비밀번호 확인 input 아래에 “비밀번호가 일치하지 않습니다..” 에러 메세지를 보입니다.
  • input 에 빈 값이 있거나 에러 메세지가 있으면 ‘로그인’ 버튼은 비활성화 됩니다.
  • input 에 유효한 값을 입력하면 ‘로그인' 버튼이 활성화 됩니다.
  • 활성화된 ‘로그인’ 버튼을 누르면 “/items” 로 이동합니다
  • input 에 빈 값이 있거나 에러 메세지가 있으면 ‘회원가입’ 버튼은 비활성화 됩니다.
  • input 에 유효한 값을 입력하면 ‘회원가입' 버튼이 활성화 됩니다.
  • 활성화된 ‘회원가입’ 버튼을 누르면 “/signup” 로 이동합니다

심화

  • 눈 모양 아이콘 클릭시 비밀번호의 문자열이 보이기도 하고, 가려지기도 합니다.
  • 비밀번호의 문자열이 가려질 때는 눈 모양 아이콘에는 사선이 그어져있고, 비밀번호의 문자열이 보일 때는 사선이 없는 눈 모양 아이콘이 보이도록 합니다.

주요 변경사항

  • 각 input 요구사항이 만족되지 않으면 에러 메시지가 보여집니다.
  • 요구사항이 만족되지 않은 input의 테두리에 붉은 외곽선이 보여집니다.
  • 요구사항을 만족한 input의 테두리에 푸른 외곽선이 보여집니다.
  • 모든 input이 적절하게 채워지지 않으면 버튼은 disabled 상태가 됩니다.
  • 더 나은 사용감을 위해 focusout 만이 아니라 input 이벤트 발생시마다 콜백이 실행됩니다.

멘토에게

  • 처음 pr 드립니다. 잘부탁드립니다.
  • 이메일 유효성 검사를 구글링해서 찾은 문자열 검사 방법으로 하는데 더 나은 방법이 있는지 궁금합니다.
  • netlify 배포 링크: https://sprintpanda.netlify.app/
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

손재헌 added 7 commits June 10, 2024 23:47
- Verifying password now doesn't show error when it's empty.
- And it's now working responsively to password input.
- Changed the <form> tag in login and signup htmls into <div> with
  'pseudo-form' class to make the button work as intended.
@Jaeheon96 Jaeheon96 requested a review from wlgns2223 June 13, 2024 15:01
@Jaeheon96 Jaeheon96 added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jun 13, 2024
</header>
<main>
<div class="container">
<form>
<label for="email">이메일</label>
<div class="pseudo-form">
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기는 가짜 폼태그보다 진짜 폼태그를 써주는게 어떨까요?

Suggested change
<div class="pseudo-form">
<form class="signup-form">

Comment on lines +17 to +23
<label for="email">
이메일
<span class="email-empty error-message hidden">이메일을 입력해주세요.</span>
<span class="email-wrong-format error-message hidden">잘못된 이메일 형식입니다.</span>
</label>
<input id="email" name="email" class="text-input" placeholder="이메일을 입력해주세요">
<label for="password">비밀번호</label>

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제 생각에는 에러메세지는 의미적으로 라벨과 상관이 없다고 생각합니다.

재헌님께서 에러메세지를 position: absolute로 선언하고 라벨을 position: relative를 선언 해 줌으로서 에러메세지 위치를 잡으려고 라벨안에 두신것 같은데 이러한 의도가 맞을까요?

그렇다면 라벨과 인풋을 div로 감싸는 마크업을 더 낫다고 생각이 듭니다.

<div>
            <label for="email"> 이메일 </label>
            <input
              id="email"
              name="email"
              class="text-input"
              placeholder="이메일을 입력해주세요"
            />
            <span class="email-empty error-message hidden"
              >이메일을 입력해주세요.</span
            >
            <span class="email-wrong-format error-message hidden"
              >잘못된 이메일 형식입니다.</span
            >
</div>

Comment on lines +20 to +21
if (btn.classList.contains('login')) btn.addEventListener('click', () => { btnLink(loginButtonLink) });
else if (btn.classList.contains('signup')) btn.addEventListener('click', () => { btnLink(signupButtonLink) });
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

버튼 관련 로직을 재사용 또는 통일 시키려고 하신 노력이 보이시는것 같네요.

제 생각에는 signupEventHandler 자바스크립트 파일에는 회원가입에 관한 로직만 있는게 더 좋다고 생각합니다. 그러나 20번줄을 보면 로그인 버튼 관련 로직이 있는 것 같네요. 로그인 버튼 로직은 로그인 자바스크립트 파일에 작성해주시는게 더 좋습니다.

로직이 다른 파일에 섞이게되면 이게 스노우볼이 되어서 나중에는 관리가 힘들어진다고 생각합니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

function btnLink(ref) {
    location.href = ref;
}

export { btnLink }

btnLink의 구현체인데, 이정도로 짧은 코드는 화살표함수를 써서 인라인으로 구현하는게 어떨까요?

Comment on lines +42 to +43
form.addEventListener('focusout', eventFunctionsPackage);
form.addEventListener('input', eventFunctionsPackage);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분이 요구사항과 맞지 않는 부분이 있는 것 같습니다.
요구사항에서는 focus out일때 validation을 하도록 안내가 되어있습니다.
하지만 지금 코드에서는 focus out 및 유저가 타이핑을 하는 매순간 마다 validation이 진행되고 있습니다.

focus out일때 validation을 진행하고 input 입력중일때는 에러메세지를 없애는 로직으로
focus out의 로직과 input 이벤트의 로직을 분리하는게 어떨까요?

실무에서는 재헌님이 하신 방법도 UX를 고려해서 사용하는 방법이긴 합니다만 스프린트 미션에서는 요구사항이 명시되어있어서 우선 그것을 따르는게 맞는것 같아요 ㅎㅎ

Comment on lines +6 to +9
function isCorrectEmailFormat(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정규 표현식을 사용하신점도 좋았고 테스트하는 로직을 함수로 감싸주신점도 잘 하셨습니다 !

const passwordEmptyMessage = document.querySelector('.password-empty');
const passwordWrongFormatMessage = document.querySelector('.password-wrong-format');

const isLongEnough = (str) => str.length >= 8;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로직을 이해하기 쉽게 함수로 빼신 점 잘 하셨습니다 !

validChecklist.every((e) => e === true)
? btn.classList.add('valid')
: btn.classList.remove('valid');
const isValid = [...inputs].every(e => !e.classList.contains('errored')) && filledInputCheck(); // 모든 input에 errored 클래스가 없다 && 모든 input에 값이 있다
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

every 메서드를 사용하신 점 잘하셨습니다 !

@wlgns2223
Copy link
Collaborator

이메일 유효성 검사를 구글링해서 찾은 문자열 검사 방법으로 하는데 더 나은 방법이 있는지 궁금합니다.

정규표현식을 사용하셨는데 이 방법을 많이 씁니다.

저는 실무에서 요구사항이 따로 없다면 form 태그가 제공하는 client side validation 방법을 사용합니다.
코드를 안쓰고도 form 태그가 어느정도 검증을 해주긴 합니다.

https://developer.mozilla.org/en-US/docs/Learn/Forms/Form_validation

@wlgns2223
Copy link
Collaborator

스프린트 미션 4 수고 하셨습니다.
특히 폼 요소 검증에 동일한 로직을 사용해주셔서 하나만 이해하면 나머지는 이해하기 쉬운점이 좋았습니다 !

@wlgns2223 wlgns2223 merged commit 8d7ae98 into codeit-bootcamp-frontend:Basic-손재헌 Jun 14, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants