diff --git a/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts b/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts
index 47e0ba7a..e7c2293d 100644
--- a/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts
+++ b/apps/graduate/src/admin/features/studentDetail/types/studentDetail.ts
@@ -8,5 +8,6 @@ export interface StudentDetailApiResponse {
advisor: string;
major: string;
capstoneCompletion: boolean;
+ phone: string;
status: SubmissionStatus;
}
diff --git a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx
index 9665f5d5..fa1bb82f 100644
--- a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx
+++ b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewPage.tsx
@@ -13,11 +13,16 @@ import { getSubmissionTypeIndex } from '../../schedule/constants';
import { useFile } from '../model';
import * as style from '../styles/FilePreviewPage.css';
-import { useGraduationBatchApproval } from '~/admin/entities/graduation-approval/model';
+import {
+ useGraduationBatchApproval,
+ useGraduationBatchDisapproval,
+} from '~/admin/entities/graduation-approval/model';
import { useStudentDetail } from '~/admin/features/studentDetail';
import {
APPROVE_FAILED,
APPROVE_SUCCESS,
+ DISAPPROVE_FAILED,
+ DISAPPROVE_SUCCESS,
} from '~/admin/shared/constants/actionTexts';
export default function FilePreviewPage() {
@@ -52,6 +57,23 @@ export default function FilePreviewPage() {
},
});
+ const { disapproveGraduationUsers, mutation: disapprovalMutation } =
+ useGraduationBatchDisapproval({
+ onSuccess: async () => {
+ toast.success(DISAPPROVE_SUCCESS);
+ await refetch();
+ },
+ });
+
+ const handleCancelApprove = async () => {
+ const result = await disapproveGraduationUsers([
+ { graduationUserId, submissionId: fileId },
+ ]);
+ if (result.successCount === 0) {
+ toast.error(DISAPPROVE_FAILED);
+ }
+ };
+
const clearHideTimeout = () => {
if (hideTimeoutRef.current !== null) {
clearTimeout(hideTimeoutRef.current);
@@ -180,9 +202,11 @@ export default function FilePreviewPage() {
name={name}
isApproved={approval ?? false}
onApprove={handleApprove}
+ onCancelApprove={handleCancelApprove}
onChangeFile={handleNextFile}
canNavigate={canNavigate}
isApproving={approvalMutation.isPending}
+ isCancellingApprove={disapprovalMutation.isPending}
/>
diff --git a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx
index ef6ba92a..d2a7c3a9 100644
--- a/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx
+++ b/apps/graduate/src/admin/pages/filePreview/ui/FilePreviewToolbar.tsx
@@ -7,9 +7,11 @@ interface FilePreviewToolbarProps {
name: string;
isApproved: boolean;
onApprove: () => void;
+ onCancelApprove: () => void;
onChangeFile: () => void;
canNavigate: boolean;
isApproving: boolean;
+ isCancellingApprove: boolean;
}
export default function FilePreviewToolbar({
@@ -17,23 +19,38 @@ export default function FilePreviewToolbar({
name,
isApproved,
onApprove,
+ onCancelApprove,
onChangeFile,
canNavigate,
isApproving,
+ isCancellingApprove,
}: FilePreviewToolbarProps) {
return (
학번: {studentId}
이름: {name}
-
+ {isApproved ? (
+
+ ) : (
+
+ )}