-
Notifications
You must be signed in to change notification settings - Fork 6
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 : 리스트 생성 페이지 구현 및 API 연결 #16
Feat : 리스트 생성 페이지 구현 및 API 연결 #16
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
유진님,,, 300자 넘는 코드의 컴포넌트화를 기깔나게 하셨군요,,,!
보면서 이렇게 컴포넌트화 하는 거구나 100번 깨달았습니다!
제거 유진님꺼 처럼 다 갈아엎고 싶지만, 시간 관계상 마지막 주차쯤 리팩토링 시간 있기를 바라며 넘겨야겠어요ㅠㅠ
너무너무 수고 많으셨습니다!!
|
||
export const container = style({ | ||
display: 'flex', | ||
flexDirection: 'row', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
flex Direction default값이 'row'라 제외해도 좋을 것 같습니다!
}); | ||
|
||
export const button = style({ | ||
width: '', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
빈값 발견! (혹시 의미가 있는걸까요??)
/** | ||
* ButtonSelector 컴포넌트: | ||
* 사용자가 좌우스크롤로 이동하며 클릭을 통해 | ||
* 카테고리를 선택할 수 있는 컴포넌트 | ||
* | ||
* @param list - 버튼으로 보여줄 목록 | ||
* @param onClick - 버튼을 클릭했을때 동작시킬 함수 | ||
* @param defaultValue - 기본으로 선택되어있는 요소 | ||
*/ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
헉 까먹을뻔 했어요!!
설명이 있으니 너무 좋네요! 감사합니다🙇♀️💗
width: '50px', | ||
height: '50px', | ||
|
||
appearance: 'none', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
appearance란 CSS 속성이 있는줄도 몰랐네요!! 배워갑니다💗
|
||
export const headerNextButton = style({ | ||
fontSize: '1.6rem', | ||
color: '#8d8d8d', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
피그마에 있는 색 중 #AFB1B6
을 쓰면 어떨까요??
또, 비활성화 상태에서는 호버해도 마우스 모양이 클릭으로 변하지 않도록
cursor: 'default',
속성 추가해도 좋을 것 같습니다! :)
useEffect(() => { | ||
const closeDropdown = (event: MouseEvent) => { | ||
if ( | ||
dropdownRef.current && | ||
inputRef.current && | ||
listRef.current && | ||
!dropdownRef.current.contains(event.target as Node) && | ||
!inputRef.current.contains(event.target as Node) && | ||
!listRef.current.contains(event.target as Node) | ||
) { | ||
setIsDropDownOpen(false); | ||
} | ||
}; | ||
document.addEventListener('click', closeDropdown); | ||
|
||
fetchData(); | ||
|
||
return () => { | ||
document.removeEventListener('click', closeDropdown); | ||
}; | ||
}, []); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기는 useOnClickOutside 훅으로 줄여볼 수 있을 것도 같은데, 테스트를 안해봤네요! 다음에 한 번 시도해보겠습니다~!
function MemberSelector({ placeholder, members = [], fetchData, onClickAdd, onClickDelete }: MemberSelectorProps) { | ||
const [input, setInput] = useState(''); | ||
const [selectedList, setSelectedList] = useState<UserProfileType[]>([]); | ||
const [isDropDownOpen, setIsDropDownOpen] = useState(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
별 차이는 없겠지만, useBooleanOutput 훅을 사용해 볼 수 있을 것 같아요!
const [isDropDownOpen, setIsDropDownOpen] = useState(false); | |
const { handleSetOn, handleSetOff, isOn } = useBooleanOutput(false) | |
//... |
* Section 컴포넌트: | ||
* 리액트 생성 페이지의 영역을 나누는 레이아웃용 컴포넌트 | ||
* | ||
* @param props.title - 영역의 이름 | ||
* @param props.isRequired - 필수 입력 영역, 빨간 *가 표시된다. | ||
* @param props.children - 영역 안에 포함될 tsx 내용 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오오 너무 좋은데요?!?
import * as styles from './SimpleInput.css'; | ||
|
||
interface SimpleInputProps { | ||
type: 'simple' | 'long'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지극히 개인적인 의견을 남겨보자면,
컴포넌트 이름이 SimpleInput이다 보니, 'input' | 'textarea'로 구분한다면, 두 타입의 차이가 잘 드러날 것 같다는 생각이 듭니다!!
rules: { | ||
required?: { | ||
errorMessage: string; | ||
}; | ||
maxLength?: { | ||
length: number; | ||
errorMessage: string; | ||
}; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
룰은 string으로 받고,
string에 따라 formInputValidation 상수 파일에서 빼서 쓰는 것도 좋을 것 같아요!
ex.
//import
import * as inputRules from '@/lib/constants/formInputValidation'
//타입
rules: string
//적용
<textarea {...register(name, {required: inputRules[rules]}/>
현재 파일 이름인 globalStyles가 아니라 GlobalStyles로 되어있어 빌드에러가 생긴것같습니다! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이것이 리액트 훅 폼이다🔥 리액트 훅 폼 이렇게까지 써 본 적 없는데 정말 잘 쓰시는게 느껴져요...🫢 코드량도 엄청 많은데 깔끔하게 잘 정돈되어 있네요..짱짱 👍
사정이 있어 지금 자세하게 코드 리뷰는 못 드리지만 내일 꼼꼼히 읽어보겠습니다💕
유진님 많은 부분 구현하시느라 너무 고생많으셨습니다!! 😭👍 |
개요
작업 사항
스크린샷
리뷰어에게