'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_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.
{/* Status Filter Tabs */}
{Object.entries(statusCounts).map(([status, count]) => (
))}
{/* Two Column Layout */}
{/* Order List */}
{/* Order Detail */}
{selectedOrder ? (
) : (
Select an order to view details
)}
);
}