"use client"; import { useState } from "react"; import Link from "next/link"; import { markPickupComplete } from "@/actions/pickup"; import AdminBadge from "./design-system/AdminBadge"; type OrderItem = { id: string; product_id: string; quantity: number; price: number; fulfillment?: string; products: { name: string } | null; }; type Order = { id: string; customer_name: string; customer_email: string | null; customer_phone: string | null; stop_id: string | null; status: string; subtotal: number; pickup_complete: boolean; pickup_completed_at: string | null; pickup_completed_by: string | null; created_at: string; stops: { id?: string; city: string; state: string; date: string; brand_id?: string } | null; order_items?: OrderItem[]; }; type Stop = { id: string; city: string; state: string; date: string; brand_id?: string; }; type DriverPickupPanelProps = { initialPendingOrders: Order[]; initialPickedUpOrders: Order[]; initialStops: Stop[]; brandId: string | null; canManagePickup: boolean; }; function formatPickupTime(iso: string | null) { if (!iso) return ""; const d = new Date(iso); const now = new Date(); const diffMs = now.getTime() - d.getTime(); const diffMin = Math.floor(diffMs / 60000); if (diffMin < 1) return "Just now"; if (diffMin < 60) return `${diffMin}m ago`; if (diffMin < 1440) return `${Math.floor(diffMin / 60)}h ago`; if (d.getFullYear() === now.getFullYear()) { return d.toLocaleDateString("en-US", { month: "short", day: "numeric" }); } return d.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" }); } function shortId(id: string) { return id.slice(0, 8).toUpperCase(); } export default function DriverPickupPanel({ initialPendingOrders, initialPickedUpOrders, initialStops, brandId, canManagePickup, }: DriverPickupPanelProps) { const [pendingOrders, setPendingOrders] = useState(initialPendingOrders); const [pickedUpOrders, setPickedUpOrders] = useState(initialPickedUpOrders); const [stops] = useState(initialStops); const [search, setSearch] = useState(""); const [stopFilter, setStopFilter] = useState(""); const [pickingUp, setPickingUp] = useState(null); const [showPickedUp, setShowPickedUp] = useState(true); const [pickupToast, setPickupToast] = useState(null); const filteredPending = pendingOrders.filter((o) => { const matchesSearch = !search || o.customer_name.toLowerCase().includes(search.toLowerCase()) || (o.customer_phone ?? "").includes(search) || o.id.includes(search.toUpperCase().slice(0, 8)); const matchesStop = !stopFilter || o.stop_id === stopFilter; return matchesSearch && matchesStop; }); const filteredPickedUp = pickedUpOrders.filter((o) => { const matchesSearch = !search || o.customer_name.toLowerCase().includes(search.toLowerCase()) || (o.customer_phone ?? "").includes(search) || o.id.includes(search.toUpperCase().slice(0, 8)); const matchesStop = !stopFilter || o.stop_id === stopFilter; return matchesSearch && matchesStop; }); const hasAnyPickedUp = pickedUpOrders.length > 0; async function handleMarkPickup(orderId: string) { if (!canManagePickup) return; setPickingUp(orderId); const result = await markPickupComplete(orderId, brandId); if (result.success) { const order = pendingOrders.find((o) => o.id === orderId); if (order) { setPendingOrders((prev) => prev.filter((o) => o.id !== orderId)); setPickedUpOrders((prev) => [ { ...order, pickup_complete: true, pickup_completed_at: result.pickup_completed_at, pickup_completed_by: result.pickup_completed_by, }, ...prev, ]); setPickupToast(orderId); setTimeout(() => setPickupToast(null), 3000); } } setPickingUp(null); } return (
{/* Header */}

Driver Pickup

{filteredPending.length} pending {hasAnyPickedUp && ` · ${pickedUpOrders.length} picked up`}

All Orders
{/* Filters */}
setSearch(e.target.value)} className="w-full rounded-xl border border-stone-200 bg-white pl-11 pr-4 py-3 text-sm outline-none focus:border-emerald-500 focus:ring-1 focus:ring-emerald-500" />
{/* Pending Orders */} {filteredPending.length === 0 ? (

No pending orders

Orders awaiting pickup will appear here

) : (
{filteredPending.map((order) => ( ))}
)} {/* Picked Up Toggle */} {hasAnyPickedUp && ( )} {showPickedUp && filteredPickedUp.length > 0 && (
{filteredPickedUp.map((order) => ( ))}
)} {showPickedUp && filteredPickedUp.length === 0 && stopFilter && (
No picked-up orders for this stop
)} {/* Toast */} {pickupToast && (
✓ Order picked up
)}
); } type OrderCardProps = { order: Order; canManagePickup: boolean; onMarkPickup: (orderId: string) => void; pickingUp: string | null; shortId: string; }; function OrderCard({ order, canManagePickup, onMarkPickup, pickingUp, shortId }: OrderCardProps) { const allItems = order.order_items ?? []; const pickupItems = allItems.filter((i) => i.fulfillment !== "shipping"); const shippingItems = allItems.filter((i) => i.fulfillment === "shipping"); const isMixed = pickupItems.length > 0 && shippingItems.length > 0; const pickupTotal = pickupItems.reduce((sum, i) => sum + Number(i.price) * i.quantity, 0); return (
{/* Header row */}

{order.customer_name}

{order.customer_phone && (

{order.customer_phone}

)}

{shortId}

Pending {isMixed && ( Mixed )}
{/* Items */} {pickupItems.length > 0 && (
Pickup Items {pickupItems.reduce((s, i) => s + i.quantity, 0)} total
    {pickupItems.map((item) => (
  • {item.quantity > 1 && ( {item.quantity}× )} {item.products?.name ?? "Unknown Product"} ${(Number(item.price) * item.quantity).toFixed(2)}
  • ))}
Subtotal ${pickupTotal.toFixed(2)}
)} {/* Shipping warning */} {isMixed && (
{shippingItems.length} shipping item{shippingItems.length > 1 ? "s" : ""} will also be marked picked up
)} {/* Footer */}
{order.stops ? ( <>

{order.stops.city}, {order.stops.state}

{pickupItems.length} pickup {pickupItems.length === 1 ? "item" : "items"}

) : (

No stop assigned

)}

${pickupTotal.toFixed(2)}

{/* Actions */} {canManagePickup ? (
View Details
) : (
No pickup permission
)}
); } type PickedUpCardProps = { order: Order; shortId: string; }; function PickedUpCard({ order, shortId }: PickedUpCardProps) { const allItems = order.order_items ?? []; const pickupItems = allItems.filter((i) => i.fulfillment === "pickup"); const pickupTotal = pickupItems.reduce((s, i) => s + Number(i.price) * i.quantity, 0); const isMixed = allItems.some((i) => i.fulfillment === "shipping"); return (

{order.customer_name}

{order.customer_phone && (

{order.customer_phone}

)}

{shortId} · {order.stops?.city}, {order.stops?.state}

{pickupItems.length > 0 && (
    {pickupItems.map((item) => (
  • {item.quantity > 1 && {item.quantity}× } {item.products?.name ?? "Unknown"} ${(Number(item.price) * item.quantity).toFixed(2)}
  • ))}
)}

{pickupItems.reduce((s, i) => s + i.quantity, 0)} items · ${pickupTotal.toFixed(2)} {isMixed && · mixed}

Picked Up {order.pickup_completed_at && (

{formatPickupTime(order.pickup_completed_at)}

)}
); }