import { useState } from "react"; import { Text } from "@/components/ui/text"; import { UpliftRequestForm } from "@/app/v/[token]/dispatch/_components/uplift-request-form"; import type { VendorMediaUsage } from "@/domain/vendor-portal/lib/document-validation"; import type { UpliftFormValues } from "@/domain/vendor-portal/lib/uplift-validation"; import type { VendorPortalUpliftRequest } from "@/domain/vendor-portal/types/vendor-portal"; import { formatDateTime } from "@/lib/time-utils"; type UpliftRequestCardProps = { request: VendorPortalUpliftRequest; locked: boolean; canAct: boolean; uploadingPercent: number | undefined; submitting: boolean; errorMessage: string; onWithdraw: (request: VendorPortalUpliftRequest) => void; onRevise: (request: VendorPortalUpliftRequest, values: UpliftFormValues) => void; onCancelRevise: () => void; mediaUsage?: VendorMediaUsage; }; const WITHDRAWABLE_STATUSES = new Set(["Pending", "ChangesRequested"]); function statusClassName(status: string): string { return `vp-uplift-status-${String(status).toLowerCase()}`; } function availableActions(request: VendorPortalUpliftRequest, locked: boolean, canAct: boolean) { // Requests raised from the work order are visible but read-only to the vendor. const actionable = !locked && canAct && request.raisedByVendor !== false; return { canWithdraw: actionable && WITHDRAWABLE_STATUSES.has(request.status), canRevise: actionable && request.status === "ChangesRequested", }; } // A vendor request stores the requested new NTE total; a work-order request stores the increase. function requestedTotal(request: VendorPortalUpliftRequest): number { const requested = Number(request.requestedNTE); return request.raisedByVendor === false ? Number(request.currentNTE ?? 0) + requested : requested; } export function UpliftRequestCard({ request, locked, canAct, uploadingPercent, submitting, errorMessage, onWithdraw, onRevise, onCancelRevise, mediaUsage, }: UpliftRequestCardProps) { const [revising, setRevising] = useState(false); const { canWithdraw, canRevise } = availableActions(request, locked, canAct); return (
Requested ${requestedTotal(request).toFixed(2)} (was ${Number(request.currentNTE ?? 0).toFixed(2)})
Status {request.status}
{Boolean(request.expiresAt) && (
Expires {formatDateTime(request.expiresAt as string)}
)} {Boolean(request.vendorReason) && (
Reason {request.vendorReason}
)} {Boolean(request.evidenceFileName) && (
Evidence {request.evidenceFileName} {request.evidenceContentType ? ` · ${request.evidenceContentType}` : ""}
)} {Boolean(request.decisionNote) && (
Decision {request.decisionNote} {request.decidedByName ? ` — ${request.decidedByName}` : ""}
)} {request.notificationStatus === "Error" && Boolean(request.notificationError) && (
Notification {request.notificationError}
)} {errorMessage} {revising && canRevise ? ( onRevise(request, values)} onCancel={() => { setRevising(false); onCancelRevise(); }} /> ) : (
{canWithdraw && ( )} {canRevise && ( )}
)}
); }