import Link from "next/link"; import { format, formatDistanceToNowStrict } from "date-fns"; import { cn } from "@/lib/utils"; import type { AwaitingDelivery as AwaitingDeliveryRow } from "@/lib/dashboard/ops"; import type { DeliveryRequestView } from "@/lib/render-pipeline/delivery-requests"; import { DELIVERABLE_LABEL, type Deliverable } from "@/lib/render-pipeline/delivery-request-state"; const STAGE_LABEL: Record = { AWAITING_UPLOAD: "Not uploaded", AWAITING_SHARE: "Uploaded — link not shared", }; const SEVERITY_STYLES: Record = { normal: "bg-zinc-500/15 text-zinc-300 border-zinc-500/30", warning: "bg-amber-500/15 text-amber-400 border-amber-500/30", critical: "bg-red-500/15 text-red-400 border-red-500/30", }; const ROW_CLASS = "flex items-center gap-3 border-b border-zinc-800/60 px-4 py-2.5 last:border-b-0 hover:bg-zinc-900/40"; const PILL_CLASS = "shrink-0 rounded-full border px-2 py-0.5 text-xs whitespace-nowrap"; /** * Everything a client is owed: what they asked for that has not fully gone * out, and built packages they do not have yet. A row only leaves this list * when the upload location and who the link went to are on record (or a * request is cancelled with a reason) — never because time passed or someone * remembers doing it. */ export function AwaitingDelivery({ requests, packages, }: { requests: DeliveryRequestView[]; packages: AwaitingDeliveryRow[]; }) { if (requests.length === 0 && packages.length === 0) { return (
Nothing is owed to a client.
); } return (
{requests.map((r) => (
Request #{r.requestNumber}{" "} {DELIVERABLE_LABEL[r.deliverable as Deliverable] ?? r.deliverable} {r.episode ? ` for ${r.episode}` : ""} {" "} {r.projectCode}
asked by {r.requestedBy} {formatDistanceToNowStrict(r.createdAt)} ago {r.dueDate ? ` · due ${format(r.dueDate, "d MMM")}` : ""}
{r.deliveredCount} of {r.lineCount} delivered ))} {packages.map((p) => (
#{p.packageNumber}{" "} {p.name}{" "} {p.projectCode} {p.episode ? ` · ${p.episode}` : ""}
{p.itemCount} shot{p.itemCount === 1 ? "" : "s"} · built {formatDistanceToNowStrict(p.builtAt)} ago
{STAGE_LABEL[p.stage]} ))}
); }