-
Notifications
You must be signed in to change notification settings - Fork 8
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
템플릿 생성 및 수정시 파일명 랜덤 생성 및 중복호출 막기, 공개 범위 설정 radio UI로 변경 #939
Conversation
const [isSaving, setIsSaving] = useState(false); | ||
const isSavingRef = useRef(false); | ||
|
||
const { currentOption: currentFile, linkedElementRefs: sourceCodeRefs, handleSelectOption } = useSelectList(); | ||
|
||
const { mutateAsync: updateTemplate, error } = useTemplateEditMutation(template.id); |
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.
isSaving
은 따로 state을 만들지 않고 아래 useTemplateEditMutation
의 isPending
상태를 사용해도 괜찮지 않을까요?
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.
사용자 인터뷰부터 작업까지 수고가 많으셨습니다 헤인~!
난수로 파일명이 변경된 것도 전 좋은거 같습니다!!
로딩 UI 는 한번 이야기가 되면 좋을거 같네요
export const VisibilityButton = styled.button` | ||
display: flex; | ||
gap: 1rem; | ||
align-items: center; | ||
justify-content: center; | ||
`; | ||
|
||
export const Radio = styled.div<{ isSelected: boolean }>` | ||
width: 1rem; | ||
height: 1rem; | ||
background-color: ${({ theme, isSelected }) => | ||
isSelected ? theme.color.light.primary_500 : theme.color.light.secondary_200}; | ||
border-radius: 100%; | ||
`; |
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.
뭔가 동일한 컴포넌트인데 중복선언 되는 것들이 조금 있는거 같아요! 아무래도 style 를 외부에서 선언하니 더 잘 보이는거 같은데
Radio
는 공용 컴포넌트로 분리해볼 수 있지 않을까요? 헤인은 어떻게 생각하세요?
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.
좋은 생각인 것 같아요! Radio
공용 컴포넌트로 분리했습니다👍
const isSavingRef = useRef(false); | ||
|
||
const { currentOption: currentFile, linkedElementRefs: sourceCodeRefs, handleSelectOption } = useSelectList(); | ||
|
||
const { mutateAsync: updateTemplate, error } = useTemplateEditMutation(template.id); |
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.
추가로 이렇게 중복된 Mutation 요청을 막으면 좋은 부분이 회원이나 카테고리 관련 부분에서도 필요한 기능 같은데, 제가 공유드린 내용처럼 커스텀 훅으로 재사용 가능하게 바꿔보면 어떨까요?
</MemoryRouter> | ||
</ToastProvider> | ||
</AuthProvider> | ||
<ThemeProvider theme={theme}> |
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.
이번에 Radio
컴포넌트에서 ThemeProvider theme을 사용하여서 추가하게 되었습니다
|
||
export const checkName = async (name: string) => { | ||
const params = new URLSearchParams({ name }); | ||
|
||
await apiClient.get(`${END_POINTS.CHECK_NAME}?${params.toString()}`); | ||
return await apiClient.get(`${END_POINTS.CHECK_NAME}?${params.toString()}`); |
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.
> & { | ||
mutationFn: MutationFunction<TData, TVariables>; | ||
}; |
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.
mutationFn 을 반드시 전달하도록 타입으로 강제하기위해 이렇게 설정해주었습니다!
<Radio | ||
options={[...TEMPLATE_VISIBILITY]} | ||
currentValue={visibility} | ||
handleCurrentValue={handleVisibility} | ||
getOptionLabel={(option: TemplateVisibility) => convertToKorVisibility[option]} | ||
/> |
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.
이렇게 보니, TEMPLATE_VISIBILITY
상수를 하나로 합쳐도 괜찮지 않을까 생각이 들었어요.
Radio
의 인터페이스가 options와 getOptionLabel 두개를 받고 있는데, getOptionLabel
이 조금 어색해 보여서요! 반환값도 string이고 그냥 Radio
의 사용처에서 Object.entries
나 Object.keys
로 대응이 가능해보이는데, 어떻게 생각하시나요?!
export const TEMPLATE_VISIBILITY = {
PUBLIC: '전체 공개',
PRIVATE: '비공개',
};
} catch (error) { | ||
console.error('Failed to update template:', error); | ||
} finally { | ||
isSavingRef.current = false; | ||
setIsSaving(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.
👍👍 혹시 try-catch구문이 아직 필요한가요?!
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.
catch 없어도 될것 같아요!! 반영할게요!
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.
T extends something
처럼 쓰는 방법을 배웠네요~!
고생하셨습니다 헤인!
수고하셨습니다~!! |
⚡️ 관련 이슈
📍주요 변경 사항
file_(영어+숫자 랜덤 8자리)
로 만들어집니다.isSaving
이라는 flag를 두어서 중복 호출을 막았습니다.useState
와useRef
를 모두 써서 막았는데, 그 이유는 즉각적으로 flag 상태가 변해야하고 + UI도 변경해주어야 하기 때문이었습니다.개인적으로 저장 버튼을 누르면 바로 로딩 UI 등으로 유저에게 피드백을 주는 것이 맞다고 생각하여 로딩 UI 변경을 위해
useState
도 사용하였습니다.🪧 구현 결과
2024-11-28.9.43.45.mov
🎸기타
file_(영어+숫자 랜덤 8자리)
로 했는데, 다른 아이디어 있으시다면 적극 반영하겠습니다.validateTemplate
는 vaildate 파일로 빼고, 나머지는 그냥 파일 분리를 해보았습니다..!🍗 PR 첫 리뷰 마감 기한
11/29 22:0012/05 23:59