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

[GGFE-148] 관리자 - 거래내역, 상점, 재화정책 관리 - 버튼 기능 추가, 모달 추가 #922

Merged

Conversation

PHJoon
Copy link
Contributor

@PHJoon PHJoon commented Aug 10, 2023

📌 개요

  • 관리자 (확성기, 프로필 삭제), (아이템 수정, 삭제), (재화 정책 등록) 기능, 버튼, 모달 추가

💻 작업사항


pr 나눠서 올려보려고 했는데 작업이 겹치는 부분도 많고 디자인도 비슷해서 한 번에 작업해서 올립니다. 죄송합니다 🙇


확성기, 프로필 삭제

  • 삭제 버튼 클릭 시 삭제 모달 -> 알림 전달 모달 방식으로 작동합니다
  • -> (삭제성공과 알림성공 토스트 메세지가 겹치는 문제때문에 분리했습니다)
  • 1 ~ 4번 확성기만 삭제되는 것처럼 보이게 mock api 만들었습니다.(실패 알림 확인하기 위해서입니다)
  • 1 ~ 4번 중 본인의 intraId에 해당하는 확성기를 삭제하여 알림이 실제로 가는지 확인할 수 있습니다.

아이템 수정, 삭제

  • 아이템 수정 버튼 클릭 시 모달이 뜨고 모달 내에서 수정이 가능하게 했습니다.
  • 수정 시 원가와 할인율이 0 이상의 값만 들어가게 적용했습니다.
  • 수정과 삭제는 1, 2번 아이템만 가능한 것처럼 보이게 mock api를 만들었습니다.(3번 누르면 실패 알림 확인할 수 있습니다)

재화 정책 등록

  • 페이지의 input에 값을 넣고 등록 버튼을 누르면 값들을 보여주는 모달이 한 번 더 뜨고 등록하게 만들었습니다.
  • 1 - 50 까지의 숫자만 유효하게 등록되도록 설정해놨습니다.
  • 값이 유효하지 않으면 등록 모달자체가 뜨지 않고 에러 알림이 뜨도록 했습니다.
  • 값이 유효하면 해당 값들을 보여주고 등록을 할 수 있는 모달이 뜹니다.

기타

  • input의 value를 가져올 때, ref를 사용한 비제어 컴포넌트를 사용한 이유는 관리자페이지에서는 불필요한 리렌더링 최대한 줄이고 유효성 검사같은 실시간으로 체크하는 부분이 필요없다고 생각해서입니다.
  • 관리자 페이지에서는 toast 알림을 사용하기 때문에 일관성을 위해 setError를 setSnackBar로 변경시켰습니다.
  • get 요청들에 useCallback을 적용시켜놨습니다.
  • Admin 기본 스타일만 적용시켜놨습니다.(추후에 수정이 필요하다면 수정)

추가 필요 작업

  • 거래내역 내에서 유저별 거래내역 검색 및 필터링 기능 추가
  • backend api 작업 끝나면 mockInstance -> instanceInManage로 변경

✅ 변경로직

박형준 added 30 commits August 7, 2023 12:33
@PHJoon PHJoon self-assigned this Aug 10, 2023
const rankWin = Number(rankWinRef.current?.value);
const rankLose = Number(rankLoseRef.current?.value);

if (attendance <= 0 || normal <= 0 || rankWin <= 0 || rankLose <= 0) {
Copy link
Member

@hyobb109 hyobb109 Aug 10, 2023

Choose a reason for hiding this comment

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

랭크게임 패자에게 코인을 안 줄 수도 있어서 0으로도 수정할 수 있도록 조건에 = 을 빼면 좋을 것 같아요!

url: `/admin/coinpolicy?page=${currentPage}&size=5`,
setState: (data) => {
// instanceInManage로 변경
const getCoinPolicyHistoryHandler = useCallback(async () => {
Copy link
Member

Choose a reason for hiding this comment

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

최적화에 대해서는 생각해보지 못했는데 더 공부해봐야겠네요! 새로운 것 배워갑니다👍

}
}, [currentPage]);

const openDetailModal = (itemHistory: IitemHistory) => {
Copy link
Member

Choose a reason for hiding this comment

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

이 모달이 여러 곳에서 쓰이던데 나중에 리팩토링한다면 id랑 content 받아서 쓸 수 있도록 분리해두어도 좋을 것 같네용

Copy link
Contributor Author

@PHJoon PHJoon Aug 10, 2023

Choose a reason for hiding this comment

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

일단은 intraId 대신 detailTitle이라는 인자에 받아서 사용하게 타입 추가해서 적용시켜놨습니다. 👍

const price = Number(priceRef.current?.value);
const discount = Number(discountRef.current?.value);

if (price < 0 || discount < 0) {
Copy link
Member

Choose a reason for hiding this comment

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

discount 최댓값도 100으로 걸어두면 좋을 것 같네요!

Copy link
Member

@hyobb109 hyobb109 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

@yoouyeon yoouyeon left a comment

Choose a reason for hiding this comment

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

관리자페이지쪽은 파일 하나의 크기가 진짜 너무 크네요...... 고생 많으셨습니다!
작업하신 내용들 모두 확인했고 잘 동작하는 것 확인했습니다.
api 에러 응답들 좀 더 구체화되면 에러 메시지들도 구체적으로 넣어주긴 해야 할 것 같네요 ㅎㅎㅜ
수고하셨습니다!!! 👍👏

Comment on lines +27 to +30
const attendanceRef = useRef<HTMLInputElement>(null);
const normalRef = useRef<HTMLInputElement>(null);
const rankWinRef = useRef<HTMLInputElement>(null);
const rankLoseRef = useRef<HTMLInputElement>(null);
Copy link
Member

Choose a reason for hiding this comment

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

굳이 재랜더링이 필요하지 않은 경우기 때문에 입력 값을 state로 관리하지 않고 useRef를 쓴건 좋은 생각인 것 같습니다!
개인적으로 저는 useRef가 많아지면 좀 헷갈리기도 하고 그래서 input 값을 state로 관리하지 않아도 되고, 입력 값을 form 형태로 전송하는 것이 자연스러운 경우에는 FormData를 활용하는 편인 것 같아요! (admin의 ModifyScoreForm 컴포넌트 에서도 이렇게 썼네요!)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

오 formData에서 input 값을가져오는 방식이 훨씬 코드 가독성도 좋고 간결하네요! 배워갑니다!!

@PHJoon
Copy link
Contributor Author

PHJoon commented Aug 10, 2023

피드백 주신 코인, 할인율 조건 추가했습니다.
openDetailModal도 여러 곳에서 사용하게 되면서 기존의 intraId를 detailTitle이라는 인자명으로 변경했습니다.

@PHJoon
Copy link
Contributor Author

PHJoon commented Aug 10, 2023

피드백 주신 useRef 대신 formData로 관리하는 방식을 editItem 모달에 적용했습니다.
재화정책 등록에도 적용하려 했으나 재화정책은 mui table이 적용됐기 때문인지 정확히는 모르겠으나 form 형식을 적용하면 cell들이 안보이는 문제가 있어서 좀 더 찾아보고 적용하겠습니다.

Copy link
Member

@yoouyeon yoouyeon left a comment

Choose a reason for hiding this comment

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

확인했습니다! 수고하셨습니당 👍

@PHJoon PHJoon merged commit 5aab622 into main Aug 11, 2023
@PHJoon PHJoon deleted the GGFE-148-관리자-상점아이템-수정-삭제-기능-추가 branch August 16, 2023 01:08
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.

3 participants