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

Feat: #5 회원가입 페이지 생성 및 Validation 작성 #37

Merged
merged 21 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
12554da
Feat: #5 회원가입 페이지 생성 및 마크업, CSS 스타일링
Yoonyesol Jun 17, 2024
d758f80
Feat: #5 회원가입 입력 데이터 유효성 검사 기능 추가
Yoonyesol Jun 17, 2024
5517b4b
Design: #5 회원가입 페이지 스타일링 변경 및 프로필 이미지 설정 , 삭제 기능 추가
Yoonyesol Jun 17, 2024
23cf695
Design: #5 tailwind 커스텀에 맞게 회원가입 페이지 스타일링 변경
Yoonyesol Jun 22, 2024
99bd536
Design: #5 react-icons 아이콘 추가
Yoonyesol Jun 22, 2024
32c9850
Feat: #27 로그인 페이지 작성
Yoonyesol Jun 22, 2024
54630e1
design: 수정된 회원가입 폼으로 UI 수정, 비밀번호 보이기 및 숨김 기능 추가
Yoonyesol Jun 29, 2024
393ba68
Design: #27 수정된 로그인 폼으로 UI 수정
Yoonyesol Jun 29, 2024
3f771ba
Formatting: #5 유저관련폼 중복 처리 및 회원가입 폼 변수명 수정
Yoonyesol Jun 30, 2024
52cca55
refactor: 공통 유효성 인증 input 컴포넌트 적용 및 회원가입 폼 디자인 수정사항 반영
Yoonyesol Jul 3, 2024
02eaa76
Merge branch 'develop' of https://github.com/GU-99/grow-up-fe into fe…
Yoonyesol Jul 3, 2024
fb66247
feat: 링크 갯수 제한 기능 추가
Yoonyesol Jul 3, 2024
1616be5
UI: #5 로직에 따른 아이콘 등록 수정
Yoonyesol Jul 3, 2024
8d34d71
UI: #5 버튼 라운드 값 수정
Yoonyesol Jul 3, 2024
dd56760
UI: #5 리뷰 반영 디자인 수정
Yoonyesol Jul 6, 2024
9929f00
Chore: 정규식 수정 및 eslint 수정
Yoonyesol Jul 6, 2024
a3d0c13
Refactor: #5 회원가입 폼에서 유효성 검증 규칙 분리
Yoonyesol Jul 6, 2024
76172b0
Formatting: #5 타입 변수명 컨벤션 지정에 따른 타입 변수명 변경
Yoonyesol Jul 8, 2024
ee5dfea
Feat: #5 비밀번호 정규식에 특수기호 추가
Yoonyesol Jul 8, 2024
12ad055
UI: #5 필수 입력필드 체크 UI 수정
Yoonyesol Jul 8, 2024
96e9c8d
UI: #5 input 필드에 sup 태그 적용 및 flex-grow -> grow 수정, form의 noValidate 속…
Yoonyesol Jul 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ module.exports = {
'import/extensions': 'off',
'jsx-a11y/no-noninteractive-element-interactions': 'warn',
'vitest/valid-title': 'off',
'react/jsx-props-no-spreading': 'off',
Copy link
Contributor

Choose a reason for hiding this comment

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

해당 옵션 33번 라인에도 똑같이 설정되어 있어서 삭제하시는게 좋을 것 같아요!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

그러네요 왜 두 번이나 들어갔지?😳 삭제해 두겠습니다!

},
ignorePatterns: [
'dist',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"react-hook-form": "^7.51.4",
"react-icons": "^5.2.1",
"react-router-dom": "^6.23.1",
"tailwind-scrollbar-hide": "^1.1.7",
"zustand": "^4.5.2"
},
"devDependencies": {
Expand Down
8 changes: 8 additions & 0 deletions src/assets/auth_logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions src/assets/social_google_icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions src/assets/social_kakao_icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
100 changes: 100 additions & 0 deletions src/components/common/ValidationInput.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import { useState } from 'react';
import { UseFormRegisterReturn } from 'react-hook-form';
import { RiEyeFill, RiEyeOffFill } from 'react-icons/ri';

/**
* ValidationInput 컴포넌트 params, 모든 params는 optional
*
* @params {string} [label] - 입력 필드의 label 텍스트
* @params {string} [errors] - 유효성 검증 후 오류 발생 시 표시할 오류 메시지
* @params {UseFormRegisterReturn} [register] - react-hook-form의 resister 함수.
* register('password', {required: ...})부분을 그대로 파라미터에 넣으면 됩니다.
* @params {string} [type] - 입력 필드의 유형(ex: text, password). 기본값은 'text'
* @params {string} [placeholder] - 입력 필드의 placeholder 텍스트
* @params {boolean} [isButtonInput] - 버튼이 포함된 입력 필드인지 여부. 기본값은 'false'
* @params {React.ReactNode} [buttonLabel] - 버튼에 표시할 텍스트 또는 아이콘
* @params {() => void} [onButtonClick] - 버튼 클릭 시 호출할 함수
*
* 예시)
* <ValidationInput
label="비밀번호 확인"
errors={errors.checkPassword?.message}
register={register('checkPassword', {
required: '비밀번호를 한 번 더 입력해 주세요.',
validate: (value) => value === watch('password') || '비밀번호가 일치하지 않습니다.',
})}
type="password"
/>
*/

type ValidationInputProps = {
label?: string;
errors?: string;
register?: UseFormRegisterReturn;
type?: string;
placeholder?: string;
isButtonInput?: boolean;
buttonLabel?: React.ReactNode;
onButtonClick?: () => void;
};

export default function ValidationInput({
label,
errors,
register,
type = 'text',
placeholder,
isButtonInput = false,
buttonLabel,
onButtonClick,
}: ValidationInputProps) {
const [showPassword, setShowPassword] = useState(false);

const handleTogglePassword = () => {
setShowPassword((prev) => !prev);
};

return (
<div className="relative">
{label && (
<label htmlFor={label} className="font-bold">
{label}
</label>
)}
<div
className={`flex h-30 items-center rounded-lg border px-6 text-sm ${
errors ? 'border-2 border-[#FF0000]' : 'border-input'
}`}
>
<div className="flex h-full w-full flex-row items-center gap-8">
<input
id={label}
{...register}
type={type === 'password' && showPassword ? 'text' : type}
placeholder={placeholder}
className={`h-full bg-inherit outline-none placeholder:text-emphasis ${isButtonInput ? 'w-[90%]' : 'w-full'}`}
Copy link
Contributor

@Seok93 Seok93 Jul 4, 2024

Choose a reason for hiding this comment

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

버튼 유무로 크기를 지정하기보다 부모 요소를 flex로 설정하고, flex-grow 속성을 이용하여 공간을 알아서 차지하도록 해보는게 어떨까요? 버튼의 크기와 패스워드 눈(?)의 아이콘 크기를 지정하면, 나머지 넓이를 알아서 차지해줍니다.

🔗 MDN 공식문서: flex-grow
🔗 블로그: flex-grow

Copy link
Contributor Author

Choose a reason for hiding this comment

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

오 flex-grow 쓰는 방법이 있었네요! 그렇게 변경하면 조건문 없애도 되겠어요. 한번 바꿔보겠습니다. 감사합니다.👍

/>
{isButtonInput && (
<button
type="button"
className="flex h-20 w-90 items-center justify-center rounded bg-sub px-8 font-bold shadow-md"
onClick={onButtonClick}
>
{buttonLabel}
</button>
)}
</div>
{type === 'password' && (
<div className="absolute right-0 flex items-center pr-8 text-gray-400">
{showPassword ? (
<RiEyeFill className="h-15 w-15 cursor-pointer" onClick={handleTogglePassword} />
) : (
<RiEyeOffFill className="h-15 w-15 cursor-pointer" onClick={handleTogglePassword} />
)}
</div>
)}
Copy link
Contributor

@Seok93 Seok93 Jul 4, 2024

Choose a reason for hiding this comment

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

  1. 패스워드 확인 아이콘의 경우 현재 absolute로 처리하고 계시는데, 이 부분도 버튼처럼 처리해도 괜찮지 않을까요?

  2. 만약에 패스워드이면서 버튼을 사용한다면, 패스워드 아이콘은 input 입력창에 가까운게 더 좋을 것 같아요. 그런 의미에서 버튼과 아이콘의 코드 위치를 바꾸는게 좋지 않을까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

  1. 그러네요. 어차피 동일한 방식으로 div에 들어가니까 그렇게 해도 될 거 같아요! 한 번 바꿔보겠습니다.
  2. 오오 패스워드+버튼! 그건 생각 못 했네요. 순서 바꾸는 게 맞는 거 같아요! 이런 경우 스타일링적인 부분을 어떻게 가져가야 할지도 추가로 생각해 봐야겠네요. 감사합니다.🙇‍♀️🙇‍♂️

</div>
{errors && <p className="mt-[.5rem] text-sm text-[#FF0000]">{errors}</p>}
</div>
);
}
3 changes: 3 additions & 0 deletions src/constants/regex.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i;
Copy link
Contributor

@Seok93 Seok93 Jul 4, 2024

Choose a reason for hiding this comment

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

이메일 정규표현식

  1. 이메일에 알파벳 소문자가 누락된 것 같아요.
  2. https://www.korea.ac.kr/와 같이 DNS 도메인이 3개인 경우도 있어서, 하나 더 확장하셔야할 것 같아요

Copy link
Contributor Author

Choose a reason for hiding this comment

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

  1. 어 그러네요. 입력해봤을 때 검증은 잘 됐던 거 같은데 무슨 일이지... 이 부분 수정해두겠습니다!
  2. 생각지도 못했어요... 추가로 수정하겠습니다. 감사합니다.👍👍

export const PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,16}$/;
Copy link
Contributor

@Seok93 Seok93 Jul 4, 2024

Choose a reason for hiding this comment

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

패스워드 정규표현식

  1. (?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&]) 와 같이 소그룹으로 한 번 더 구성하신 이유가 있을까요? 뒤에 작성하신 [A-Za-z\d$@$!%*#?&]에서 다 매칭될 것 같아요.
  2. 특수기호는 @, !, $, % , &, *, #, ? 만 가능한 것 같은데, 다른건 없어도 괜찮을까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

사실 정규표현식은 제가 잘 몰라서 구글링으로 따왔는데...ㅋㅋ 찾아보니까 앞부분은 저희가 영문자, 숫자, 기호 각각 하나씩을 반드시 포함하기로 비밀번호 패턴을 정했었잖아요? 그 부분이라고 합니다@ 특수기호는 더 포함하고 싶은 게 있으면 추가해도 될 거 같아요!

Copy link
Contributor

Choose a reason for hiding this comment

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

  1. 아하 반드시 포함되어야 해서 확인용으로 넣어두신거군요. 이해했습니다!
  2. 특수문자의 일반적인 범위아래와 같다고 하네요? 그런데 정말 필요한지는 생각해봐야할 것 같아요. 이것도 회의 때 결정할까요?
    특수문자 범위

Copy link
Contributor Author

Choose a reason for hiding this comment

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

네 다 같이 이야기해보면 좋을 것 같습니다!😄

Choose a reason for hiding this comment

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

대화 요약 : 키보드에 있는 특수문자는 모두 허용하기 😆

export const PHONE_REGEX = /^01([0|1|6|7|8|9])-?([0-9]{3,4})-?([0-9]{4})$/;
7 changes: 7 additions & 0 deletions src/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,11 @@
.selected::before {
@apply absolute left-0 top-0 block h-30 w-3 bg-main content-[''];
}
.auth-btn {
@apply flex h-30 items-center justify-center rounded-lg bg-sub px-8 font-bold;
}

.auth-input {
@apply h-30 flex-grow rounded-lg border border-input px-8 text-sm outline-none placeholder:text-emphasis;
}
}
3 changes: 3 additions & 0 deletions src/index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
Copy link
Contributor

Choose a reason for hiding this comment

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

global.css에 다 추가되어 있는 내용이라 삭제하는게 좋을 것 같아요.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

아 이 파일 삭제하는 걸 깜빡 잊었어요. 삭제해두겠습니다!

Loading