-
-
-
Delivery Dashboard
-
Alex Johnson
+
+
+
+
+
Delivery Dashboard
+
Alex Johnson
+
+
+
+
@@ -99,7 +108,7 @@ export default function DeliveryDashboard() {
) : (
- {assignments.map((assignment) => (
+ {assignments.filter((a) => a.order).map((assignment) => (
+
+
+ );
+ }
+
+ const activeOrders = orders.filter((o) => ACTIVE_STATUSES.includes(o.status));
+ const pastOrders = orders.filter((o) => PAST_STATUSES.includes(o.status));
+
+ const totalSpent = pastOrders
+ .filter((o) => o.status === 'delivered')
+ .reduce((sum, o) => sum + Number(o.total_amount), 0);
+
+ return (
+
+
+
+
+
+
+
+
+
My Orders
+
+
+
+
+
+ {error && (
+
+
+ {error}
+
+
+ )}
+
+ {/* Stats */}
+
+
+
+ {orders.length}
+ Total Orders
+
+
+
+
+ ${totalSpent.toFixed(2)}
+ Total Spent
+
+
+
+
+ {activeOrders.length}
+ Active Orders
+
+
+
+
+ {orders.length === 0 ? (
+
+
+
+ No orders yet. Start ordering!
+
+
+ ) : (
+
+ {activeOrders.length > 0 && (
+
+
+ Active
+
+
+ {activeOrders.map((order) => (
+
+
+
+
+
+
+ {order.vendor?.name ?? 'Vendor'}
+
+
+ {new Date(order.created_at).toLocaleDateString()} · {order.items?.length ?? 0} item{order.items?.length !== 1 ? 's' : ''}
+
+
+
+
+
+ ${Number(order.total_amount).toFixed(2)}
+
+
+
+
+ ))}
+
+
+ )}
+
+ {pastOrders.length > 0 && (
+
+
+ Past
+
+
+ {pastOrders.map((order) => (
+
+
+
+
+
+ {order.vendor?.name ?? 'Vendor'}
+
+
+ {new Date(order.created_at).toLocaleDateString()} · {order.items?.length ?? 0} item{order.items?.length !== 1 ? 's' : ''}
+
+
+
+
+
+ ${Number(order.total_amount).toFixed(2)}
+
+
+
+ ))}
+
+
+ )}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/vendor/orders/page.tsx b/src/app/vendor/orders/page.tsx
new file mode 100644
index 0000000..16d6c8a
--- /dev/null
+++ b/src/app/vendor/orders/page.tsx
@@ -0,0 +1,121 @@
+'use client';
+
+import Link from 'next/link';
+import { ArrowLeft, ClipboardList, Clock } from 'lucide-react';
+import { Card, CardContent } from '@/components/ui/card';
+import { Button } from '@/components/ui/button';
+import { OrderStatusBadge } from '@/components/order-status';
+import { useVendorOrderHistory } from '@/hooks/use-orders';
+import { useAuth } from '@/hooks/use-auth';
+
+export default function VendorOrderHistoryPage() {
+ const { vendorId } = useAuth();
+ const { orders, loading, error } = useVendorOrderHistory(vendorId ?? '');
+
+ if (!vendorId || loading) {
+ return (
+
+ );
+ }
+
+ const completed = orders.filter((o) => o.status === 'delivered');
+ const cancelled = orders.filter((o) => o.status === 'cancelled');
+ const totalRevenue = completed.reduce((sum, o) => sum + Number(o.total_amount), 0);
+
+ return (
+
+
+
+
+
+
+
+
+
Order History
+
+
+
+
+
+ {error && (
+
+
+ {error}
+
+
+ )}
+
+ {/* Stats */}
+
+
+
+ {completed.length}
+ Completed
+
+
+
+
+ ${totalRevenue.toFixed(2)}
+ Total Revenue
+
+
+
+
+ {cancelled.length}
+ Cancelled
+
+
+
+
+ {orders.length === 0 ? (
+
+
+
+ No completed orders yet.
+
+
+ ) : (
+
+ {orders.map((order) => {
+ const itemSummary = order.items
+ ?.map((i) => `${i.quantity}× ${i.name}`)
+ .join(', ');
+ return (
+
+
+
+
+
+ #{order.id.slice(0, 8)}
+
+
+ {new Date(order.created_at).toLocaleString()}
+
+
+
+
+ {itemSummary && (
+
+ {itemSummary}
+
+ )}
+
+ ${Number(order.total_amount).toFixed(2)}
+
+
+
+ );
+ })}
+
+ )}
+
+
+ );
+}
diff --git a/src/app/vendor/page.tsx b/src/app/vendor/page.tsx
index 4733179..c9a90c3 100644
--- a/src/app/vendor/page.tsx
+++ b/src/app/vendor/page.tsx
@@ -2,7 +2,7 @@
import { useState } from 'react';
import Link from 'next/link';
-import { Store, Clock, ChefHat, Package, Loader2, CheckCircle2, UtensilsCrossed, Settings } from 'lucide-react';
+import { Store, Clock, ChefHat, Package, Loader2, CheckCircle2, UtensilsCrossed, Settings, ClipboardList } from 'lucide-react';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Separator } from '@/components/ui/separator';
@@ -85,6 +85,12 @@ export default function VendorDashboard() {
Menu
+
+
+