Skip to content
This repository has been archived by the owner on Jul 29, 2024. It is now read-only.

[FE] refactor: 글 제목 수정 낙관적 업데이트 구현 #586

Merged
merged 16 commits into from
Oct 19, 2023

Conversation

yogjin
Copy link
Collaborator

@yogjin yogjin commented Oct 16, 2023

🛠️ Issue

✅ Tasks

수정 전

2023-10-16.11.52.10.mov

수정 후

2023-10-16.11.58.58.mov
  • 글 제목 수정할 때 낙관적 업데이트 적용
  • 글 제목 수정 시 깜빡임 현상 해결
  • 글 제목 수정 실패 테스트 추가 (msw 오버라이딩 환경설정 및 함수 추가)

⏰ Time Difference

  • 6 + 6

📝 Note

@yogjin yogjin added 🧪 test 테스트 코드 🛠️ refactor 코드 리팩터링, 개선 🖥️ frontend 프론트엔드 작업 labels Oct 16, 2023
@yogjin yogjin added this to the 최종 데모데이 milestone Oct 16, 2023
@yogjin yogjin self-assigned this Oct 16, 2023
Copy link
Member

@jeonjeunghoon jeonjeunghoon left a comment

Choose a reason for hiding this comment

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

훅 분리랑 input value change 핸들러 내부에 넣는 의견 어떤가요?
코멘트로 남겨뒀어요~!

frontend/cypress/constants/url.ts Show resolved Hide resolved
frontend/cypress/e2e/writing-page.cy.ts Show resolved Hide resolved
const myRef = useRef<HTMLHeadingElement>(null);
const queryClient = useQueryClient();
const toast = useToast();

const { mutate: updateWritingTitle } = useMutation(updateWritingTitleRequest, {
Copy link
Member

Choose a reason for hiding this comment

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

해담 훅은 분리하는게 좋을 것같아요

ref={inputRef}
onChange={(e: ChangeEvent<HTMLInputElement>) => setInputTitle(e.target.value)}
Copy link
Member

Choose a reason for hiding this comment

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

useControlledInput 훅 내부에 핸들러가 있어도 될 것같다고 생각해요

Copy link
Collaborator Author

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.

onChangeuseControlledInput 훅 내부에 다음과 같이 선언할 수 있지 않나요?

const useControlledInput = (defaultValue: string = '') => {
  ...
  const onChange: ChangeEventHandler<HTMLInputElement> = (e) => setInputTitle(e.target.value)
  ...

  return {
    ....
    onChange,
    ...
  }
}

@nangkyeonglim nangkyeonglim changed the title [FE] 글 제목 수정 낙관적 업데이트 구현 [FE] feat: 글 제목 수정 낙관적 업데이트 구현 Oct 18, 2023
@nangkyeonglim nangkyeonglim changed the title [FE] feat: 글 제목 수정 낙관적 업데이트 구현 [FE] refactor: 글 제목 수정 낙관적 업데이트 구현 Oct 18, 2023
Copy link
Collaborator

@nangkyeonglim nangkyeonglim left a comment

Choose a reason for hiding this comment

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

고생하셨어요! 바로바로 업데이트 되니까 좋네요

@@ -1,6 +1,9 @@
import { defineConfig } from 'cypress';

export default defineConfig({
env: {
BASE_URL: 'https://dev.donggle.blog/api',
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.

에러 테스트를 위해 overrideWritingTitleWithError으로 msw 핸들러를 오버라이딩할 때, 내부적으로 ~URL을 사용합니다.
그 때 기존 process의 환경변수는 접근하지 못하더라구요.
아마 실행환경이 달라서 그런 것 같습니다.
그래서 불가피하게 cypress용 환경변수를 작성했습니다

Copy link
Member

@jeonjeunghoon jeonjeunghoon left a comment

Choose a reason for hiding this comment

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

고생하셨어요! 코멘트 남겨놨습니다~

ref={inputRef}
onChange={(e: ChangeEvent<HTMLInputElement>) => setInputTitle(e.target.value)}
Copy link
Member

Choose a reason for hiding this comment

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

onChangeuseControlledInput 훅 내부에 다음과 같이 선언할 수 있지 않나요?

const useControlledInput = (defaultValue: string = '') => {
  ...
  const onChange: ChangeEventHandler<HTMLInputElement> = (e) => setInputTitle(e.target.value)
  ...

  return {
    ....
    onChange,
    ...
  }
}

@yogjin yogjin merged commit d5d6efe into develop Oct 19, 2023
1 check failed
@yogjin yogjin deleted the feature/optimistic-update-585 branch October 19, 2023 12:37
echo724 pushed a commit that referenced this pull request Oct 19, 2023
* fix: 글 제목 변경 fetch 에러 처리 로직 react query 사용하는 것으로 올바르게 수정

* feat: `useControlledInput` 훅 추가

* feat: 사이드바 글 제목 변경 모킹 로직 추가

* feat: 글 제목 변경 시 검증에 실패하면 토스트 출력하는 에러핸들링 로직 추가

* refactor: 글 제목 `Input` 만 사용하도록 변경, controlled input으로 변경

* style: 글 제목 `Input` 이 `disabled` 일 때 스타일 `initial`

* feat: 글 제목 수정 시 optimistic update 적용

* refactor: 이벤트 핸들러 `any` 타입 제거

* test: 글 제목 수정 테스트 추가

* feat: 글 제목 길어지면 줄바꿈을 위해 `S.Title` 태그 재선언

* refactor: 글 제목 Input 필요없는 속성 `disabled` 제거

* test: `cypress` msw 핸들러 override를 위한 환경설정 추가

* test: 글 제목 수정 override 에러핸들러 추가

* test: findAllByDisplayValue -> findAllByText

* test: 글 제목 변경 실패 테스트 추가

* test: `Input` 이름 수정 방식 변경으로 인해 깨지던 테스트 정상화
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
🖥️ frontend 프론트엔드 작업 🛠️ refactor 코드 리팩터링, 개선 🧪 test 테스트 코드
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

낙관적 업데이트 적용
3 participants