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

[Feature/BAR-36] 모달 컴포넌트 개발 #21

Merged
merged 14 commits into from
Jan 9, 2024
Merged

Conversation

miro-ring
Copy link
Contributor

@miro-ring miro-ring commented Jan 3, 2024

Summary

구현 내용 및 작업한 내역을 요약해서 적어주세요

To Reviewers

  • 스토리북의 내용이 많이 빈약한데, 이후 PR에서 토스트에 대한 스토리를 수정하면서 이 부분도 함께 내용 추가 진행하겠습니다. (두 개 모두 버튼 클릭시 노출되는 형태로 변경할 예정입니다.)
  • 모든 모달은 src/components/Modal/components 하위에 구현하는 형태로 설계하였습니다. 각 모달 컴포넌트는 자신만의 키값으로 구분됩니다.
  • 해당 형태의 구성은 모달이 뒷페이지에 종속성이 있는 경우 문제가 있습니다. 현재 피그마의 모달들을 확인해보았을 때 종속성이 있는 경우는 '폴더 이름 수정' 하나 입니다. 이 경우에만 해당 값을 전역 store로 가져오면 어떨까 생각하고 있습니다.
  • ModalContainer는 기본적인 모달 형태에 맞게 개발하였습니다. 로그인 모달의 경우 다른 모달과는 그 형태가 다르기 때문에 ModalContainer를 사용하지 않고 개발할 계획입니다.
  • button에 대한 공통 컴포넌트 개발은 이후 진행할 예정입니다. 모달의 버튼도 이때 함께 수정할 계획입니다.
  • 우측 상단의 닫기 버튼은 아이콘 작업이 완료되면 추가할 예정입니다.
  • 모달에 대한 액션 가이드가 없어서 이 부분은 추가되지 않은 상태입니다.

How To Test

모달에 대한 정상 노출 확인이 필요합니다.

@miro-ring miro-ring self-assigned this Jan 3, 2024
Copy link

github-actions bot commented Jan 3, 2024

Copy link

github-actions bot commented Jan 3, 2024

Copy link
Member

@dmswl98 dmswl98 left a comment

Choose a reason for hiding this comment

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

수고하셨습니당~ 👍🏻
Button 컴포넌트는 공통화가 빨리 필요해보이는데 제가 빠르게 만들까요??

📌 추가로 portal 관련 내용이 보이지 않는데, 해당 Modal 컴포넌트는 현재 portal로 구현된 게 맞을까요?

Comment on lines 16 to 20
interface ModalContainerProps {
title: string;
firstButtonProps?: ModalButtonProps;
secondButtonProps?: ModalButtonProps;
}
Copy link
Member

Choose a reason for hiding this comment

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

단순 의견; first, second 보다 left, right이 더 명시적으로 보일 것 같습니당

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@dmswl98
버튼이 1개만 존재하는 경우는 아직 없지만, 그런 형태가 들어온다고 생각해봤을 때는 first, second라는 명명이 좋을 것 같다고 생각했는데 혹시 이 의견에 대해서는 어떻게 생각하시나요!?

Copy link
Member

Choose a reason for hiding this comment

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

first, second는 2개 이상의 버튼을 내포할 수 있다고 생각됩니다 !

보여주신 형태는 ConfirmModal의 형태로 파악되는데 만약 한 개만 필요한 경우를 고려한다면 차라리 confirm, cancel 등의 네이밍은 어떨까용 ?

Copy link
Member

Choose a reason for hiding this comment

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

first, second는 2개 이상의 버튼을 내포할 수 있다고 생각됩니다 !

보여주신 형태는 ConfirmModal의 형태로 파악되는데 만약 한 개만 필요한 경우를 고려한다면 차라리 confirm, cancel 등의 네이밍은 어떨까용 ?

이 의견도 좋다고 생각합니다!

@@ -1,10 +1,10 @@
{
"compilerOptions": {
"strict": true,
Copy link
Member

Choose a reason for hiding this comment

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

👍🏻👍🏻👍🏻

Copy link
Member

Choose a reason for hiding this comment

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

😭

secondButtonProps?: ModalButtonProps;
}

const ModalContainer = ({
Copy link
Member

Choose a reason for hiding this comment

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

현재 디자인 상으로 Modal 타입이 여러 가지라,

해당 컴포넌트 내부에서 모든 content 요소들을 prop으로 받아서 컴포넌트 내부에서 분기 처리하여 그려내기 보다,
compound pattern으로 설계해 content는 children으로 받아서 그려내는 방식으로 구현되면 다양한 Modal 컴포넌트들에 대응이 쉬울 것 같아요.

제가 생각했던 Modal 컴포넌트의 대략적인 사용 코드는 다음과 같아요.

const LoginModal = () => {
  return (
    <Modal>
      <h1>바로 시작하기</h1>
      <Button>구글 로그인</Button>
      <Button>카카오 로그인</Button>
    </Modal>
  )
}

Comment on lines 54 to 64
<button
type="button"
className={styles.button}
style={assignInlineVars({
[styles.buttonColor]: firstButtonColor,
[styles.buttonBackgroundColor]: firstButtonBackgroundColor,
})}
onClick={onClickFirstButton}
>
{firstButtonText}
</button>
Copy link
Member

Choose a reason for hiding this comment

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

Button 컴포넌트도 따로 공통 컴포넌트로 만들면 좋을 것 같습니다.

Comment on lines 3 to 15
const DeleteArticle = () => {
return (
<ModalContainer
title="해당 글을 삭제할까요?"
secondButtonProps={{
text: '삭제하기',
onClick: () => {},
}}
>
{'삭제한 글은 복구할 수 없어요!\n삭제하시겠어요'}
</ModalContainer>
);
};
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
const DeleteArticle = () => {
return (
<ModalContainer
title="해당 글을 삭제할까요?"
secondButtonProps={{
text: '삭제하기',
onClick: () => {},
}}
>
{'삭제한 글은 복구할 수 없어요!\n삭제하시겠어요'}
</ModalContainer>
);
};
const DeleteArticle = () => {
return (
<ModalContainer>
<ModalHeader>
<h1>해당 글을 삭제할까요?</h1>
</ModalHeader>
<ModalContent>
<p>{'삭제한 글은 복구할 수 없어요!\n삭제하시겠어요'}</p>
</ModalContent>
<ModalFooter>
<button>취소</button>
<button>삭제하기</button>
</ModalFooter>
</ModalContainer>
);
};

추상화가 된다면 이렇게 활용할 수 있습니다!

Copy link
Member

@wonjin-dev wonjin-dev left a comment

Choose a reason for hiding this comment

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

따로 포탈이 적용되진 않았군요 ?

@@ -1,10 +1,10 @@
{
"compilerOptions": {
"strict": true,
Copy link
Member

Choose a reason for hiding this comment

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

😭

Copy link
Member

Choose a reason for hiding this comment

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

Modal.tsx가 하나의 파일에서 너무 많은 일을 하고 있는것 같습니다 !

Copy link
Member

Choose a reason for hiding this comment

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

디자인적 요소 (버튼 등)를 포함하지 않은 모달이 존재하면 더 좋을것 같아요

@miro-ring
Copy link
Contributor Author

수고하셨습니당~ 👍🏻 Button 컴포넌트는 공통화가 빨리 필요해보이는데 제가 빠르게 만들까요??

📌 추가로 portal 관련 내용이 보이지 않는데, 해당 Modal 컴포넌트는 현재 portal로 구현된 게 맞을까요?

@dmswl98
기존에는 포탈 기반으로 제작할 생각이었는데, 굳이 그럴 필요가 없다고 느껴져서 제거했습니다!
버튼 컴포넌트는 제가 해당 PR에서 오늘 중으로 빠르게 작업해서 추가해봐도 괜찮을까요?

@dmswl98 dmswl98 changed the title [Feature/Bar-36] 모달 컴포넌트 개발 [Feature/BAR-36] 모달 컴포넌트 개발 Jan 6, 2024
Copy link

github-actions bot commented Jan 7, 2024

@miro-ring
Copy link
Contributor Author

@wonjin-dev @dmswl98
말씀 주신 부분들 반영해보았습니다!

포탈 컴포넌트는 툴팁 PR에 존재하는 컴포넌트 기반으로 작성했습니다.

처음에 포탈을 쓰지 않았던 이유는, div#__next 하위에서 페이지 컴포넌트의 형제요소로 모달이 존재해도 문제가 없을 것으로 판단했기 때문이었습니다. div#__next 의 형제 요소로 반드시 모달을 넣어야 한다면 포탈을 쓸 수 밖에 없겠지만, 굳이 그 위치에 있을 필요는 없다고 생각했습니다.

제안해주신 Compound component 형태 적용도 고려해보았습니다. validation이 필요한 모달들이 존재하기 때문에 해당 패턴을 사용하는 경우 오히려 공통 컴포넌트를 사용하기 어려월 질 것 같다는 생각이 들어 현재 형태로 작성해보았습니다.

모달의 상세한 기능 추가 + 우측의 X 버튼 추가 + 버튼 컴포넌트 적용은 별도 PR에서 진행될 예정입니다. 이때 recipe를 활용한 CSS 공통화 작업도 수행할 계획에 있습니다.

Copy link
Member

@wonjin-dev wonjin-dev left a comment

Choose a reason for hiding this comment

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

정말 고생하셨습니다 ㅎㅎ 개인적으로는 해당 PR은 초안으로 요정도면 머지해도 좋다고 생각합니다 !!

추가적으로 금일 저녁에 모달 전역 상태 관리에 대해서 얘기 나눠보면 좋을것 같습니다 !

@dmswl98 dmswl98 added the feature label Jan 8, 2024
Copy link
Member

@dmswl98 dmswl98 left a comment

Choose a reason for hiding this comment

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

헉 제가 approve를 남기지 않았군요... 수고하셨습니당

@miro-ring miro-ring merged commit 958f9e6 into main Jan 9, 2024
2 of 3 checks passed
@miro-ring miro-ring deleted the feature/BAR-36 branch January 9, 2024 13:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants