import { useMemo, useState } from "react"; import { useNavigate } from "react-router"; import { useQuery } from "@tanstack/react-query"; import { useVendorPortal } from "@/app/v/_components/vendor-portal-context"; import { Text } from "@/components/ui/text"; import { vendorPortalApi } from "@/domain/vendor-portal/api/vendor-portal-api"; import { formatVendorPortalDateTime, vendorPortalStatusClass, } from "@/domain/vendor-portal/lib/status-helpers"; import { VENDOR_PORTAL_DISPATCH_FILTERS, applyVendorPortalDispatchFilter, getVendorPortalDispatchFilter, type VendorPortalDispatchFilterKey, } from "@/domain/vendor-portal/lib/dispatch-filters"; import { queryKeys } from "@/infra/query-key/query-key"; function formatDate(value?: string) { if (!value) return "—"; const date = new Date(value); if (Number.isNaN(date.getTime())) return "—"; return date.toISOString().slice(0, 10); } function formatMoney(value?: number) { if (value == null) return "—"; return `$${Number(value).toFixed(2)}`; } export default function VendorPortalPosPage() { const { token } = useVendorPortal(); const navigate = useNavigate(); const [filter, setFilter] = useState("open"); const [search, setSearch] = useState(""); const { data: dispatches = [], isLoading, error, } = useQuery({ queryKey: queryKeys.vendorPortal.dispatches(token), queryFn: () => vendorPortalApi.listDispatches(token), enabled: Boolean(token), }); const activeFilter = getVendorPortalDispatchFilter(filter); const visible = useMemo(() => { const needle = search.trim().toLowerCase(); return applyVendorPortalDispatchFilter(dispatches, activeFilter).filter((dispatch) => { if (!needle) return true; return ( (dispatch.poNumber || "").toLowerCase().includes(needle) || (dispatch.dispatchNumber || "").toLowerCase().includes(needle) || (dispatch.internalWONumber || "").toLowerCase().includes(needle) || (dispatch.workOrderTitle || "").toLowerCase().includes(needle) || (dispatch.locationName || "").toLowerCase().includes(needle) ); }); }, [dispatches, activeFilter, search]); return ( <>
Your Purchase Orders
Every PO issued to your company, with current status and dollar value.
{VENDOR_PORTAL_DISPATCH_FILTERS.map((item) => ( ))} setSearch(event.target.value)} style={{ marginLeft: "auto", minWidth: 240 }} />
{isLoading &&
Loading POs…
} {error?.message} {!isLoading && !error && visible.length === 0 && (
No POs match this view.
)} {!isLoading && !error && visible.length > 0 && (
{visible.map((dispatch) => ( navigate(`../dispatch/${dispatch.id}`)}> ))}
PO # Dispatch # Status NTE Location Dispatched Scheduled Completed
{dispatch.poNumber || "—"} {dispatch.dispatchNumber} {dispatch.status} {formatMoney(dispatch.nteAmount)} {dispatch.locationName || "—"} {dispatch.locationCity ? ` · ${dispatch.locationCity}` : ""} {dispatch.locationState ? `, ${dispatch.locationState}` : ""} {dispatch.dispatchedAt ? formatVendorPortalDateTime(dispatch.dispatchedAt) : "—"} {formatDate(dispatch.scheduledDate)} {formatDate(dispatch.completedDate)}
)} ); }