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

[Feat/#453] 예매자 관리 페이지 기능 구현 #454

Merged
merged 25 commits into from
Dec 9, 2024

Conversation

sinji2102
Copy link
Contributor

@sinji2102 sinji2102 commented Dec 2, 2024

📌 관련 이슈번호

🎟️ PR 유형

어떤 변경 사항이 있나요?

  • 새 기능 추가
  • 버그 수정
  • CSS 등 사용자 UI 디자인 변경
  • 리팩토링

✅ Key Changes

  • 예매자 조회 GET API 연결
  • 예매자 조회 필터링 기능 추가
  • 예매자 조회 검색 기능 추가
  • 입금 처리 API 연결
  • 환불 처리 API 연결
  • 예매자 삭제 API 연결
  • CSV 다시 연결

📢 To Reviewers

  • TicketHolderList에 handler가 너무 많아서 뭔가 분리하고 싶었는데... 막상 분리하려니까 애매하고... 해서 일단 한 파일에 들어있어요 ㅠㅠ
  • ManageCard 컴포넌트는 합성 컴포넌트를 의도하긴 했는데... 저게 맞는지는 잘 모르겠습니다 ㅠㅠ
  • 원래 react-csv가 CSVLink 컴포넌트 안에 버튼 컴포넌트를 넣고 그걸 누르면 CSV가 다운로드 되는 형식으로 알고 있는데, 현재 Navigation 공통 컴포넌트 우측 상단에 컴포넌트를 넣기가 애매해서 useRef로 처리했습니다!
  • 검색 처리 때문에 useDebounce 커스텀 hook 만들었는데, 준혁 오빠 주소 검색할 때도 debounce를 사용하는 것 같아서 merge 이후에 공통 hook으로 사용할 수 있게 변경하면 좋을 것 같아요!

📸 스크린샷

@sinji2102 sinji2102 linked an issue Dec 2, 2024 that may be closed by this pull request
7 tasks
Copy link

github-actions bot commented Dec 2, 2024

PR 작성하느라 고생 많았어요!! 라벨 잘 지정되었는지 확인 한 번 해 주기 🫶

@github-actions github-actions bot added the ✨ FEAT 기능 구현 label Dec 2, 2024
Copy link
Member

@pepperdad pepperdad left a comment

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.

p4: 👍

지금은 값을 debounce를 하는데,
함수 호출 debounce 할 수도 있어요!
한 번 보면 좋을 것 같아요 ㅎ.ㅎ

Comment on lines 371 to 374
// TODO : 공통컴포넌트에 svg 들어갈 수 있도록 수정하기
subText: "CSV",
leftOnClick: handleNavigateBack,
rightOnClick: handleEditButton,
// TODO : rightOnClick CSV 다운로드로 변경
Copy link
Member

Choose a reason for hiding this comment

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

p1: TODO 해주세용

Copy link
Contributor

@imddoy imddoy left a comment

Choose a reason for hiding this comment

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

우리 신지는 정말 열심히 했구나...ㄷㄷㄷ 최고당!!!! 근데 todo는 언제해주시낭요

Comment on lines 24 to 27
queryFn: () => getTicketRetrieve(formData, filterList),
gcTime: 1000 * 60 * 60 * 24,
});
};
Copy link
Contributor

Choose a reason for hiding this comment

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

p3) 여기 staleTime이 안정해져있는데 검색어를 지우면 다시 또 예매자 목록을 불필요하게 네트워크 요청을 하고 있어요!!
넣어주면 좋을 것 같네용!
image

Comment on lines 22 to 23
return useQuery({
queryKey: [QUERY_KEY.LIST, BOOKING_QUERY_KEY.BOOKING_LIST],
Copy link
Contributor

Choose a reason for hiding this comment

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

p3) 제가 쿼리키를 갈아엎으면서 예매한 공연 쿼리키에서 Bookinglist를 지우고 회원 기준 예매 공연목록과 비회원 기준 예매 공연 목록으로 분리했습니당! 그런데 사실 예매자가 예매한 공연 리스트를 캐싱하는거랑, 주최자가 예매자 리스트를 캐싱하는거랑 성격이 너무 다른데 같은 쿼리키를 꼭 공유해야 하는 이유를 잘 모르겠어서 지우고 sellerBookingList로 따로 관리하도록 수정했는데 이 부분 같이 이야기해보는 게 좋을 것 같습니다!!

Comment on lines 29 to 37
// 예매자 목록 검색 API (GET)를 위한 쿼리 작성

export const useTicketRetriveSearch = (formData: getTicketReq, searchWord, filterList) => {
return useQuery({
queryKey: [QUERY_KEY.LIST, BOOKING_QUERY_KEY.BOOKING_LIST],
queryFn: () => getTicketRetrieveSearch(formData, searchWord, filterList),
gcTime: 1000 * 60 * 60 * 24,
});
};
Copy link
Contributor

Choose a reason for hiding this comment

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

p5) 이 코드가 위에서 검색하는 코드랑 많이 중복되는 것 같습니다! 그냥 인자의 차이라고 생각되는데 맞을까요??
그냥 위에 코드에 검색어도 함께 넣어줘서 값의 여부에 따라서 자동적으로 getTicketRetrieve를 요청하면 될 것 같은데 어떻게 생각하시나요??

Comment on lines 22 to 23
return useQuery({
queryKey: [QUERY_KEY.LIST, BOOKING_QUERY_KEY.BOOKING_LIST],
Copy link
Contributor

Choose a reason for hiding this comment

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

p3) filterList에 따라서 계속 목록을 받아오는 쿼리를 작성하신 것 맞을까요?? 저는 보통 이렇게 필터링 요소에 맞게 계속 요청을 보내야 하는 구조에서는 쿼리키에 넣어주는 편인데요! 현재 코드에서는 데이터가 바뀔때마다 refetch를 해주고 있더라구용

  useEffect(() => {
    const fetchData = async () => {
      const refetchData = await refetch();
      setPaymentData(refetchData?.data?.bookingList ?? []);
    };

    const fetchSearchData = async () => {
      const refetchSearchData = await searchRefetch();
      setPaymentData(refetchSearchData?.data?.bookingList ?? []);
    };

    // TODO : 서버에서 검색어 2글자 이상으로 넘겨줬는데, 기-디에 화면에 어떻게 표현할지 물어보기
    searchWord.length >= 2 ? fetchSearchData() : fetchData();
  }, [filterList, status, debouncedQuery]);

그런데 쿼리키에 해당값을 넣어주면 값이 바뀔때마다 새로 요청이 자동으로 갈 수 있는데 굳이 이렇게 직접 구현을 해야할 필요성이 있는지 잘 모르겠습니당! 필터링(filterList)이랑 검색어(searchWord)를 쿼리키에 넣어서 관리해주는 것은 어떻게 생각하시나요?

Comment on lines 53 to 55
export const useTicketRefund = () => {
const queryClient = new QueryClient();

Copy link
Contributor

Choose a reason for hiding this comment

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

p3) 이미 상위의 App.tsx에서 QueryClient를 생성하고 있는데 이 훅에서 개별적으로 다시 생성하는 이유가 있나요?
모든 훅에서 새롭게 생성하고 있는데 이렇게 관리하면 하나의 queryClient에서 관리가 되지 않는데 제대로 동작하나요??
const queryClient = useQueryClient();로 사용하는 것이 더 알맞는 방법 같습니다!

Comment on lines 66 to 68
return css`
color: ${({ theme }) => theme.colors.gray_400};
text-decoration: line-through;
Copy link
Contributor

Choose a reason for hiding this comment

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

p5) 여기 있는 theme을 그냥 status랑 같이 넣어주면 안되나요?

Comment on lines 78 to 84
${({ $status }) => {
if ($status === "취소 완료") {
return css`
color: ${({ theme }) => theme.colors.gray_600};
`;
}
}}
Copy link
Contributor

Choose a reason for hiding this comment

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

p5) 이거같은 경우에는 그냥 color에서 한 줄로 처리해도 될 것 같은데 나중에 변경될 가능성도 있으니까 유지보수를 위해서 이렇게 작성하신걸까용?

Copy link
Contributor

Choose a reason for hiding this comment

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

p1) 여기 검색 아이콘 누락되었습니다!
image

Copy link
Contributor

Choose a reason for hiding this comment

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

p1) 헝헝 컴포넌트도 지워주세용

Copy link
Contributor

Choose a reason for hiding this comment

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

p5) 여기 코드리뷰 안되는거 실화야요??????
에반데... 어떻게 코리남겨요...??

  1. 컴포넌트 밖으로 뺄수 있는 상수들은 분리해주는게 좋을 것 같아요!
  2. 업데이트를 하고 reload를 직접하고 있는데, 리액트 쿼리를 활용하지 못한것 같습니다! 그냥 무효화시켜주면 되지 않나용??
    setTimeout(() => {
      window.location.reload();
    }, 1000);

Copy link

sonarcloud bot commented Dec 9, 2024

Quality Gate Failed Quality Gate failed

Failed conditions
22.3% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@sinji2102 sinji2102 merged commit 97a6e7e into develop Dec 9, 2024
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ FEAT 기능 구현
Projects
Status: 🎉Done
Development

Successfully merging this pull request may close these issues.

[ Feat ] 예매자 관리 페이지 기능 구현
3 participants