-
Notifications
You must be signed in to change notification settings - Fork 1
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: Snackbar 컴포넌트 구현 #162
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.
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.
ChipGroup
과 Tabs
의 경우 컴포넌트와 관련된 훅은 (컴포넌트 폴더)/hooks
로 분리했는데요,
일관성을 위해 스낵바에서 생긴 두 개의 훅도 위처럼 분리해두면 좋겠습니다!
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.
반영했습니다~ -> 43d50c4
isClosing?: boolean; | ||
position: SnackbarPosition; |
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.
styled component prop 타입의 필드명엔 $
를 붙이기로 했는데,
두 필드에선 붙이지 않은 이유가 따로 있을까요?
참고로 $
를 붙이는 이유는 스타일을 위해 생성한 prop이 DOM까지 전달되는 것을 막기 위해서입니다! 지금 콘솔 경고가 뜨는 것도 이 이유에서에요
자세한 내용은 스타일드 컴포넌트 문서의 transient props 섹션에서 확인하실 수 있습니다!!
이 맥락에서 SnackbarProps
타입의 필드명에는 $
를 떼는 게 덜 헷갈릴 거 같어용
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.
저것은..... 이유가 있습니다...
바로 저의 불찰 때문이죠.... 호호 반영 바로 해버렸습니다
이 맥락에서 SnackbarProps 타입의 필드명에는 $를 떼는 게 덜 헷갈릴 거 같어용
오 예리하네요 보리 반영했습니다ㅎㅎㅎㅎ -> bb5de21
useEffect(() => { | ||
const element = elementRef.current; | ||
if (element) { | ||
element.addEventListener('mousedown', handleStart); | ||
window.addEventListener('mousemove', handleMove); | ||
window.addEventListener('mouseup', handleEnd); | ||
|
||
element.addEventListener('touchstart', handleStart); | ||
element.addEventListener('touchmove', handleMove); | ||
element.addEventListener('touchend', handleEnd); | ||
|
||
return () => { | ||
element.removeEventListener('mousedown', handleStart); | ||
window.removeEventListener('mousemove', handleMove); | ||
window.removeEventListener('mouseup', handleEnd); | ||
|
||
element.removeEventListener('touchstart', handleStart); | ||
element.removeEventListener('touchmove', handleMove); | ||
element.removeEventListener('touchend', handleEnd); | ||
}; | ||
} | ||
}, [isDragging, startY]); |
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.
헉 원래 ref로 처리했었는데 코드가 반영이 안됐었네여 일단 ref로 다시 처리 했습니다!!
style transient props 처리에 같이 제가 커밋을 해버렸네요😅
같이 확인해주심 될 것 같아요🫶🏻🫶🏻 -> bb5de21
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.
당신정말최고야
src/components/Snackbar/Snackbar.mdx
Outdated
`type` - Snackbar의 종류 (info 또는 error). 기본 값은 `info`입니다. <br /> | ||
`width` - Snackbar의 가로 길이 (px, %, 등). 기본적으로 글자 길이에 맞게 가로 길이가 정해집니다. <br /> | ||
`margin` - 왼쪽 오른쪽의 margin 값. 기본 값은 `16px`입니다. <br /> | ||
`message` - Snackbar의 내용 (메시지). 필수 프로퍼티입니다. <br /> | ||
`duration` - Snackbar가 자동으로 닫히기 전까지의 시간(ms). 기본 값은 `5000`입니다. <br /> | ||
`position` - Snackbar의 위치 (left, center, right, full-width). 기본 값은 `center`입니다. |
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.
모든 prop에 대한 설명이 사용법
섹션에 리스트로 들어가 있는데,
아래처럼 문서 내용을 좀 더 추가하는 건 어떨까요?
사용법
섹션
필수 프로퍼티인 message
에 대한 내용만 남긴다
(두 줄 초과 시 말줄임표로 처리한다는 부분)
예시
섹션 (별도로 생성)
각 prop에 대한 구체적인 설명을 해당 위치로 분리
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.
수정 완료했습니다~ prop 예시를 밑에 몇개 둘까했는데 스낵바 컴포넌트 특성상 일일이 예시 테스트 주기가 번거로울 것 같아서
위에 Control 있으니 설명만 넣었습니당 -> 3ea81f0
@@ -0,0 +1,17 @@ | |||
export type SnackbarType = 'info' | 'error'; | |||
export type SnackbarHeightType = 1 | 2; | |||
export type SnackbarPosition = 'left' | 'center' | 'right' | 'full-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.
피그마에 따라 SnackbarPosition
의 종류로 'full-width'를 넣은 걸로 이해했는데
코드를 보니까 'full-width'는 position보다 width prop의 한 종류여야 하지 않나? 하는 생각이 들어서요
width: ${({ position }) => (position === 'full-width' ? '100%' : 'fit-content')};
width prop은 단위까지 입력받는다는 점에서.. 템플릿 리터럴 타입을 활용해보는 건 어떻게 생각하세요??
(CSS 함수나 여러 단위를 생각하면 별도 타입으로 분리하는 게 더 깔끔하겠네요 😅)
width?: 'full-width' | `${number}px` | `${number}rem` | ...;
참고로 위 방식으로 고치게 되면 width에 'full-width' 타입 값이 들어왔을 땐 사용자가 position을 설정해도 무시하는 방식의 처리를 추가해야 할 거 같습니다!
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.
아 생각해보니 그렇네요 position에 들어가면 따로 위치 처리가 필요없어서 둔거긴한데.. 의미상 안 맞아서 분리하는게 나아 보이긴 하네요
흠 단위는 px, rem, em, %, vh, vw, 정도로 할까요?!
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.
뷰포트 높이에 따라 토스트 너비를 조절하는 경우가 있을지 잘 상상이 안 가서, vh는 없어도 무방할 거 같단 생각입니다!
만약 단위만 넣어두면 calc()은 못 쓸텐데, 이건 포함시키지 않아도 될까요?
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.
calc()도 추가하겠습니당~ -> 08c7f4c
import { BoxButton } from '../BoxButton'; | ||
import { Snackbar } from './Snackbar'; |
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.
보니 저 코드가 상대경로로 되어 있어서 나는 린트 에러 같네여 절대경로로 다음처럼 바꿔놓을테니 확인 부탁드려요!!!
-> 01a5ad2
import { BoxButton } from '@/components/BoxButton';
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.
꼼꼼쓰한 반영 멋지네요 꼼체
돌려보면서 스타일 관련해서 발견한 게 조금 더 있어서 코멘트 달아놨어요 흑흑
왜 이런 건 바로바로 안 보이는 거야!~~!!!
shouldForwardProp: (prop) => prop !== 'isClosing', | ||
})<StyledSnackbarProps>` | ||
position: relative; | ||
padding: 24px; |
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.
height: ${({ $heightType }) => ($heightType === 2 ? '72px' : '52px')}; | ||
border-radius: ${({ theme }) => theme.semantic.radius.m}px; | ||
|
||
${({ theme }) => theme.typo.B3_Rg_14} |
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.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ아 대박 진정한 꼼꼼이는 보리 당신 꼼보...👍🏻
커밋 suggestion 할게영 -> 27ba6ad
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.
mdx에서 사용하고 있는 Story는 3갠데 (Test, info, Overflow) stories.tsx에는 5개가 있어서요! (+ Info, Error) 혹시 mdx에서 사용되지 않는 스토리들이 남아있는 이유가 있을까요?
또 스토리명은 대문자로 시작하면 좋을 거 같습니다! (test -> Test)
수정사항이 자잘하게 많았는데 고생하셨습니다 😋👍👍👍
1️⃣ 어떤 작업을 했나요? (Summary)
Snackbar 구현 작업을 했습니다.
2️⃣ 알아두시면 좋아요!
상태를 전역에서 관리하기 위해 Context API를 사용했습니다.
선언적으로 스낵바를 호출하기 위해 useSnackbar 훅으로 빼서 사용할 수 있도록 하였습니다.
isClosing과 onClose의 차이
isClosing
isClosing은 스낵바가 닫히는 상태를 나타내는 boolean 값.
이 값으로 애니메이션 제어를 하고 스낵바가 DOM에서 제거되기 전에 닫히는 애니메이션을 끝까지 보여주기 위한 용도! 없으면 애니메이션 없이 그냥 닫혀버려요.
onClose
스낵바가 닫힐 때 호출되는 함수.
스낵바가 닫히는 애니메이션이 끝난 후, 스낵바를 실제로 DOM에서 제거하는 역할을 합니다.
useTouchMouseDrag가 무엇이냐
마우스 드래그 또는 터치 스와이프 동작을 감지하여 스낵바 닫기를 수행할 수 있도록 구현된 함수입니다.
info 스낵바만 드래그해서 닫습니다! error 스낵바는 X버튼으로만 닫을 수 있음 참고!
3️⃣ 추후 작업
리뷰 반영!
배경색 토큰 반영 시 코드 수정 필요4️⃣ 체크리스트 (Checklist)
main
브랜치의 최신 코드를pull
받았나요?