import { useMemo, useState, useEffect } from "react"; import { useSearch } from "@tanstack/react-router"; import { trpc } from "../trpc/client"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import dayjs from "dayjs"; import items from "razorpay/dist/types/items"; interface VendorOrder { orderId: string; customerName: string; orderDate: string; totalAmount: string; products: Array<{ orderItemId: number; productId: number; productName: string; quantity: number; unit: string; is_packaged: boolean; is_package_verified: boolean; }>; } interface DeliverySlot { id: number; deliveryTime: string; freezeTime: string; deliverySequence: any; } export function VendorOrderListRoute() { const { id } = useSearch({ from: "/vendor-order-list" }); // Fetch snippet info const { data: snippetInfo, isLoading: isLoadingSnippet } = id ? trpc.admin.vendorSnippets.getOrdersBySnippet.useQuery({ snippetCode: id }) : { data: null, isLoading: false }; const snippet = snippetInfo?.snippet; const isPermanent = snippet?.isPermanent; const { data: upcomingSlots } = trpc.admin.vendorSnippets.getUpcomingSlots.useQuery(undefined, { enabled: !!id, }); // State for selected slot const [selectedSlotId, setSelectedSlotId] = useState(null); // Auto-select first slot when snippets are loaded and isPermanent is true useEffect(() => { if ( isPermanent && upcomingSlots?.data && upcomingSlots.data.length > 0 && !selectedSlotId ) { setSelectedSlotId(upcomingSlots.data[0].id); } }, [isPermanent, upcomingSlots, selectedSlotId]); // Fetch orders based on mode const { data: slotOrdersData, error, isLoading: isLoadingOrders, isFetching, refetch, } = trpc.admin.vendorSnippets.getOrdersBySnippetAndSlot.useQuery( { snippetCode: id!, slotId: selectedSlotId! }, { enabled: !!id && !!selectedSlotId && isPermanent }, ); const { data: regularOrders } = trpc.admin.vendorSnippets.getOrdersBySnippet.useQuery( { snippetCode: id! }, { enabled: !!id && !isPermanent }, ); const orders = slotOrdersData?.data || regularOrders?.data || []; const isLoadingCurrent = isPermanent ? isLoadingOrders : isLoadingSnippet; const updatePackagingMutation = trpc.admin.vendorSnippets.updateOrderItemPackaging.useMutation(); const [updatingItems, setUpdatingItems] = useState>(new Set()); const handlePackagingToggle = async ( orderItemId: number, currentValue: boolean, ) => { setUpdatingItems((prev) => new Set(prev).add(orderItemId)); try { await updatePackagingMutation.mutateAsync({ orderItemId, is_packaged: !currentValue, }); // Refetch data to update the UI refetch(); } catch (error) { console.error("Failed to update packaging status:", error); } finally { setUpdatingItems((prev) => { const newSet = new Set(prev); newSet.delete(orderItemId); return newSet; }); } }; const productSummary = useMemo(() => { const summary: Record = {}; orders.forEach((order) => { order.products.forEach((product) => { const key = product.productName; if (!summary[key]) { summary[key] = { quantity: 0, unit: product.unit }; } summary[key].quantity += product.quantity * product.productSize; }); }); return Object.entries(summary).map(([name, data]) => ({ name, quantity: data.quantity, unit: data.unit, })); }, [orders]); return (

Summary

{productSummary.map((item, index) => (
{item.name}: {item.quantity} {item.unit}
))}

Vendor Orders

Track incoming orders and fulfilment progress for vendor partners. {id && Snippet: {id}}

{isPermanent && upcomingSlots?.data && (
)}
{isLoadingCurrent ? (
Loading orders…
) : error ? (
{error.message ?? "Unable to load vendor orders right now"}
) : !id ? (
No snippet code provided
) : orders.length === 0 ? (
No vendor orders found.
) : (
{orders.map((order) => { const parsedDate = order.orderDate ? dayjs(order.orderDate).format("ddd, MMM DD hh:mm A") : "N/A"; const badgeClass = "border-slate-200 bg-slate-100 text-slate-600 inline-flex items-center rounded-full border px-3 py-0.5 text-xs font-semibold uppercase"; return (

{order.orderId}

Pending
Products (Packaging Status)
{order.products.map((product) => (
{product.productName}: {product.productSize * product.quantity}{" "} {product.unit} handlePackagingToggle( product.orderItemId, product.is_packaged, ) } className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" />
))}
Date
{parsedDate}
Total Amount
₹{order.totalAmount}
); })}
)}
{isFetching && !isLoadingCurrent ? (

Refreshing…

) : null}
); }