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

[회비] 회비 납부 문서를 인터널 DB에 반영하는 회비 내역 동기화 기능 추가 #197

Merged
merged 4 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/api/dues/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,7 @@ export const postSendDues = ({ year, month, explanation }: SendDuesData) => {
export const postSendDuesByDM = () => {
return accessClient.post('/dues/send/slack/dues/dm');
};

export const postDuesSheetSync = () => {
return accessClient.post('/dues/sheet-sync');
};
Copy link

Choose a reason for hiding this comment

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

코드를 검토한 결과, 오류는 발견되지 않았습니다. 그러나 몇 가지 개선할 수 있는 사항이 있습니다.

  1. 함수 이름과 목적: postDuesSheetSync라는 함수는 sheet-sync와 관련된 데이터를 전송하는 것으로 보입니다. 이 함수를 사용하는 컨텍스트가 불분명할 수 있으므로, 주석을 추가하여 함수의 목적을 명확히 하면 좋을 것 같습니다.

  2. 에러 처리: 네트워크 요청 후 반환되는 Promise에 대해 에러 처리를 추가함으로써, 이 함수가 실패할 경우 어떻게 처리할지 추가하는 것이 좋습니다.

다음은 개선 제안 사항입니다.

@@ -58,3 +58,7 @@ export const postSendDuesByDM = () => {
 
+// Dues sheet synchronization 요청을 위한 함수
 export const postDuesSheetSync = () => {
-  return accessClient.post('/dues/sheet-sync');
+  return accessClient.post('/dues/sheet-sync').catch(error => {
+    console.error("Error syncing dues sheet:", error);
+    throw error;
+  });
 };

주요 개선 사항:

  • 함수에 대한 설명을 추가해 가독성을 높였습니다.
  • 에러 처리를 추가하여 요청이 실패할 경우 적절히 대응할 수 있도록 했습니다.

33 changes: 25 additions & 8 deletions src/page/EditDues/components/AlertModal/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,49 @@ interface AlertModalProps {
onClose: () => void;
handleSend: (explanation: string) => void;
handleSendByDM: () => void;
type: 'notice' | 'dm' | undefined;
handleSheetSync: () => void;
type: 'notice' | 'dm' | 'sheet-sync' | undefined;
}

export default function AlertModal({
open, onClose, handleSend, handleSendByDM, type,
open, onClose, handleSend, handleSendByDM, handleSheetSync, type,
}: AlertModalProps) {
const [explanation, setExplanation] = useState('');

const handleSubmitNotice = () => {
if (type === 'notice') {
handleSend(explanation);
return;
switch (type) {
case 'notice':
handleSend(explanation);
onClose();
break;
case 'dm':
handleSendByDM();
onClose();
break;
case 'sheet-sync':
handleSheetSync();
onClose();
break;
default:
break;
}
handleSendByDM();
};
return (
<Modal
open={open}
onClose={onClose}
>
<div css={S.modal}>
<h2>주의해주세요! 슬랙으로 메시지가 전송됩니다.</h2>
{type === 'sheet-sync' ? (
<h2>회비 납부 문서와 인터널 회비 내역이 동기화됩니다.</h2>
) : (
<h2>주의해주세요! 슬랙으로 메시지가 전송됩니다.</h2>
)}
{type === 'notice' && (
<TextareaAutosize css={S.noticeInput} placeholder="추가 공지를 작성해주세요" value={explanation} onChange={(e) => setExplanation(e.target.value)} />
)}
<div>
<Button onClick={handleSubmitNotice}>전송</Button>
<Button onClick={handleSubmitNotice}>{type === 'sheet-sync' ? '동기화' : '전송'}</Button>
</div>
</div>
</Modal>
Expand Down
2 changes: 1 addition & 1 deletion src/page/EditDues/components/AlertModal/style.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export const modal = css`
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 450px;
width: 550px;
display: flex;
flex-direction: column;
align-items: center;
Copy link

Choose a reason for hiding this comment

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

주요 사항:

  • 코드의 스타일에 대해 개선이 필요합니다. 특히, modal의 너비( width )를 변경한 부분에 대한 의도를 명확히 하기 위해 주석을 추가하는 것이 좋습니다.
  • 코드 자체에는 오류가 없으나, 인라인 스타일링을 사용하는 대신 변수를 활용하거나, CSS를 더 구조화할 수 있는 방법을 고려할 수 있습니다.

개선 제안 사항:

@@ -5,7 +5,9 @@ export const modal = css`
   transform: translate(-50%, -50%);
-  width: 450px;
+  width: 550px; // 모달의 너비를 550px로 변경하여 더 많은 내용을 표시할 수 있게 함
   display: flex;
   flex-direction: column;
   align-items: center;

해당 수정 사항은 코드의 가독성을 높이고, 수정 이유를 다른 개발자들이 이해할 수 있도록 도와줍니다.

Expand Down
13 changes: 11 additions & 2 deletions src/page/EditDues/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
ChangeEvent, Suspense, useEffect, useState,
} from 'react';
import {
useDeleteDues, useGetAllDues, usePostDues, usePostSendDues, usePostSendDuesByDM, usePutDues,
useDeleteDues, useGetAllDues, usePostDues, usePostDuesSheetSync, usePostSendDues, usePostSendDuesByDM, usePutDues,
} from 'query/dues';
import useBooleanState from 'util/hooks/useBooleanState.ts';
import { STATUS_MAPPING } from 'util/constants/status';
Expand All @@ -37,7 +37,7 @@ interface SortAnchorEl {
unpaidCount: null | HTMLElement;
}

type NoticeType = 'notice' | 'dm';
type NoticeType = 'notice' | 'dm' | 'sheet-sync';

function DefaultTable() {
const param = useQueryParam('page');
Expand Down Expand Up @@ -88,6 +88,7 @@ function DefaultTable() {
const deleteDuesMutation = useDeleteDues();
const postSendDuesMutation = usePostSendDues();
const postSendDuesByDMMutation = usePostSendDuesByDM();
const postDuesSheetSyncMutation = usePostDuesSheetSync();

const handleNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const searchName = e.target.value;
Expand Down Expand Up @@ -236,6 +237,10 @@ function DefaultTable() {
postSendDuesByDMMutation.mutate();
};

const handleDuesSheetSync = () => {
postDuesSheetSyncMutation.mutate();
};

const handleOpenNoticeModal = (e: React.MouseEvent<HTMLButtonElement>) => {
const { name } = e.target as HTMLButtonElement;
setNoticeType(name as NoticeType);
Expand All @@ -251,6 +256,9 @@ function DefaultTable() {
<div>
{(myInfo.authority === 'ADMIN' || myInfo.authority === 'MANAGER') && (
<>
<Button css={S.noticeButton} name="sheet-sync" onClick={(e) => handleOpenNoticeModal(e)}>
회비 내역 동기화
</Button>
<Button css={S.noticeButton} name="notice" onClick={(e) => handleOpenNoticeModal(e)}>
회비 공지하기
</Button>
Expand All @@ -265,6 +273,7 @@ function DefaultTable() {
onClose={closeNoticeModal}
handleSend={handleNoticeDues}
handleSendByDM={handleSendDuesByDM}
handleSheetSync={handleDuesSheetSync}
type={noticeType}
/>
)}
Expand Down
21 changes: 19 additions & 2 deletions src/query/dues.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useMutation, useSuspenseQuery } from '@tanstack/react-query';
import { QueryClient, useMutation, useSuspenseQuery } from '@tanstack/react-query';
import {
DeleteDuesProps,
DuesOptions, NewDuesData, deleteDues, getAllDues, postDues, postSendDues, postSendDuesByDM, putDues,
DuesOptions, NewDuesData, deleteDues, getAllDues, postDues, postDuesSheetSync, postSendDues, postSendDuesByDM, putDues,
} from 'api/dues';
import { DuesInfo } from 'model/dues/allDues';
import { useSnackBar } from 'ts/useSnackBar';
Expand Down Expand Up @@ -73,3 +73,20 @@ export const usePostSendDuesByDM = () => {
});
return postSendDuesByDMMutation;
};

export const usePostDuesSheetSync = () => {
const openSnackBar = useSnackBar();
const queryClient = new QueryClient();

return useMutation({
mutationKey: ['postDuesSheetSync'],
mutationFn: () => postDuesSheetSync(),
onError: (error) => openSnackBar({ type: 'error', message: error.message }),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ['dues'],
});
openSnackBar({ type: 'success', message: '회비 시트 동기화를 완료했습니다.' });
},
});
};
Loading