import { useEffect, useState } from "react"; import type { Address, AuditEvent, OrderDetail } from "@orderops/shared"; import { Link, useParams } from "react-router-dom"; import { Toast } from "../ui/toast"; import { cancelOrder, getOrder, listAuditEvents, updateOrderItemQuantity, updateOrderNotes, updateShippingAddress } from "./order-api"; import { OrderDetailPage } from "./order-detail-page"; interface ToastState { message: string; variant: "success" | "error"; } export function OrderPage() { const { orderId } = useParams(); const [order, setOrder] = useState(null); const [auditEvents, setAuditEvents] = useState([]); const [error, setError] = useState(null); const [toast, setToast] = useState(null); const [isLoading, setIsLoading] = useState(true); async function refreshOrder(nextOrderId: string) { const [nextOrder, nextEvents] = await Promise.all([getOrder(nextOrderId), listAuditEvents(nextOrderId)]); setOrder(nextOrder); setAuditEvents(nextEvents); } useEffect(() => { if (!toast) { return; } const timeout = window.setTimeout(() => setToast(null), 3000); return () => window.clearTimeout(timeout); }, [toast]); useEffect(() => { if (!orderId) { setError("Order not found."); setIsLoading(false); return; } setIsLoading(true); setError(null); setToast(null); void refreshOrder(orderId) .catch((caught: unknown) => { setOrder(null); setAuditEvents([]); setError(caught instanceof Error ? caught.message : "Failed to load order."); }) .finally(() => setIsLoading(false)); }, [orderId]); async function runAction(action: () => Promise, successMessage: string) { if (!orderId) { return; } try { setError(null); const nextOrder = await action(); setOrder(nextOrder); await refreshOrder(orderId); setToast({ message: successMessage, variant: "success" }); } catch (caught) { setToast({ message: caught instanceof Error ? caught.message : "Request failed.", variant: "error" }); } } return (
← Back to orders {toast ? setToast(null)} variant={toast.variant} /> : null} {error ?
{error}
: null} {isLoading ?
Loading order...
: null} {!isLoading && order ? ( runAction(() => updateOrderItemQuantity(order.id, itemId, quantity), "Quantity saved.")} onSaveAddress={(address: Address) => runAction(() => updateShippingAddress(order.id, address), "Shipping address saved.")} onSaveNotes={(notes) => runAction(() => updateOrderNotes(order.id, notes), "Notes saved.")} onCancel={() => runAction(() => cancelOrder(order.id), "Order cancelled.")} /> ) : null}
); }