'use client'; import { DashboardLayout } from '@/components/layout/dashboard-layout'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Clock, MapPin, ShoppingBag, Truck, Phone, Mail, ChevronRight, CheckCircle2, XCircle, ChefHat, Bell, ArrowRight, Filter, Search, } from 'lucide-react'; import { demoOrders, demoOrderItems } from '@/lib/demo-data'; import { formatCurrency, formatRelativeTime, getOrderStatusColor, getOrderTypeLabel, cn } from '@/lib/utils'; import { useState } from 'react'; import { Order, OrderStatus } from '@/types/database'; import { Input } from '@/components/ui/input'; const statusFlow: OrderStatus[] = ['pending', 'confirmed', 'preparing', 'ready', 'delivered']; function OrderCard({ order, isSelected, onClick }: { order: Order; isSelected: boolean; onClick: () => void }) { const items = demoOrderItems.filter((i) => i.order_id === order.id); const typeIcons = { dine_in: MapPin, takeaway: ShoppingBag, delivery: Truck, }; const TypeIcon = typeIcons[order.order_type]; return (
#{order.id.split('-')[1]} {order.status}

{order.customer_name}

{formatCurrency(order.total)}

{formatRelativeTime(order.created_at)}

{getOrderTypeLabel(order.order_type)} {order.table_number && • Table {order.table_number}} • {items.length} items
); } function OrderDetail({ order }: { order: Order }) { const items = demoOrderItems.filter((i) => i.order_id === order.id); const currentStatusIndex = statusFlow.indexOf(order.status); return (
{/* Header */}

Order #{order.id.split('-')[1]}

{order.status}

{formatRelativeTime(order.created_at)}

{/* Status Timeline */} {order.status !== 'cancelled' && (
{statusFlow.map((status, index) => { const isComplete = index <= currentStatusIndex; const isCurrent = index === currentStatusIndex; return (
{isComplete ? : {index + 1}}
{status}
{index < statusFlow.length - 1 && (
)}
); })}
)} {/* Customer Info */}

Customer

{order.customer_name?.split(' ').map(n => n[0]).join('')}
{order.customer_name}
{order.customer_phone && (
{order.customer_phone}
)} {order.customer_email && (
{order.customer_email}
)} {order.delivery_address && (
{order.delivery_address}
)}
{/* Items */}

Items

{items.map((item) => (
{item.quantity}x

{item.product_name}

{item.options && Object.entries(item.options).map(([key, value]) => (

{key}: {String(value)}

))}

{formatCurrency(item.total_price)}

))}
Subtotal {formatCurrency(order.subtotal)}
Tax {formatCurrency(order.tax)}
Total {formatCurrency(order.total)}
{/* Action Buttons */} {order.status !== 'delivered' && order.status !== 'cancelled' && (
{order.status === 'pending' && ( <> )} {order.status === 'confirmed' && ( )} {order.status === 'preparing' && ( )} {order.status === 'ready' && ( )}
)}
); } export default function OrdersPage() { const [selectedOrder, setSelectedOrder] = useState(demoOrders[0]); const [statusFilter, setStatusFilter] = useState('all'); const [search, setSearch] = useState(''); const filteredOrders = demoOrders.filter((o) => { if (statusFilter !== 'all' && o.status !== statusFilter) return false; if (search && !o.customer_name?.toLowerCase().includes(search.toLowerCase()) && !o.id.includes(search)) return false; return true; }); const statusCounts = { all: demoOrders.length, pending: demoOrders.filter((o) => o.status === 'pending').length, confirmed: demoOrders.filter((o) => o.status === 'confirmed').length, preparing: demoOrders.filter((o) => o.status === 'preparing').length, ready: demoOrders.filter((o) => o.status === 'ready').length, delivered: demoOrders.filter((o) => o.status === 'delivered').length, }; return (
{/* Header */}

Orders

Manage and track customer orders in real-time.

Live
{/* Status Filter Tabs */}
{Object.entries(statusCounts).map(([status, count]) => ( ))}
{/* Two Column Layout */}
{/* Order List */}
setSearch(e.target.value)} className="pl-10" />
{filteredOrders.map((order) => ( setSelectedOrder(order)} /> ))}
{/* Order Detail */}
{selectedOrder ? ( ) : (

Select an order to view details

)}
); }