diff --git a/frontend/src/features/permits/pages/Application/ApplicationReview.tsx b/frontend/src/features/permits/pages/Application/ApplicationReview.tsx
index 715c490ee5..13b1ac31a1 100644
--- a/frontend/src/features/permits/pages/Application/ApplicationReview.tsx
+++ b/frontend/src/features/permits/pages/Application/ApplicationReview.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-unused-vars */
import { useContext, useEffect, useState } from "react";
import { FormProvider, useForm } from "react-hook-form";
import { useNavigate, useParams } from "react-router-dom";
@@ -23,23 +24,55 @@ import { DEFAULT_PERMIT_TYPE, PERMIT_TYPES } from "../../types/PermitType";
import { PERMIT_REVIEW_CONTEXTS } from "../../types/PermitReviewContext";
import { usePolicyEngine } from "../../../policy/hooks/usePolicyEngine";
import { useCommodityOptions } from "../../hooks/useCommodityOptions";
-import { useSubmitApplicationForReview } from "../../../queue/hooks/hooks";
import { deserializeApplicationResponse } from "../../helpers/serialize/deserializeApplication";
import OnRouteBCContext from "../../../../common/authentication/OnRouteBCContext";
import {
APPLICATIONS_ROUTES,
+ APPLICATION_QUEUE_ROUTES,
APPLICATION_STEPS,
+ APPLICATION_STEP_CONTEXTS,
+ ApplicationStepContext,
ERROR_ROUTES,
+ IDIR_ROUTES,
} from "../../../../routes/constants";
+import { CASE_ACTIVITY_TYPES } from "../../../queue/types/CaseActivityType";
+import { QueueBreadcrumb } from "../../../queue/components/QueueBreadcrumb";
+import { RejectApplicationModal } from "../../../queue/components/RejectApplicationModal";
+import {
+ useSubmitApplicationForReview,
+ useUpdateApplicationInQueueStatus,
+} from "../../../queue/hooks/hooks";
+import { Nullable } from "../../../../common/types/common";
+import { UnavailableApplicationModal } from "../../../queue/components/UnavailableApplicationModal";
export const ApplicationReview = ({
- companyId,
+ companyIdProp,
+ applicationStepContext,
+ applicationData: queueApplicationData,
}: {
- companyId: number;
+ applicationStepContext: ApplicationStepContext;
+ companyIdProp?: Nullable
;
+ applicationData?: Nullable;
}) => {
const { applicationData, setApplicationData: setApplicationContextData } =
useContext(ApplicationContext);
+ const isQueueContext =
+ applicationStepContext === APPLICATION_STEP_CONTEXTS.QUEUE;
+
+ const application = isQueueContext ? queueApplicationData : applicationData;
+
+ const companyId = getDefaultRequiredVal(
+ 0,
+ companyIdProp,
+ queueApplicationData?.companyId,
+ );
+
+ const applicationId = getDefaultRequiredVal(
+ queueApplicationData?.permitId,
+ applicationData?.permitId,
+ );
+
const { idirUserDetails } = useContext(OnRouteBCContext);
const isStaffUser = Boolean(idirUserDetails?.userRole);
@@ -49,12 +82,15 @@ export const ApplicationReview = ({
const { data: companyInfo } = useCompanyInfoDetailsQuery(companyId);
const doingBusinessAs = companyInfo?.alternateName;
- const permitType = getDefaultRequiredVal(DEFAULT_PERMIT_TYPE, applicationData?.permitType);
+ const permitType = getDefaultRequiredVal(
+ DEFAULT_PERMIT_TYPE,
+ application?.permitType,
+ );
const fee = isNoFeePermitType
? "0"
: `${calculateFeeByDuration(
permitType,
- getDefaultRequiredVal(0, applicationData?.permitData?.permitDuration),
+ getDefaultRequiredVal(0, application?.permitData?.permitDuration),
)}`;
const { setSnackBar } = useContext(SnackBarContext);
@@ -71,20 +107,26 @@ export const ApplicationReview = ({
const trailerSubTypesQuery = useTrailerSubTypesQuery();
const methods = useForm();
- // For the confirmation checkboxes
- const [allConfirmed, setAllConfirmed] = useState(false);
+ const [allConfirmed, setAllConfirmed] = useState(isQueueContext);
const [hasAttemptedSubmission, setHasAttemptedSubmission] = useState(false);
const { mutateAsync: saveApplication } = useSaveApplicationMutation();
const addToCartMutation = useAddToCart();
-
- // Submit for review (if applicable)
+ const { mutateAsync: submitForReview } = useSubmitApplicationForReview();
const {
- mutateAsync: submitForReview,
- } = useSubmitApplicationForReview();
+ mutateAsync: updateApplication,
+ data: updateApplicationResponse,
+ error: updateApplicationError,
+ isPending: updateApplicationMutationPending,
+ } = useUpdateApplicationInQueueStatus();
- const back = () => {
- navigate(APPLICATIONS_ROUTES.DETAILS(permitId), { replace: true });
+ const handleEdit = () => {
+ navigate(
+ isQueueContext
+ ? APPLICATION_QUEUE_ROUTES.EDIT(companyId, applicationId)
+ : APPLICATIONS_ROUTES.DETAILS(permitId),
+ { replace: true },
+ );
};
const handleSaveApplication = async (
@@ -98,42 +140,45 @@ export const ApplicationReview = ({
if (!allConfirmed) return;
- const companyId = applicationData?.companyId;
- const permitId = applicationData?.permitId;
- const applicationNumber = applicationData?.applicationNumber;
+ const companyId = application?.companyId;
+ const permitId = application?.permitId;
+ const applicationNumber = application?.applicationNumber;
if (!companyId || !permitId || !applicationNumber) {
return navigate(ERROR_ROUTES.UNEXPECTED);
}
- await saveApplication({
- data: {
- ...applicationData,
- permitData: {
- ...applicationData.permitData,
- doingBusinessAs, // always set most recent DBA from company info
+ await saveApplication(
+ {
+ data: {
+ ...application,
+ permitData: {
+ ...application?.permitData,
+ doingBusinessAs,
+ },
},
+ companyId,
},
- companyId,
- }, {
- onSuccess: ({ data: savedApplication }) => {
- setApplicationContextData(
- deserializeApplicationResponse(savedApplication),
- );
- followUpAction(companyId, permitId, applicationNumber);
- },
- onError: (e) => {
- console.error(e);
- if (isAxiosError(e)) {
- navigate(ERROR_ROUTES.UNEXPECTED, {
- state: {
- correlationId: e?.response?.headers["x-correlation-id"],
- },
- });
- } else {
- navigate(ERROR_ROUTES.UNEXPECTED);
- }
+ {
+ onSuccess: ({ data: savedApplication }) => {
+ setApplicationContextData(
+ deserializeApplicationResponse(savedApplication),
+ );
+ followUpAction(companyId, permitId, applicationNumber);
+ },
+ onError: (e) => {
+ console.error(e);
+ if (isAxiosError(e)) {
+ navigate(ERROR_ROUTES.UNEXPECTED, {
+ state: {
+ correlationId: e?.response?.headers["x-correlation-id"],
+ },
+ });
+ } else {
+ navigate(ERROR_ROUTES.UNEXPECTED);
+ }
+ },
},
- });
+ );
};
const proceedWithAddToCart = async (
@@ -156,64 +201,129 @@ export const ApplicationReview = ({
const setShowSnackbar = () => true;
const handleAddToCart = async () => {
- await handleSaveApplication(async (companyId, permitId, applicationNumber) => {
- await proceedWithAddToCart(companyId, [permitId], () => {
+ await handleSaveApplication(
+ async (companyId, permitId, applicationNumber) => {
+ await proceedWithAddToCart(companyId, [permitId], () => {
+ setSnackBar({
+ showSnackbar: true,
+ setShowSnackbar,
+ message: `Application ${applicationNumber} added to cart`,
+ alertType: "success",
+ });
+
+ refetchCartCount();
+ navigate(APPLICATIONS_ROUTES.BASE);
+ });
+ },
+ );
+ };
+ const continueBtnText =
+ permitType === PERMIT_TYPES.STOS && !isStaffUser
+ ? "Submit for Review"
+ : undefined;
+
+ const handleSubmitForReview = async () => {
+ if (permitType !== PERMIT_TYPES.STOS || isStaffUser) return;
+
+ await handleSaveApplication(
+ async (companyId, permitId, applicationNumber) => {
+ await submitForReview({ companyId, applicationId: permitId });
setSnackBar({
showSnackbar: true,
- setShowSnackbar,
- message: `Application ${applicationNumber} added to cart`,
+ setShowSnackbar: () => true,
+ message: `Application ${applicationNumber} submitted for review`,
alertType: "success",
});
-
- refetchCartCount();
navigate(APPLICATIONS_ROUTES.BASE);
- });
+ },
+ );
+ };
+
+ const handleApprove = async () => {
+ setHasAttemptedSubmission(true);
+ await updateApplication({
+ applicationId: permitId,
+ companyId,
+ caseActivityType: CASE_ACTIVITY_TYPES.APPROVED,
});
};
- const continueBtnText = permitType === PERMIT_TYPES.STOS && !isStaffUser
- ? "Submit for Review" : undefined;
+ const [showRejectApplicationModal, setShowRejectApplicationModal] =
+ useState(false);
- const handleSubmitForReview = async () => {
- if (permitType !== PERMIT_TYPES.STOS) return;
- if (isStaffUser) return;
+ const handleRejectButton = () => {
+ setShowRejectApplicationModal(true);
+ };
- await handleSaveApplication(async (companyId, permitId, applicationNumber) => {
- await submitForReview({
- companyId,
- applicationId: permitId,
- }, {
- onSuccess: () => {
- setSnackBar({
- showSnackbar: true,
- setShowSnackbar,
- message: `Application ${applicationNumber} submitted for review`,
- alertType: "success",
- });
-
- navigate(APPLICATIONS_ROUTES.BASE);
- },
- onError: () => {
- navigate(ERROR_ROUTES.UNEXPECTED);
- },
- });
+ const handleReject = async (comment: string) => {
+ setHasAttemptedSubmission(true);
+ await updateApplication({
+ applicationId: permitId,
+ companyId,
+ caseActivityType: CASE_ACTIVITY_TYPES.REJECTED,
+ comment,
});
};
+ const [showUnavailableApplicationModal, setShowUnavailableApplicationModal] =
+ useState(false);
+
+ const [currentClaimant, setCurrentClaimant] = useState("");
+
+ const updateApplicationResponseStatus = updateApplicationResponse?.status;
+
+ const handleCloseApplication = () => {
+ navigate(IDIR_ROUTES.STAFF_HOME);
+ };
+
+ const handleCloseUnavailableApplicationModal = () => {
+ setShowUnavailableApplicationModal(false);
+ showRejectApplicationModal && setShowRejectApplicationModal(false);
+ };
+
+ useEffect(() => {
+ if (updateApplicationResponseStatus === 201) {
+ navigate(IDIR_ROUTES.STAFF_HOME);
+ }
+ }, [updateApplicationResponse, updateApplicationResponseStatus, navigate]);
+
+ const updateApplicationErrorStatus = updateApplicationError?.response?.status;
+
+ useEffect(() => {
+ if (updateApplicationErrorStatus === 422) {
+ setCurrentClaimant(
+ updateApplicationError.response.data.error[0].additionalInfo
+ .currentClaimant,
+ );
+ setShowUnavailableApplicationModal(true);
+ }
+ }, [updateApplicationError]);
+
useEffect(() => {
window.scrollTo(0, 0);
}, []);
return (
-
+ {isQueueContext ? (
+
+ ) : (
+
+ )}
+
+ {isQueueContext && showRejectApplicationModal && (
+
setShowRejectApplicationModal(false)}
+ onConfirm={handleReject}
+ isPending={updateApplicationMutationPending}
+ />
+ )}
+
+ {isQueueContext && showUnavailableApplicationModal && (
+
+ )}
);
};
diff --git a/frontend/src/features/permits/pages/Application/components/review/ReviewActions.tsx b/frontend/src/features/permits/pages/Application/components/review/ReviewActions.tsx
index 4e9d069f72..4798ffee77 100644
--- a/frontend/src/features/permits/pages/Application/components/review/ReviewActions.tsx
+++ b/frontend/src/features/permits/pages/Application/components/review/ReviewActions.tsx
@@ -78,7 +78,7 @@ export const ReviewActions = ({
) : null}
- {reviewContext === PERMIT_REVIEW_CONTEXTS.QUEUE ? (
+ {reviewContext === PERMIT_REVIEW_CONTEXTS.QUEUE && (
<>