mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
import { useCallback, useState } from "react";
|
|
import { useMutation } from "@tanstack/react-query";
|
|
import {
|
|
VENDOR_EVIDENCE_PURPOSE,
|
|
vendorPortalApi,
|
|
} from "@/domain/vendor-portal/api/vendor-portal-api";
|
|
import type { VendorPortalDocumentStatus } from "@/domain/vendor-portal/types/vendor-portal";
|
|
|
|
const POLL_INTERVAL_MS = 1000;
|
|
const MAX_POLL_ATTEMPTS = 30;
|
|
|
|
export type EvidenceScanState = "Passed" | "Rejected" | "Timeout";
|
|
|
|
export type UploadEvidenceArgs = {
|
|
token: string;
|
|
dispatchId: number;
|
|
file: File;
|
|
};
|
|
|
|
type UseVendorUpliftEvidenceOptions = {
|
|
pollDocument: (documentId: number) => Promise<VendorPortalDocumentStatus | undefined>;
|
|
};
|
|
|
|
export function useVendorUpliftEvidence({ pollDocument }: UseVendorUpliftEvidenceOptions) {
|
|
const [uploadingPercent, setUploadingPercent] = useState<number | undefined>();
|
|
const [scanState, setScanState] = useState<EvidenceScanState | undefined>();
|
|
|
|
const uploadMutation = useMutation({
|
|
mutationFn: ({ token, dispatchId, file }: UploadEvidenceArgs) =>
|
|
vendorPortalApi.uploadDocument({
|
|
token,
|
|
dispatchId,
|
|
file,
|
|
purpose: VENDOR_EVIDENCE_PURPOSE,
|
|
onProgress: setUploadingPercent,
|
|
}),
|
|
});
|
|
|
|
const waitForScan = useCallback(
|
|
async (documentId: number): Promise<EvidenceScanState> => {
|
|
for (let attempt = 0; attempt < MAX_POLL_ATTEMPTS; attempt += 1) {
|
|
const document = await pollDocument(documentId);
|
|
if (document?.scanStatus === "Passed") {
|
|
return "Passed";
|
|
}
|
|
if (document?.scanStatus === "Rejected") {
|
|
return "Rejected";
|
|
}
|
|
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
}
|
|
return "Timeout";
|
|
},
|
|
[pollDocument],
|
|
);
|
|
|
|
const reset = useCallback(() => {
|
|
setUploadingPercent(undefined);
|
|
setScanState(undefined);
|
|
uploadMutation.reset();
|
|
}, [uploadMutation]);
|
|
|
|
return {
|
|
uploadEvidence: uploadMutation.mutateAsync,
|
|
uploadError: uploadMutation.error ? "Unable to upload the evidence file." : undefined,
|
|
uploadingPercent,
|
|
scanState,
|
|
setScanState,
|
|
waitForScan,
|
|
isUploading: uploadMutation.isPending,
|
|
reset,
|
|
};
|
|
}
|