import React, { useState, useEffect } from 'react'; import { ShoppingCart, DollarSign, Clock, TrendingUp } from 'lucide-react'; interface OrderStats { totalOrders: number; openOrders: number; totalRevenue: number; averageOrderValue: number; } export default function OrderDashboard() { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [timeRange, setTimeRange] = useState('today'); useEffect(() => { fetchStats(); }, [timeRange]); const fetchStats = async () => { setLoading(true); try { const endDate = Date.now(); let startDate = endDate; if (timeRange === 'today') { startDate = new Date().setHours(0, 0, 0, 0); } else if (timeRange === 'week') { startDate = endDate - 7 * 24 * 60 * 60 * 1000; } else if (timeRange === 'month') { startDate = endDate - 30 * 24 * 60 * 60 * 1000; } const summary = await window.mcp.callTool('clover_sales_summary', { startDate, endDate, }); const openOrders = await window.mcp.callTool('clover_list_orders', { filter: 'state=open', }); setStats({ totalOrders: summary.totalOrders || 0, openOrders: openOrders.count || 0, totalRevenue: summary.totalSales || 0, averageOrderValue: summary.averageOrderValue || 0, }); } catch (error) { console.error('Failed to fetch order stats:', error); } finally { setLoading(false); } }; if (loading) { return (
Loading dashboard...
); } return (

Order Dashboard

} title="Total Orders" value={stats?.totalOrders || 0} bgColor="bg-blue-50" /> } title="Open Orders" value={stats?.openOrders || 0} bgColor="bg-yellow-50" /> } title="Total Revenue" value={`$${((stats?.totalRevenue || 0) / 100).toFixed(2)}`} bgColor="bg-green-50" /> } title="Avg Order Value" value={`$${((stats?.averageOrderValue || 0) / 100).toFixed(2)}`} bgColor="bg-purple-50" />

Quick Actions

); } function StatCard({ icon, title, value, bgColor, }: { icon: React.ReactNode; title: string; value: string | number; bgColor: string; }) { return (
{icon}

{title}

{value}

); }