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

학생 인증 기능 추가, 유저 정보 등록 리팩터링 #111

Merged
merged 35 commits into from
Jul 17, 2023

Conversation

mjsdo
Copy link
Collaborator

@mjsdo mjsdo commented Jul 13, 2023

Issues

구분

  • 버그 수정
  • 기능 추가
  • 코드 리팩터링
  • 문서 업데이트
  • 기타

주요 변경점

  • <Name />, <Avatar />리팩터링 #107 Merge 이후에 업데이트 할게요.
  • 스토리북 msw addon에서 not found module 오류가 계속 발생했는데(관련 이슈), 스토리북 최신버전으로 업그레이드 해보니까 해결이 됐습니다.
    • 제꺼 리뷰-머지되면 npx storybook@latest upgrade 사용해서 스토리북 업그레이드 한번 해주세요.
    • yarn 하면 알아서 업데이트 되는 듯 하네요.

스크린샷

기타

@mjsdo mjsdo requested a review from otterp012 July 13, 2023 21:02
@mjsdo mjsdo self-assigned this Jul 13, 2023
@mjsdo mjsdo changed the title Feature/ssafy certification 2 #65 학생 인증 완료, 유저 정보 등록 리팩터링 Jul 13, 2023
@mjsdo mjsdo changed the title 학생 인증 완료, 유저 정보 등록 리팩터링 학생 인증 기능 추가, 유저 정보 등록 리팩터링 Jul 13, 2023
@mjsdo mjsdo mentioned this pull request Jul 14, 2023
5 tasks
@mjsdo mjsdo force-pushed the feature/ssafy-certification-2-#65 branch from b802334 to 22a715b Compare July 14, 2023 12:32
Copy link
Collaborator Author

@mjsdo mjsdo left a comment

Choose a reason for hiding this comment

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

UserRegisterForm쪽은 리팩토링 진행했고,
NameCard부터 학생인증에 필요한 컴포넌트, 스토리, 페이지 작업했습니다.

학생인증은 이 PR로 기능은 다 구현됐어요.

스토리북 링크

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

UserRegisterForm쪽은 전부 StudentCertificationForm이랑 동일한 흐름으로 바꿔놨습니다.

  • 외부에서 onSubmit 전달받음 (기존에는 내부에서 핸들링)
  • 불필요한 컨텍스트 제거
  • 텍스트 큰거 렌더링 하는 용도로 만들어둔 Question컴포넌트 제거
  • Form 타입과 API 타입 분리해서 작성 (기존에는 두 타입이 일치)

@@ -18,7 +18,7 @@ import { defaultify } from '~/utils';
// import 구문 옆에다 주석 달면 린트 오류가 발생해서 여기 적어둡니다.

export interface TrackProps<Track extends keyof typeof tracks> {
name?: Track;
name?: Track | null;
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

트랙이 없는경우 서버에서 값이 null로 넘어오기 때문에 추가

@@ -123,8 +121,7 @@ export const ModalInModal = () => {
<Button onClick={handleOpenModal}>트리거 버튼</Button>
</div>

{/* 이 모달은 `_app.tsx`에서 한번만 렌더링합니다. */}
<GlobalModal />
{/* `GlobalModal`은 `_app.tsx`에서 한번만 렌더링합니다. */}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

스토리북의 Preview.tsx에 반영했습니다.

Comment on lines +43 to +53
parameters: {
msw: {
handlers: {
// 기본적으로 정의한 유저 정보 핸들러가 데이터를 `userInfo.initialUser`로 채우기 때문에
// Effect 에서 세팅하는 `userInfo.uncertifiedSsafyUserInfo`와 충돌합니다. (500ms 딜레이를 가지고 API를 응답하기 때문에)
// 해당 핸들러를 제거할 목적으로 override 합니다.
member: [certifyStudent],
},
},
},
};
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

페이지 스토리를 추가하실 때는 이런식으로 핸들러 오버라이드 하시면 됩니다.

우려되는 점은, 이쪽은 타입이 아예 정의되지 않아서 오탈자를 잡아주지 않는다는 건데 (작업하면서 handlershandler로 오타내서 의도한대로 동작하지 않은 경우도 있었어요)

StoryObj타입을 확장시킬까 생각중입니다.
일단은 사용하게 된다면 스펠링을 주의해서 적어주시면 될것 같아요.

참고로 member키에 들어가는 핸들러의 기본값은 여기서 볼 수 있는데, 지금 여기있는 49번 라인처럼 작성하면 머지되는게 아니라 아예 교체하게 됩니다.

전 이 페이지에서 이 API만 필요하기 때문에 상관없지만, 만약에 어느 하나를 제거할 생각이라면
member: memberHandlers.filter(h => h === certifyStudent)이런식으로 사용하시면 될 것 같아요.

Copy link
Collaborator

Choose a reason for hiding this comment

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

참고할게요! 곧 하나 올라갈듯..!!

Comment on lines +31 to +37
parameters: {
msw: {
handlers: {
member: [],
},
},
},
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

여기도 마찬가지로,
유저 정보가 없어야 하는데, 기본적으로 msw에서 유저정보를 500ms 딜레이를 가지고 응답하기 때문에 오버라이드 했습니다.

Comment on lines +37 to +42
useEffect(() => {
const myInfo = !ssafyMember
? userInfo.nonSsafyUserInfo
: certified
? userInfo.certifiedSsafyUserInfo
: userInfo.uncertifiedSsafyUserInfo;
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

msw에서 사용하던 data값들을 그대로 가져와서 쓰는 것이니,
필요하신 경우 저처럼 mock 데이터 가져와서 쓰세요!

Comment on lines +41 to +47
if (certificationSuccess) {
return (
<DelayedRedirection to={routes.main()} seconds={3}>
<PreviewCertifiedMyInfo userInfo={myInfo as NonNullable<UserInfo>} />
</DelayedRedirection>
);
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

원래는 이 페이지의 JSX 반환문에서

success ? <인증성공화면 /> : <인증Form /> 

이런식으로 보여주려고 했는데,

바로 아래에 이미 인증된 상태라면 리다이렉션 시키는 조건문 로직 떄문에,
인증 성공 이후에 트랙 정보나 인증상태 이런거 세팅하는 순간 거기 걸려서 아래로 내려오질 못하게 됩니다.
그래서 더 위에서 JSX를 반환하는 방식으로 했어요.

Copy link
Collaborator

Choose a reason for hiding this comment

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

이쪽부분 복잡했을 것 같은데 이렇게 하는게 나을 것 같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

기존에 있었던 컨텍스트를 삭제하고 여기로 옮겼습니다.

replace?: boolean;
}

const DelayedRedirection = (props: DelayedRedirectionProps) => {
const { children, to, seconds, replace = false } = props;
const { children, to, seconds = 3, replace = false } = props;
Copy link
Collaborator

@otterp012 otterp012 Jul 16, 2023

Choose a reason for hiding this comment

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

좋습니다!
개인적으로 개발자간에 합의만 된다면 default value가 있는 게 좋다고 생각했어요

};

const formatSsafyInfo = (year: number, campus: string) => {
return `${campus}캠퍼스 SSAFY ${year}기`;
Copy link
Collaborator

@otterp012 otterp012 Jul 16, 2023

Choose a reason for hiding this comment

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

별건 아닌 부분이지만 아마 year 대신 semester를 사용해서 용어를 맞춰놔도 좋을 것 같아요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

저번에 말씀드렸듯이 의미상으로 semester가 아닌 year가 맞아서 이렇게 놔뒀습니다!

@@ -51,8 +54,8 @@ export default RedirectionGuide;

const selfCss = css(
{
minHeight: '100vh',
height: 'max-content',
minHeight: pageMinHeight,
Copy link
Collaborator

Choose a reason for hiding this comment

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

minHeight를 전체적으로 통일하기 위해 사용한 부분일까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

네. vh로만 높이를 주면 높이가 낮은 디바이스에서 어색하게 보여서요.

@mjsdo mjsdo merged commit 0ba538e into main Jul 17, 2023
@github-actions
Copy link

🎉 Storybook chromatic deployment results

Results
Build result Link
Storybook preview Link
Component count 48

@mjsdo mjsdo mentioned this pull request Jul 17, 2023
5 tasks
@mjsdo mjsdo deleted the feature/ssafy-certification-2-#65 branch July 21, 2023 17:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants