mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
130 lines
3.7 KiB
TypeScript
130 lines
3.7 KiB
TypeScript
|
|
import { useEffect, useMemo, useState } from "react";
|
||
|
|
import { showCompDocDraftSavedToast } from "@/app/(protected)/workorders/_components/comp-doc/comp-doc-draft-toast";
|
||
|
|
import { useLocationDetail } from "@/domain/locations/use-cases/use-location-detail";
|
||
|
|
import type {
|
||
|
|
CompDocData,
|
||
|
|
CompDocSaveStatus,
|
||
|
|
DocFields,
|
||
|
|
DocState,
|
||
|
|
} from "@/domain/work-orders/types/completion-doc";
|
||
|
|
import type { WorkOrderTableRow } from "@/domain/work-orders/types/work-order-table-row";
|
||
|
|
import { getMockWoWizardLocationDetail } from "@/domain/work-orders/mocks/wo-wizard-mock-data";
|
||
|
|
import { buildDocHtml, printDoc } from "@/domain/work-orders/utils/completion-doc-html";
|
||
|
|
import { resolveCompDocSite } from "@/domain/work-orders/utils/completion-doc-site";
|
||
|
|
import {
|
||
|
|
DOC_STATE_CFG,
|
||
|
|
docStateOf,
|
||
|
|
fmtDocNow,
|
||
|
|
} from "@/domain/work-orders/utils/completion-doc-state";
|
||
|
|
|
||
|
|
type UseCompDocDialogParams = {
|
||
|
|
row: WorkOrderTableRow;
|
||
|
|
open: boolean;
|
||
|
|
data?: CompDocData;
|
||
|
|
onSave: (data: CompDocData, status: CompDocSaveStatus) => void;
|
||
|
|
onDateCompletedChange?: (date: string) => void;
|
||
|
|
};
|
||
|
|
|
||
|
|
export function useCompDocDialog({
|
||
|
|
row,
|
||
|
|
open,
|
||
|
|
data,
|
||
|
|
onSave,
|
||
|
|
onDateCompletedChange,
|
||
|
|
}: UseCompDocDialogParams) {
|
||
|
|
const locId = String(row.locationId || "");
|
||
|
|
const isMockLocation = locId.startsWith("mock-");
|
||
|
|
const { data: apiLocationDetail } = useLocationDetail(
|
||
|
|
isMockLocation || !locId ? undefined : locId,
|
||
|
|
);
|
||
|
|
const locationDetail = isMockLocation ? getMockWoWizardLocationDetail(locId) : apiLocationDetail;
|
||
|
|
const site = useMemo(() => resolveCompDocSite(row, locationDetail), [row, locationDetail]);
|
||
|
|
|
||
|
|
const [notes, setNotes] = useState("");
|
||
|
|
const [docState, setDocState] = useState<DocState>("draft");
|
||
|
|
const [generatedAt, setGeneratedAt] = useState("");
|
||
|
|
const [editDateCompleted, setEditDateCompleted] = useState("");
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
if (!open) return;
|
||
|
|
setNotes(data?.notes ?? "");
|
||
|
|
setDocState(docStateOf(row.docStatus));
|
||
|
|
setGeneratedAt(data?.generatedAt ?? "");
|
||
|
|
setEditDateCompleted(row.completedDate || "");
|
||
|
|
}, [open, row.id, row.docStatus, row.completedDate, data?.notes, data?.generatedAt]);
|
||
|
|
|
||
|
|
const amazonRep = row.pocName || "";
|
||
|
|
const seaRep = row.tech || "";
|
||
|
|
const cfg = DOC_STATE_CFG[docState];
|
||
|
|
const isNotRequired = docState === "not-required";
|
||
|
|
const isGenerated = docState === "generated";
|
||
|
|
|
||
|
|
const docFields: DocFields = {
|
||
|
|
street: site.street,
|
||
|
|
city: site.city,
|
||
|
|
state: site.state,
|
||
|
|
zip: site.zip,
|
||
|
|
dateCompleted: editDateCompleted,
|
||
|
|
amazonRep,
|
||
|
|
seaRep,
|
||
|
|
};
|
||
|
|
|
||
|
|
function persist(extra: Partial<CompDocData>, status: CompDocSaveStatus) {
|
||
|
|
onSave({ notes, generatedAt, ...extra }, status);
|
||
|
|
}
|
||
|
|
|
||
|
|
function syncCompletedDateIfChanged() {
|
||
|
|
if (editDateCompleted !== (row.completedDate || "")) {
|
||
|
|
onDateCompletedChange?.(editDateCompleted);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleMarkNotRequired() {
|
||
|
|
setDocState("not-required");
|
||
|
|
persist({}, "NN");
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleUndo() {
|
||
|
|
setDocState("draft");
|
||
|
|
persist({}, "No");
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleSaveDraft() {
|
||
|
|
persist({}, "No");
|
||
|
|
syncCompletedDateIfChanged();
|
||
|
|
showCompDocDraftSavedToast();
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleGenerate() {
|
||
|
|
const ts = fmtDocNow();
|
||
|
|
setGeneratedAt(ts);
|
||
|
|
setDocState("generated");
|
||
|
|
persist({ generatedAt: ts }, "Yes");
|
||
|
|
syncCompletedDateIfChanged();
|
||
|
|
}
|
||
|
|
|
||
|
|
function handleDownloadPdf() {
|
||
|
|
printDoc(buildDocHtml(row, { notes, generatedAt }, docFields));
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
site,
|
||
|
|
notes,
|
||
|
|
setNotes,
|
||
|
|
docState,
|
||
|
|
generatedAt,
|
||
|
|
editDateCompleted,
|
||
|
|
setEditDateCompleted,
|
||
|
|
amazonRep,
|
||
|
|
seaRep,
|
||
|
|
cfg,
|
||
|
|
isNotRequired,
|
||
|
|
isGenerated,
|
||
|
|
handleMarkNotRequired,
|
||
|
|
handleUndo,
|
||
|
|
handleSaveDraft,
|
||
|
|
handleGenerate,
|
||
|
|
handleDownloadPdf,
|
||
|
|
};
|
||
|
|
}
|