Skip to content

Commit

Permalink
Merge pull request #273 from jadmsaadaot/SUBMIT-task#316
Browse files Browse the repository at this point in the history
Make review confirmation reusable
  • Loading branch information
jadmsaadaot authored Jan 31, 2025
2 parents 252fc9f + d18b557 commit 5b39619
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 171 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import dayjs from "dayjs";
import { SubmitLink } from "@/components/Shared/SubmitLink";
import { useMemo } from "react";

interface ProjectRowProps {
type ProjectRowProps = Readonly<{
submissionPackage: SubmissionPackage;
}
}>;

export default function StaffTableRow({ submissionPackage }: ProjectRowProps) {
const navigate = useNavigate();
Expand Down
90 changes: 11 additions & 79 deletions submit-web/src/components/Submission/DocumentRow/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
import { useEffect, useState } from "react";
import { useState } from "react";
import { Link as MuiLink, TableRow, Typography } from "@mui/material";
import { Submission } from "@/models/Submission";
import {
SUBMISSION_ITEM_METHOD,
SUBMISSION_ITEM_MODAL_CONTENT,
SUBMISSION_ITEM_TYPE,
SubmissionItem,
} from "@/models/SubmissionItem";
import { useUpdateStateSubmissionPackage } from "@/hooks/api/usePackages";
import { useParams } from "@tanstack/react-router";
import { PACKAGE_STATUS } from "@/models/Package";
import { useModal } from "@/components/Shared/Modals/modalStore";
import { SubmissionItem } from "@/models/SubmissionItem";
import { notify } from "@/components/Shared/Snackbar/snackbarStore";
import ConfirmationModal from "@/components/Shared/Modals/ConfirmationModal";
import { getObjectFromS3 } from "@/components/Shared/Table/utils";
import { SubmitTableCell } from "@/components/Shared/Table/common";
import { StatusCell } from "./StatusCell";
import SubmissionItemReviewConfirmation from "../SubmissionItemReviewConfirmation";

type DocumentRowProps = Readonly<{
documentSubmission: Submission;
Expand All @@ -26,71 +17,13 @@ export default function DocumentRow({
documentSubmission,
submissionItem,
}: DocumentRowProps) {
const { submissionPackageId } = useParams({ strict: false });
const [pendingGetObject, setPendingGetObject] = useState(false);
const {
setOpen: setOpenModal,
setClose: setCloseModal,
setIsLoading,
} = useModal();

const {
submitted_document: { name, url },
version,
submitted_by,
} = documentSubmission;
const isConsultationRecord =
name === SUBMISSION_ITEM_TYPE.CONSULTATION_RECORD;

const subItemName = submissionItem.type.name;

const {
mutate: updateStateSubmissionPackage,
isPending: updatingSubmission,
} = useUpdateStateSubmissionPackage({
onError: () => {
setCloseModal();
notify.error("Failed to start review");
},
onSuccess: () => {
setCloseModal();
downloadDocument();
notify.success("Successfully started review");
},
});

useEffect(() => {
setIsLoading(updatingSubmission);
}, [updatingSubmission, setIsLoading]);

const openConfirmationModal = () => {
const { title, description, confirmText } = SUBMISSION_ITEM_MODAL_CONTENT[
submissionItem.type.name
] || {
title: `Start ${subItemName} Review`,
description: `Would you like to start the ${subItemName} review now? This will begin the review counter.`,
confirmText: `Start ${subItemName} Review`,
};

setOpenModal(
<ConfirmationModal
onConfirm={() => {
updateStateSubmissionPackage({
packageId: Number(submissionPackageId),
data: {
status: isConsultationRecord
? PACKAGE_STATUS.UNDER_CONSULTATION_CHECK.value
: PACKAGE_STATUS.UNDER_REVIEW.value,
},
});
}}
title={title}
description={description}
confirmText={confirmText}
cancelText="Start Later"
/>
);
};

const downloadDocument = async () => {
try {
Expand All @@ -105,14 +38,6 @@ export default function DocumentRow({
};

const openDocument = () => {
if (
!submissionItem.review_start_date &&
submissionItem.type.submission_method ===
SUBMISSION_ITEM_METHOD.DOCUMENT_UPLOAD
) {
openConfirmationModal();
return;
}
downloadDocument();
};

Expand All @@ -129,7 +54,14 @@ export default function DocumentRow({
mx: 0.5,
}}
>
<MuiLink onClick={openDocument}>{name}</MuiLink>
<SubmissionItemReviewConfirmation
packageId={submissionItem.package_id}
itemType={submissionItem.type.name}
onClick={openDocument}
bypass={Boolean(submissionItem.review_start_date)}
>
<MuiLink>{name}</MuiLink>
</SubmissionItemReviewConfirmation>
</Typography>
</SubmitTableCell>
<SubmitTableCell align="right">{submitted_by || ""}</SubmitTableCell>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import React, { useEffect } from "react";
import {
SUBMISSION_ITEM_MODAL_CONTENT,
SUBMISSION_ITEM_TYPE,
SubmissionItemTypeName,
} from "@/models/SubmissionItem";
import { useUpdateStateSubmissionPackage } from "@/hooks/api/usePackages";
import { useModal } from "@/components/Shared/Modals/modalStore";
import { notify } from "@/components/Shared/Snackbar/snackbarStore";
import ConfirmationModal from "@/components/Shared/Modals/ConfirmationModal";
import { PACKAGE_STATUS } from "@/models/Package";

const acceptedSubmissionItemTypes = [
SUBMISSION_ITEM_TYPE.CONSULTATION_RECORD,
SUBMISSION_ITEM_TYPE.MANAGEMENT_PLAN,
];

const ItemTypePackageStatusMap = {
[SUBMISSION_ITEM_TYPE.CONSULTATION_RECORD]:
PACKAGE_STATUS.UNDER_CONSULTATION_CHECK.value,
[SUBMISSION_ITEM_TYPE.MANAGEMENT_PLAN]: PACKAGE_STATUS.UNDER_REVIEW.value,
};

type SubmissionItemReviewConfirmationProps = Readonly<{
packageId: number;
itemType: SubmissionItemTypeName;
onClick: () => void;
children: React.ReactElement;
bypass?: boolean;
}>;

export default function SubmissionItemReviewConfirmation({
children,
onClick,
itemType,
packageId,
bypass = false,
}: SubmissionItemReviewConfirmationProps) {
const {
setOpen: setOpenModal,
setClose: setCloseModal,
setIsLoading,
} = useModal();

const {
mutate: updateStateSubmissionPackage,
isPending: updatingSubmission,
} = useUpdateStateSubmissionPackage({
onError: () => {
setCloseModal();
notify.error("Failed to start review");
},
onSuccess: () => {
setCloseModal();
onClick();
notify.success("Successfully started review");
},
});

useEffect(() => {
setIsLoading(updatingSubmission);
}, [updatingSubmission, setIsLoading]);

const openConfirmationModal = () => {
const { title, description, confirmText } = SUBMISSION_ITEM_MODAL_CONTENT[
itemType
] || {
title: `Start ${itemType} Review`,
description: `Would you like to start the ${itemType} review now? This will begin the review counter.`,
confirmText: `Start ${itemType} Review`,
};

setOpenModal(
<ConfirmationModal
onConfirm={() => {
updateStateSubmissionPackage({
packageId: packageId,
data: {
status: ItemTypePackageStatusMap[itemType],
},
});
}}
title={title}
description={description}
confirmText={confirmText}
cancelText="Start Later"
/>,
);
};

const handleBypassClick = () => {
onClick();
};

const handleConfirmationClick = () => {
if (
!acceptedSubmissionItemTypes.includes(itemType) ||
!ItemTypePackageStatusMap[itemType]
) {
notify.error(`Cannot start review on this item type: ${itemType}`);
return;
}
openConfirmationModal();
};

const childrenWithProps = React.Children.map(children, (child) => {
if (React.isValidElement(child)) {
return React.cloneElement(child as React.ReactElement, {
onClick: bypass ? handleBypassClick : handleConfirmationClick,
});
}
return child;
});

return <>{childrenWithProps}</>;
}
Loading

0 comments on commit 5b39619

Please sign in to comment.