import type { ShipmentInput, ShipmentOrderOptionDto } from "@mrp/shared/dist/shipping/types.js"; import { useEffect, useState } from "react"; import { Link, useNavigate, useParams, useSearchParams } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { emptyShipmentInput, shipmentStatusOptions } from "./config"; export function ShipmentFormPage({ mode }: { mode: "create" | "edit" }) { const { token } = useAuth(); const navigate = useNavigate(); const { shipmentId } = useParams(); const [searchParams] = useSearchParams(); const seededOrderId = searchParams.get("orderId") ?? ""; const [form, setForm] = useState({ ...emptyShipmentInput, salesOrderId: seededOrderId }); const [orderOptions, setOrderOptions] = useState([]); const [orderSearchTerm, setOrderSearchTerm] = useState(""); const [orderPickerOpen, setOrderPickerOpen] = useState(false); const [status, setStatus] = useState(mode === "create" ? "Create a new shipment." : "Loading shipment..."); const [isSaving, setIsSaving] = useState(false); useEffect(() => { if (!token) { return; } api.getShipmentOrderOptions(token).then((options) => { setOrderOptions(options); const seeded = options.find((option) => option.id === seededOrderId); if (seeded && mode === "create") { setOrderSearchTerm(`${seeded.documentNumber} - ${seeded.customerName}`); } }).catch(() => setOrderOptions([])); }, [mode, seededOrderId, token]); useEffect(() => { if (!token || mode !== "edit" || !shipmentId) { return; } api.getShipment(token, shipmentId) .then((shipment) => { setForm({ salesOrderId: shipment.salesOrderId, status: shipment.status, shipDate: shipment.shipDate, carrier: shipment.carrier, serviceLevel: shipment.serviceLevel, trackingNumber: shipment.trackingNumber, packageCount: shipment.packageCount, notes: shipment.notes, }); setOrderSearchTerm(`${shipment.salesOrderNumber} - ${shipment.customerName}`); setStatus("Shipment loaded."); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : "Unable to load shipment."; setStatus(message); }); }, [mode, shipmentId, token]); function updateField(key: Key, value: ShipmentInput[Key]) { setForm((current) => ({ ...current, [key]: value })); } function getSelectedOrder(orderId: string) { return orderOptions.find((option) => option.id === orderId) ?? null; } async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!token) { return; } setIsSaving(true); setStatus("Saving shipment..."); try { const saved = mode === "create" ? await api.createShipment(token, form) : await api.updateShipment(token, shipmentId ?? "", form); navigate(`/shipping/shipments/${saved.id}`); } catch (error: unknown) { const message = error instanceof ApiError ? error.message : "Unable to save shipment."; setStatus(message); setIsSaving(false); } } return (

Shipping Editor

{mode === "create" ? "New Shipment" : "Edit Shipment"}

Cancel