diff --git a/apps/admin/src/apis/controller/notice/deleteNotice.ts b/apps/admin/src/apis/controller/notice/deleteNotice.ts new file mode 100644 index 00000000..9a6dc73a --- /dev/null +++ b/apps/admin/src/apis/controller/notice/deleteNotice.ts @@ -0,0 +1,7 @@ +import { $api } from '@apis'; + +const deleteNotice = () => { + return $api.useMutation('delete', '/api/admin/notice/{id}'); +}; + +export default deleteNotice; diff --git a/apps/admin/src/apis/controller/notice/index.ts b/apps/admin/src/apis/controller/notice/index.ts index fa21aee1..82972643 100644 --- a/apps/admin/src/apis/controller/notice/index.ts +++ b/apps/admin/src/apis/controller/notice/index.ts @@ -1,6 +1,7 @@ +import deleteNotice from './deleteNotice'; import getNotice from './getNotice'; import getNoticeAvailable from './getNoticeAvailable'; import postNotice from './postNotice'; import putNotice from './putNotice'; -export { getNotice, getNoticeAvailable, postNotice, putNotice }; \ No newline at end of file +export { deleteNotice, getNotice, getNoticeAvailable, postNotice, putNotice }; diff --git a/apps/admin/src/components/common/Modals/NoticeListModal.tsx b/apps/admin/src/components/common/Modals/NoticeListModal.tsx index 357c236a..51f45f4d 100644 --- a/apps/admin/src/components/common/Modals/NoticeListModal.tsx +++ b/apps/admin/src/components/common/Modals/NoticeListModal.tsx @@ -1,8 +1,10 @@ -import { Button, IconButton } from '@components'; -import { getNotice } from '@apis'; +import { Button, IconButton, Modal, TwoButtonModalTemplate } from '@components'; +import { deleteNotice, getNotice } from '@apis'; import { components } from '@schema'; import dayjs from 'dayjs'; import { useState } from 'react'; +import { useInvalidate, useModal } from '@hooks'; +import { Slide, toast, ToastContainer } from 'react-toastify'; interface Props { selectedStudent: components['schemas']['StudentResp'] | null; @@ -13,6 +15,9 @@ const NoticeListModal = ({ selectedStudent, onClose }: Props) => { const { data: noticeData } = getNotice( selectedStudent ? { studentId: selectedStudent.id } : { studentId: 0 } ); + const { mutate: mutateDeleteNotice } = deleteNotice(); + const { invalidateAll } = useInvalidate(); + const { isOpen, openModal, closeModal } = useModal(); const notices = noticeData?.data ?? []; @@ -20,8 +25,34 @@ const NoticeListModal = ({ selectedStudent, onClose }: Props) => { null ); + const [selectedNoticeToDelete, setSelectedNoticeToDelete] = useState< + components['schemas']['NoticeResp'] | null + >(null); + const handleDeleteNotice = (noticeId: number) => { - alert(`(${noticeId}) 공지 삭제 API가 없어용`); + mutateDeleteNotice( + { + params: { + path: { + id: noticeId, + }, + }, + }, + { + onSuccess: () => { + if (selectedNoticeToDelete?.id === selectedNotice?.id) { + setSelectedNotice(null); + } + setSelectedNoticeToDelete(null); + invalidateAll(); + closeModal(); + toast.success('공지가 삭제되었습니다.'); + }, + onError: (error: unknown) => { + toast.error((error as { message?: string })?.message || '공지 삭제에 실패했습니다.'); + }, + } + ); }; if (!selectedStudent) { @@ -41,99 +72,126 @@ const NoticeListModal = ({ selectedStudent, onClose }: Props) => { } return ( -
등록된 공지가 없습니다
-등록된 공지가 없습니다
++ {notice.content} +
+- {notice.content} -
-- {dayjs(selectedNotice.startAt).format('YYYY년 M월 D일')} ~{' '} - {dayjs(selectedNotice.endAt).format('YYYY년 M월 D일')} -
-+ {dayjs(selectedNotice.startAt).format('YYYY년 M월 D일')} ~{' '} + {dayjs(selectedNotice.endAt).format('YYYY년 M월 D일')} +
++ {selectedNotice.content} +
- {selectedNotice.content} +
+ 자세히 볼 공지를 좌측에서 선택해주세요
- 자세히 볼 공지를 좌측에서 선택해주세요 -
-