-
Notifications
You must be signed in to change notification settings - Fork 20
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: Panel
컴포넌트 구현 (#36)
#56
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.
코드 잘 봤습니다 쳎!
storybook으로도 확인해봤는데 엄청 깔끔하네요!
코멘트 남긴거 한번만 확인해주심 감사하겠습니다! 고생하셨습니다!! 👍👍👍
// ITU-R BT.709 formula | ||
const getLuma = ([red, green, blue]: number[]) => 0.2126 * red + 0.7152 * green + 0.0722 * blue; | ||
|
||
export const getTextColor = (backgroundColor: 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.
오 이 유틸 함수 덕분에 앞으로 Contrast 맞추기가 쉬워지겠네요!! 👍👍👍
const PanelContext = createContext<PanelProps>({ | ||
expandable: true, | ||
expanded: 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.
오 Context를 활용한게 정말 멋지네요! 👍👍👍
if (process.env.NODE_ENV !== 'production') { | ||
PanelContext.displayName = 'PanelContext'; | ||
} |
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.
이 부분은 혹시 어떤 역할을 하고 있는지 알 수 있을까요?
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.
React Devtools로 Context 관련 내용을 확인하려고 하면 모두 Context.Provider
로만 보여지기 때문에 어떤 Context인지 네이밍을 확실히 해주기 위해 적용한 코드입니다.
여기에서 참고했습니다.
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.
재사용성을 많이 고려한 컴포넌트라 너무 좋습니다ㅎㅎ 고민을 많이 한게 느껴져요!
패널 열고 닫는 이벤트를 컴포넌트 사용자 측에서 주입하는 것이 아닐테니, 나중에 따로 issue를 만들기보다 이번 PR에 같이 포함하는게 좋을 것 같은데 어떠신가요??
const { expandable = false, expanded = false } = useContext(PanelContext); | ||
|
||
return ( | ||
<>{(!expandable || (expandable && expanded)) && <Styled.Content>{children}</Styled.Content>}</> |
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.
조건이 좀 길어서 변수로 분리하는 것을 고려해봐도 좋을 것 같아요
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.
expandable하지 않은 Panel이면 항상 내용을 보여주고, expandable한 패널이면서 펼쳐져 있는 상태면 보여준다는 조건문인데 어떤 네이밍으로 분리해야할 지 고민이 되네요...
차라리 조건문을 나눠서 if문으로 early return을 하는 게 더 나을 수 있겠네요.
피드백 감사합니다! 수정사항 반영하고 다시 리뷰 요청 드릴게요~
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.
isShowContent
나 isDisplayContent
같은건 어떨까요...?
그러고보니 저는 boolean타입의 변수에 is나 has를 붙여주는 편이에요.
disabled 어트리뷰트나 이 프로젝트가 typescript를 사용중인걸 고려하면 상관없을 것 같기도 하고, 컨벤션으로 맞추는게 좋을 것 같기도 하고 애매하네요ㅠㅠ
@yujo11 생각은 어때요??
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.
boolean의 경우에 무조건 is나 has를 붙여주는 건 헝가리안 표기법이 아닐까 하는 생각이 들었어요. 그래서 저는 안 붙이는 것도 좋아보여요
이와 별개로 해당 부분은 컨벤션이 없어서 혼란이 있을 것 같은데, 이것도 정하면 좋을 것 같습니다 :)
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.
const PanelContent = ({ children }: PropsWithChildren<Props>) => {
const { expandable = false, expanded = false } = useContext(PanelContext);
const element = <Styled.Content>{children}</Styled.Content>;
if (!expandable) return element;
if (expandable && expanded) return element;
return null;
};
조건문을 나누기 어려워서 조건문을 if문으로 각각 나누어서 early return 하는 식으로 코드를 작성해봤습니다.
조건문을 나눌 수 있어서 좋긴 한데... 다른 컴포넌트와 렌더 방식이 다르기 때문에 일관성이 맞지 않는 부분이 있네요.
이러한 형식의 코드도 괜찮나요? 의견 부탁드려요~
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.
개인적으로 이런 방식으로 작성된 코드를 예시코드로 본 적이 있어서 그렇게 위화감이 크진 않아요. 하지만 이번 경우엔 전의 코드가 더 나은 것 같아요ㅋㅋㅋ😂 번거롭게 해서 죄송합니당ㅠ
부분적으로 loading이나 error 상태를 표시하거나, '검색 결과가 존재하지 않습니다'같은 메세지를 띄우는 상황 등에서 요런 방식을 사용하면 좋을 것 같네요!
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.
isShowContent
나isDisplayContent
같은건 어떨까요...?그러고보니 저는 boolean타입의 변수에 is나 has를 붙여주는 편이에요.
disabled 어트리뷰트나 이 프로젝트가 typescript를 사용중인걸 고려하면 상관없을 것 같기도 하고, 컨벤션으로 맞추는게 좋을 것 같기도 하고 애매하네요ㅠㅠ@yujo11 생각은 어때요??
저 역시 헝가리안 표기법을 선호하지 않습니다! is
, has
등의 prefix 없이도 구문에 어색함이 없다면 붙이지 않는 것도 좋을거 같아요!
color: ${({ theme, bgColor = 'transparent' }) => | ||
getTextColor(bgColor) === 'black' ? theme.black[500] : theme.white}; |
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.
앞으로 여기저기서 많이 쓰일 것 같은데 한 번 더 추상화하는건 어떨까요??
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.
좋은 아이디어네요!
일단 공통적으로 사용할 수 있을만한 스타일 정의를 어디에 두면 좋을지 추후 논의가 필요해보입니다.
우선은 같은 파일에 responsiveTextColor
라는 이름으로 스타일 정의만 따로 분리해둘게요.
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.
다음 데일리에서 같이 논의해보시다!
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.
좋아요~~
const PanelContext = createContext<PanelProps>({ | ||
expandable: true, | ||
expanded: 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.
context를 전역으로만 사용하지 않는다는 것은 알았지만, 실제 사용된 예시는 처음봐요! 배워갑니다~~👍👍👍
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.
Material UI의 코드를 참고했습니다 :)
// ITU-R BT.709 formula | ||
const getLuma = ([red, green, blue]: number[]) => 0.2126 * red + 0.7152 * green + 0.0722 * blue; | ||
|
||
export const getTextColor = (backgroundColor: 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.
크~~~👍👍👍👍👍
PR에 사용법 문서화까지 완-벽- |
좋은 생각입니다 :D |
- 텍스트 색에 적용되는 `responsiveTextColor` 정의 - SVG fill 속성에 적용되는 `responsiveFill` 정의 - 공통적으로 적용할 수 있는 `ResponsiveColorProps` interface 정의
@SunYoungKwon @yujo11 |
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.
확인 했습니다! 완전 빠르네요 쳎!! 🚀🚀🚀
고생하셨습니다!! 👍👍👍
- `expanded` prop을 `initialExpanded`로 이름 변경
@SunYoungKwon 의 제안으로 컴포넌트 자체에서 상태를 가지도록 로직을 수정했습니다.
|
if (expandable && onToggle) { | ||
onToggle(); | ||
if (expandable) { | ||
setExpanded((prev) => !prev); |
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.
오~ 깔끔!!
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.
깔끔22 👍👍
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.
고생하셨습니다 쳎!! 👍👍👍
if (expandable && onToggle) { | ||
onToggle(); | ||
if (expandable) { | ||
setExpanded((prev) => !prev); |
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.
깔끔22 👍👍
기능 목록
Panel
컴포넌트 구현기타
utils/color.ts
에 배경색에 따른 텍스트 색상을 반환하는 로직을 작성함white
, 밝은 계열일 경우black
을 반환함API
Panel
expandable
true
일 경우Panel
을 펼쳤다가 닫을 수 있는 UI로 변경된다.boolean?
false
initialExpanded
Panel
이 초기에 펼쳐져 있는 상태인지 정의한다. 해당 속성이true
일 경우Panel
컴포넌트가 처음 렌더될 때부터 펼쳐져 있는 형태로 보여준다.expandable
이true
일 때만 동작한다.boolean?
false
children
Panel.Header
로Panel
의 헤더 영역,Panel.Content
로Panel
의 내용 영역을 정의할 수 있다.ReactNode
Panel.Header
bgColor
string?
children
ReactNode
Panel.Content
children
ReactNode
close #36