@burdenoff/microfe-kadaikodi 2026.704.2 → 2026.704.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
- package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +76 -6
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +45 -107
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +30 -32
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +137 -120
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +2 -2
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +278 -283
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +105 -111
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +84 -70
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +202 -139
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +232 -0
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +84 -79
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +243 -143
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +4 -4
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -4
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js +6 -6
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +6 -4
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +6 -6
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +4 -4
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +409 -304
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +209 -162
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +207 -186
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +340 -272
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +122 -75
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CartOwnerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/CartOwnerDashboard.tsx"],"sourcesContent":["/**\n * Cart Owner Dashboard Page\n *\n * Full business overview for the signed-in owner's own service provider (cart):\n * time-of-day greeting, real performance stats, service status banner, recent\n * orders with actions, revenue over the last 7 days, top selling items, staff\n * overview, and quick links — all derived from live backend data (no fabrication).\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n IndianRupee,\n ShoppingCart,\n Users,\n Star,\n TrendingUp,\n Clock,\n ArrowRight,\n Plus,\n Settings,\n BarChart3,\n Package,\n MapPin,\n Eye,\n Edit,\n UserCheck,\n Activity,\n Bell,\n ChevronRight,\n CheckCircle,\n Flame,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useProviders,\n useOrders,\n useOfferings,\n useReviews,\n useProviderWorkers,\n useUpdateOrderStatus,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst getGreeting = (): string => {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good Morning';\n if (hour < 17) return 'Good Afternoon';\n return 'Good Evening';\n};\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-error-bg-subtle text-status-error-text',\n confirmed: 'bg-[var(--color-accent-soft)] text-text-primary',\n preparing: 'bg-status-warning-bg-subtle text-status-warning-text',\n ready: 'bg-[var(--color-accent-soft)] text-text-primary',\n delivered: 'bg-status-success-bg-subtle text-status-success-text',\n cancelled: 'bg-bg-sunken text-text-secondary',\n};\n\nconst startOfToday = (): Date => {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\nconst timeAgo = (dateString: string): string => {\n const diffMin = Math.floor((Date.now() - new Date(dateString).getTime()) / 60000);\n if (diffMin < 1) return 'Just now';\n if (diffMin < 60) return `${diffMin} min ago`;\n if (diffMin < 1440) return `${Math.floor(diffMin / 60)} hr ago`;\n return new Date(dateString).toLocaleDateString('en-IN', { day: '2-digit', month: 'short' });\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const CartOwnerDashboard = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n\n // Resolve the signed-in owner's provider (\"my cart\").\n const { data: providers = [], isLoading: providersLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const providerId = myProvider?.id;\n\n const { data: orders = [] } = useOrders({ providerId });\n const { data: offerings = [] } = useOfferings(providerId);\n const { data: reviews = [] } = useReviews(providerId ?? '');\n const { data: workers = [] } = useProviderWorkers(providerId);\n const updateOrderStatus = useUpdateOrderStatus();\n\n const ownerName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? '';\n\n // Service status is a local UI control (no provider-status mutation exists yet);\n // it seeds from the provider's real open/closed state.\n const [isOpen, setIsOpen] = useState(true);\n useEffect(() => {\n if (myProvider) setIsOpen(myProvider.isOpen);\n }, [myProvider]);\n\n // ---- Derived metrics (all from real orders / offerings / provider) ----\n const metrics = useMemo(() => {\n const today = startOfToday();\n const delivered = orders.filter((o) => o.status === 'delivered');\n const todaysOrders = orders.filter((o) => new Date(o.orderDate) >= today);\n const todaysDelivered = delivered.filter((o) => new Date(o.orderDate) >= today);\n const totalRevenue = delivered.reduce((s, o) => s + o.total, 0);\n const dailyRevenue = todaysDelivered.reduce((s, o) => s + o.total, 0);\n const averageOrderValue =\n delivered.length > 0\n ? Math.round(totalRevenue / delivered.length)\n : Math.round(myProvider?.averageOrderValue ?? 0);\n return {\n totalRevenue,\n dailyRevenue,\n ordersToday: todaysOrders.length,\n totalOrders: orders.length,\n activeOfferings: offerings.filter((o) => o.isAvailable).length,\n averageOrderValue,\n rating: myProvider?.rating ?? 0,\n totalRatings: myProvider?.totalRatings ?? 0,\n };\n }, [orders, offerings, myProvider]);\n\n const recentOrders = useMemo(\n () =>\n [...orders]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 4),\n [orders]\n );\n\n // Revenue over the last 7 days, bucketed from real orders.\n const revenueData = useMemo(() => {\n const days: { date: string; orders: number; revenue: number }[] = [];\n for (let i = 6; i >= 0; i--) {\n const start = startOfToday();\n start.setDate(start.getDate() - i);\n const end = new Date(start);\n end.setDate(start.getDate() + 1);\n const dayOrders = orders.filter((o) => {\n const od = new Date(o.orderDate);\n return od >= start && od < end;\n });\n days.push({\n date: start.toISOString(),\n orders: dayOrders.length,\n revenue: dayOrders\n .filter((o) => o.status === 'delivered')\n .reduce((s, o) => s + o.total, 0),\n });\n }\n return days;\n }, [orders]);\n\n // Top selling items, aggregated from real order line items.\n const topSellingItems = useMemo(() => {\n const map = new Map<string, { quantity: number; revenue: number }>();\n orders.forEach((o) =>\n o.items.forEach((it) => {\n const cur = map.get(it.name) ?? { quantity: 0, revenue: 0 };\n cur.quantity += it.quantity;\n cur.revenue += it.price * it.quantity;\n map.set(it.name, cur);\n })\n );\n return [...map.entries()]\n .map(([name, v]) => ({ name, ...v }))\n .sort((a, b) => b.revenue - a.revenue)\n .slice(0, 5);\n }, [orders]);\n\n const weekday = new Date().toLocaleDateString('en-US', { weekday: 'long' }).toLowerCase();\n const todayHours = myProvider?.businessHours?.[weekday];\n const operatingHoursLabel =\n todayHours && todayHours.isOpen ? `${todayHours.open} - ${todayHours.close}` : null;\n const locationLabel = myProvider?.location?.address?.trim() || null;\n\n const handleUpdateStatus = (orderId: string, status: string) => {\n updateOrderStatus.mutate({ id: orderId, status });\n };\n\n // ---- Loading / no-provider states ----\n if (providersLoading) {\n return (\n <PageLayout title={getGreeting()} description=\"Manage your service provider operations\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout title={getGreeting()} description=\"Manage your service provider operations\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Create your cart to get started\"\n description=\"You don't have a service provider yet. Set up your cart, add your offerings and configure your service to start taking orders.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/service-config')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n <Plus className=\"h-4 w-4\" />\n Set up your cart\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <span>\n {getGreeting()}\n {ownerName && (\n <>\n , <span className=\"text-text-secondary font-normal\">{ownerName}</span>\n </>\n )}\n </span>\n }\n description={myProvider.name}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose>\n Run your mobile cart business from one screen — flip your service open or closed, watch\n today's revenue and orders roll in, and jump to your menu, staff, or order queue. Open\n your service and set up your offerings to start taking orders.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-cartowner-dashboard\"\n steps={[\n {\n id: 'offerings',\n label: 'Set up your offerings',\n description: 'Add the dishes and items customers can order from your cart.',\n onClick: () => navigateTo('/cart-owner/inventory'),\n },\n {\n id: 'service-config',\n label: 'Configure service & hours',\n description: 'Define your operating hours, location and service area.',\n onClick: () => navigateTo('/cart-owner/service-config'),\n },\n {\n id: 'orders',\n label: 'Manage incoming orders',\n description: 'Accept, prepare and fulfil customer orders in real time.',\n onClick: () => navigateTo('/cart-owner/orders'),\n },\n ]}\n />\n\n {/* Cart Status Banner */}\n <div\n className={cn(\n 'p-4 rounded-lg border-l-4',\n isOpen\n ? 'border-status-success-text bg-status-success-bg-subtle'\n : 'border-status-error-text bg-status-error-bg-subtle'\n )}\n >\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4\">\n <div className=\"flex items-start gap-3\">\n <div\n className={cn(\n 'w-3 h-3 rounded-full mt-1 shrink-0',\n isOpen ? 'bg-status-success-text' : 'bg-status-error-text'\n )}\n />\n <div>\n <h3 className=\"font-semibold text-text-primary text-sm\">\n Service Status: {isOpen ? 'Open' : 'Closed'}\n </h3>\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-1 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3 shrink-0\" />\n {locationLabel ?? 'Location not set'}\n </span>\n {operatingHoursLabel && (\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3 shrink-0\" />\n {operatingHoursLabel}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/settings')}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Update Location\n </button>\n <button\n type=\"button\"\n onClick={() => setIsOpen((v) => !v)}\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors',\n isOpen\n ? 'bg-status-error-bg-subtle text-status-error-text hover:bg-status-error-bg-subtle'\n : 'bg-status-success-bg-subtle text-status-success-text hover:bg-status-success-bg-subtle'\n )}\n >\n {isOpen ? 'Close Service' : 'Open Service'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Today's Performance - Stat Cards — the one emphasis zone */}\n <EmphasisPanel>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Today's Performance</h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {[\n {\n label: 'Daily Revenue',\n value: formatCurrency(metrics.dailyRevenue, { minimumFractionDigits: 0 }),\n icon: IndianRupee,\n sublabel: null,\n },\n {\n label: 'Orders Today',\n value: String(metrics.ordersToday),\n icon: ShoppingCart,\n sublabel: null,\n },\n {\n label: 'Avg Order Value',\n value: formatCurrency(metrics.averageOrderValue, { minimumFractionDigits: 0 }),\n icon: TrendingUp,\n sublabel: null,\n },\n {\n label: 'Service Rating',\n value: metrics.rating.toFixed(1),\n icon: Star,\n sublabel:\n metrics.totalRatings > 0\n ? `Based on ${metrics.totalRatings} ${\n metrics.totalRatings === 1 ? 'rating' : 'ratings'\n }`\n : 'No ratings yet',\n },\n ].map((stat) => {\n const Icon = stat.icon;\n return (\n <div\n key={stat.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"rounded-md bg-accent p-2\">\n <Icon className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {stat.sublabel && (\n <span className=\"text-xs text-text-secondary\">{stat.sublabel}</span>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">{stat.value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{stat.label}</p>\n </div>\n );\n })}\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main Content (2/3) */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Quick Actions */}\n <div>\n <h3 className=\"text-base font-semibold mb-3 text-text-primary\">Quick Actions</h3>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {[\n {\n label: 'Service Config',\n icon: Settings,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n path: '/cart-owner/service-config',\n },\n {\n label: 'Manage Offerings',\n icon: Package,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n path: '/cart-owner/inventory',\n },\n {\n label: 'View Orders',\n icon: ShoppingCart,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n path: '/cart-owner/orders',\n },\n {\n label: 'Analytics',\n icon: BarChart3,\n color: 'bg-accent-purple-subtle text-text-primary',\n path: '/cart-owner/analytics',\n },\n {\n label: 'Staff',\n icon: UserCheck,\n color: 'bg-accent-purple-subtle text-text-primary',\n path: '/cart-owner/staff',\n },\n ].map((action) => {\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'flex flex-col items-center gap-2 rounded-lg p-4 transition-colors hover:opacity-80',\n action.color\n )}\n >\n <Icon className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium text-center\">{action.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Recent Orders */}\n <div>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"text-base font-semibold text-text-primary\">Recent Orders</h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n View All Orders\n </button>\n </div>\n\n {recentOrders.length === 0 ? (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-8 text-center text-sm text-text-secondary shadow-sm\">\n No orders yet. New orders from customers will appear here.\n </div>\n ) : (\n <div className=\"space-y-3\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\"\n >\n <div className=\"flex flex-col lg:flex-row lg:items-start lg:justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h4 className=\"font-semibold text-text-primary text-sm\">\n #{order.id.slice(0, 8)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n statusStyles[order.status] || 'bg-bg-sunken text-text-secondary'\n )}\n >\n {order.status}\n </span>\n </div>\n {order.items.length > 0 && (\n <p className=\"text-xs text-text-secondary mb-1 truncate\">\n Items: {order.items.map((i) => i.name).join(', ')}\n </p>\n )}\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {timeAgo(order.orderDate)}\n </span>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Eye className=\"h-3 w-3\" />\n View\n </button>\n {order.status === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleUpdateStatus(order.id, 'CONFIRMED')}\n className=\"inline-flex items-center gap-1 rounded-md bg-status-success-bg-subtle px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors\"\n >\n <CheckCircle className=\"h-3 w-3\" />\n Accept\n </button>\n )}\n {(order.status === 'confirmed' || order.status === 'preparing') && (\n <button\n type=\"button\"\n onClick={() => handleUpdateStatus(order.id, 'READY')}\n className=\"inline-flex items-center gap-1 rounded-md bg-[var(--color-accent-soft)] px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors\"\n >\n <CheckCircle className=\"h-3 w-3\" />\n Mark Ready\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Revenue Table (Last 7 Days) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border-subtle px-5 py-4\">\n <h3 className=\"text-base font-semibold text-text-primary\">Revenue (Last 7 Days)</h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/analytics')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n View Analytics\n </button>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"px-5 py-3 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-3 text-right font-medium text-text-secondary\">\n Orders\n </th>\n <th className=\"px-5 py-3 text-right font-medium text-text-secondary\">\n Revenue\n </th>\n <th className=\"px-5 py-3 text-left font-medium text-text-secondary\">Trend</th>\n </tr>\n </thead>\n <tbody>\n {revenueData.map((day) => {\n const maxRevenue = Math.max(...revenueData.map((d) => d.revenue), 1);\n const width = (day.revenue / maxRevenue) * 100;\n return (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-3 text-text-primary text-xs\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n weekday: 'short',\n })}\n </td>\n <td className=\"px-5 py-3 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-3 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"px-5 py-3 w-40\">\n <div className=\"h-4 rounded bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded bg-[var(--color-accent-soft)]\"\n style={{ width: `${width}%` }}\n />\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* This Month Summary */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Business Summary</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(metrics.totalRevenue, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary mt-1\">Total Revenue</div>\n </div>\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">{metrics.totalOrders}</div>\n <div className=\"text-xs text-text-secondary mt-1\">Total Orders</div>\n </div>\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(metrics.averageOrderValue, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary mt-1\">Avg Order Value</div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Sidebar (1/3) */}\n <div className=\"space-y-6\">\n {/* Notifications */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Bell className=\"h-4 w-4\" />\n Notifications\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary\">\n You have no notifications yet. Order and review alerts will appear here.\n </p>\n </div>\n\n {/* Top Selling Items */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Flame className=\"h-4 w-4 text-status-warning-text\" />\n Top Selling Items\n </h3>\n {topSellingItems.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n No sales yet. Your best sellers will appear here once orders come in.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {topSellingItems.map((item, idx) => (\n <div key={item.name} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-sm font-bold text-text-secondary w-5\">{idx + 1}</span>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">\n {item.name}\n </p>\n <p className=\"text-[10px] text-text-secondary\">{item.quantity} sold</p>\n </div>\n </div>\n <span className=\"text-xs font-semibold text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Staff Overview */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4\" />\n Staff Overview\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/staff')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n Manage\n </button>\n </div>\n {workers.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n No staff added yet. Invite workers and delivery partners from Staff.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {workers.map((member) => (\n <div key={member.id} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div\n className={cn(\n 'w-2 h-2 rounded-full',\n member.status === 'ACTIVE'\n ? 'bg-status-success-text'\n : 'bg-muted-foreground'\n )}\n />\n <div>\n <p className=\"text-xs font-medium text-text-primary\">{member.name}</p>\n <p className=\"text-[10px] text-text-secondary capitalize\">\n {member.role.toLowerCase()}\n </p>\n </div>\n </div>\n <span className=\"text-[10px] capitalize text-text-secondary\">\n {member.status.toLowerCase()}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Quick Stats */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Quick Stats</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Active Offerings</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {metrics.activeOfferings}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Customer Rating</span>\n <span className=\"text-sm font-semibold text-text-primary flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text fill-status-warning-text\" />\n {metrics.rating.toFixed(1)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Reviews</span>\n <span className=\"text-sm font-semibold text-text-primary\">{reviews.length}</span>\n </div>\n </div>\n </div>\n\n {/* Business Settings Links */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Business Settings</h3>\n <div className=\"space-y-2\">\n {[\n { label: 'Service Settings', icon: Settings, path: '/cart-owner/settings' },\n { label: 'Business Profile', icon: Edit, path: '/cart-owner/profile' },\n { label: 'Add Offerings', icon: Plus, path: '/cart-owner/inventory' },\n ].map((link) => {\n const Icon = link.icon;\n return (\n <button\n key={link.label}\n type=\"button\"\n onClick={() => navigateTo(link.path)}\n className=\"w-full flex items-center justify-between rounded-md border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon className=\"h-3.5 w-3.5\" />\n {link.label}\n </span>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Recent Activity */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Recent Activity</h3>\n {recentOrders.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No recent activity yet.</p>\n ) : (\n <div className=\"space-y-2 text-xs\">\n {recentOrders.map((order) => (\n <div key={order.id} className=\"flex items-center gap-2\">\n <Activity className=\"h-3.5 w-3.5 text-text-secondary shrink-0\" />\n <span className=\"text-text-secondary truncate\">\n Order #{order.id.slice(0, 8)} {order.status}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CartOwnerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/CartOwnerDashboard.tsx"],"sourcesContent":["/**\n * Cart Owner Dashboard Page\n *\n * Full business overview for the signed-in owner's own service provider (cart):\n * time-of-day greeting, real performance stats, service status banner, recent\n * orders with actions, revenue over the last 7 days, top selling items, staff\n * overview, and quick links — all derived from live backend data (no fabrication).\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useEffect, useMemo, useState } from 'react';\nimport {\n IndianRupee,\n ShoppingCart,\n Users,\n Star,\n TrendingUp,\n Clock,\n ArrowRight,\n Plus,\n Settings,\n BarChart3,\n Package,\n MapPin,\n Eye,\n Edit,\n UserCheck,\n Activity,\n Bell,\n ChevronRight,\n CheckCircle,\n Flame,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useProviders,\n useOrders,\n useOfferings,\n useReviews,\n useProviderWorkers,\n useUpdateOrderStatus,\n useUpdateProvider,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst getGreeting = (): string => {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good Morning';\n if (hour < 17) return 'Good Afternoon';\n return 'Good Evening';\n};\n\nconst statusStyles: Record<string, string> = {\n pending: 'bg-status-error-bg-subtle text-status-error-text',\n confirmed: 'bg-[var(--color-accent-soft)] text-text-primary',\n preparing: 'bg-status-warning-bg-subtle text-status-warning-text',\n ready: 'bg-[var(--color-accent-soft)] text-text-primary',\n delivered: 'bg-status-success-bg-subtle text-status-success-text',\n cancelled: 'bg-bg-sunken text-text-secondary',\n};\n\nconst startOfToday = (): Date => {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\nconst timeAgo = (dateString: string): string => {\n const diffMin = Math.floor((Date.now() - new Date(dateString).getTime()) / 60000);\n if (diffMin < 1) return 'Just now';\n if (diffMin < 60) return `${diffMin} min ago`;\n if (diffMin < 1440) return `${Math.floor(diffMin / 60)} hr ago`;\n return new Date(dateString).toLocaleDateString('en-IN', { day: '2-digit', month: 'short' });\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const CartOwnerDashboard = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n\n // Resolve the signed-in owner's provider (\"my cart\").\n const { data: providers = [], isLoading: providersLoading } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const providerId = myProvider?.id;\n\n const { data: orders = [] } = useOrders({ providerId });\n const { data: offerings = [] } = useOfferings(providerId);\n const { data: reviews = [] } = useReviews(providerId ?? '');\n const { data: workers = [] } = useProviderWorkers(providerId);\n const updateOrderStatus = useUpdateOrderStatus();\n const updateProvider = useUpdateProvider();\n\n const ownerName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? '';\n\n // Service status seeds from the provider's real open/closed state and persists\n // back to the provider record (ACTIVE / PAUSED) when toggled.\n const [isOpen, setIsOpen] = useState(true);\n useEffect(() => {\n if (myProvider) setIsOpen(myProvider.isOpen);\n }, [myProvider]);\n\n const toggleServiceStatus = () => {\n if (!myProvider) return;\n const next = !isOpen;\n setIsOpen(next); // optimistic\n updateProvider.mutate(\n { id: myProvider.id, input: { status: next ? 'ACTIVE' : 'PAUSED' } },\n { onError: () => setIsOpen(!next) }\n );\n };\n\n // ---- Derived metrics (all from real orders / offerings / provider) ----\n const metrics = useMemo(() => {\n const today = startOfToday();\n const delivered = orders.filter((o) => o.status === 'delivered');\n const todaysOrders = orders.filter((o) => new Date(o.orderDate) >= today);\n const todaysDelivered = delivered.filter((o) => new Date(o.orderDate) >= today);\n const totalRevenue = delivered.reduce((s, o) => s + o.total, 0);\n const dailyRevenue = todaysDelivered.reduce((s, o) => s + o.total, 0);\n const averageOrderValue =\n delivered.length > 0\n ? Math.round(totalRevenue / delivered.length)\n : Math.round(myProvider?.averageOrderValue ?? 0);\n return {\n totalRevenue,\n dailyRevenue,\n ordersToday: todaysOrders.length,\n totalOrders: orders.length,\n activeOfferings: offerings.filter((o) => o.isAvailable).length,\n averageOrderValue,\n rating: myProvider?.rating ?? 0,\n totalRatings: myProvider?.totalRatings ?? 0,\n };\n }, [orders, offerings, myProvider]);\n\n const recentOrders = useMemo(\n () =>\n [...orders]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 4),\n [orders]\n );\n\n // Revenue over the last 7 days, bucketed from real orders.\n const revenueData = useMemo(() => {\n const days: { date: string; orders: number; revenue: number }[] = [];\n for (let i = 6; i >= 0; i--) {\n const start = startOfToday();\n start.setDate(start.getDate() - i);\n const end = new Date(start);\n end.setDate(start.getDate() + 1);\n const dayOrders = orders.filter((o) => {\n const od = new Date(o.orderDate);\n return od >= start && od < end;\n });\n days.push({\n date: start.toISOString(),\n orders: dayOrders.length,\n revenue: dayOrders.filter((o) => o.status === 'delivered').reduce((s, o) => s + o.total, 0),\n });\n }\n return days;\n }, [orders]);\n\n // Top selling items, aggregated from real order line items.\n const topSellingItems = useMemo(() => {\n const map = new Map<string, { quantity: number; revenue: number }>();\n orders.forEach((o) =>\n o.items.forEach((it) => {\n const cur = map.get(it.name) ?? { quantity: 0, revenue: 0 };\n cur.quantity += it.quantity;\n cur.revenue += it.price * it.quantity;\n map.set(it.name, cur);\n })\n );\n return [...map.entries()]\n .map(([name, v]) => ({ name, ...v }))\n .sort((a, b) => b.revenue - a.revenue)\n .slice(0, 5);\n }, [orders]);\n\n const weekday = new Date().toLocaleDateString('en-US', { weekday: 'long' }).toLowerCase();\n const todayHours = myProvider?.businessHours?.[weekday];\n const operatingHoursLabel =\n todayHours && todayHours.isOpen ? `${todayHours.open} - ${todayHours.close}` : null;\n const locationLabel = myProvider?.location?.address?.trim() || null;\n\n const handleUpdateStatus = (orderId: string, status: string) => {\n updateOrderStatus.mutate({ id: orderId, status });\n };\n\n // ---- Loading / no-provider states ----\n if (providersLoading) {\n return (\n <PageLayout title={getGreeting()} description=\"Manage your service provider operations\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"h-10 w-10 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!myProvider) {\n return (\n <PageLayout title={getGreeting()} description=\"Manage your service provider operations\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Create your cart to get started\"\n description=\"You don't have a service provider yet. Set up your cart, add your offerings and configure your service to start taking orders.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/service-config')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n <Plus className=\"h-4 w-4\" />\n Set up your cart\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <span>\n {getGreeting()}\n {ownerName && (\n <>\n , <span className=\"text-text-secondary font-normal\">{ownerName}</span>\n </>\n )}\n </span>\n }\n description={myProvider.name}\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose>\n Run your mobile cart business from one screen — flip your service open or closed, watch\n today's revenue and orders roll in, and jump to your menu, staff, or order queue. Open\n your service and set up your offerings to start taking orders.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-cartowner-dashboard\"\n steps={[\n {\n id: 'offerings',\n label: 'Set up your offerings',\n description: 'Add the dishes and items customers can order from your cart.',\n onClick: () => navigateTo('/cart-owner/inventory'),\n },\n {\n id: 'service-config',\n label: 'Configure service & hours',\n description: 'Define your operating hours, location and service area.',\n onClick: () => navigateTo('/cart-owner/service-config'),\n },\n {\n id: 'orders',\n label: 'Manage incoming orders',\n description: 'Accept, prepare and fulfil customer orders in real time.',\n onClick: () => navigateTo('/cart-owner/orders'),\n },\n ]}\n />\n\n {/* Cart Status Banner */}\n <div\n className={cn(\n 'p-4 rounded-lg border-l-4',\n isOpen\n ? 'border-status-success-text bg-status-success-bg-subtle'\n : 'border-status-error-text bg-status-error-bg-subtle'\n )}\n >\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4\">\n <div className=\"flex items-start gap-3\">\n <div\n className={cn(\n 'w-3 h-3 rounded-full mt-1 shrink-0',\n isOpen ? 'bg-status-success-text' : 'bg-status-error-text'\n )}\n />\n <div>\n <h3 className=\"font-semibold text-text-primary text-sm\">\n Service Status: {isOpen ? 'Open' : 'Closed'}\n </h3>\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-1 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3 shrink-0\" />\n {locationLabel ?? 'Location not set'}\n </span>\n {operatingHoursLabel && (\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3 shrink-0\" />\n {operatingHoursLabel}\n </span>\n )}\n </div>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/settings')}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Update Location\n </button>\n <button\n type=\"button\"\n onClick={toggleServiceStatus}\n disabled={updateProvider.isPending}\n className={cn(\n 'inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors disabled:opacity-60 disabled:cursor-not-allowed',\n isOpen\n ? 'bg-status-error-bg-subtle text-status-error-text hover:bg-status-error-bg-subtle'\n : 'bg-status-success-bg-subtle text-status-success-text hover:bg-status-success-bg-subtle'\n )}\n >\n {isOpen ? 'Close Service' : 'Open Service'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Today's Performance - Stat Cards — the one emphasis zone */}\n <EmphasisPanel>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Today's Performance</h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {[\n {\n label: 'Daily Revenue',\n value: formatCurrency(metrics.dailyRevenue, { minimumFractionDigits: 0 }),\n icon: IndianRupee,\n sublabel: null,\n },\n {\n label: 'Orders Today',\n value: String(metrics.ordersToday),\n icon: ShoppingCart,\n sublabel: null,\n },\n {\n label: 'Avg Order Value',\n value: formatCurrency(metrics.averageOrderValue, { minimumFractionDigits: 0 }),\n icon: TrendingUp,\n sublabel: null,\n },\n {\n label: 'Service Rating',\n value: metrics.rating.toFixed(1),\n icon: Star,\n sublabel:\n metrics.totalRatings > 0\n ? `Based on ${metrics.totalRatings} ${\n metrics.totalRatings === 1 ? 'rating' : 'ratings'\n }`\n : 'No ratings yet',\n },\n ].map((stat) => {\n const Icon = stat.icon;\n return (\n <div\n key={stat.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"rounded-md bg-accent p-2\">\n <Icon className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {stat.sublabel && (\n <span className=\"text-xs text-text-secondary\">{stat.sublabel}</span>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">{stat.value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{stat.label}</p>\n </div>\n );\n })}\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main Content (2/3) */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Quick Actions */}\n <div>\n <h3 className=\"text-base font-semibold mb-3 text-text-primary\">Quick Actions</h3>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3\">\n {[\n {\n label: 'Service Config',\n icon: Settings,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n path: '/cart-owner/service-config',\n },\n {\n label: 'Manage Offerings',\n icon: Package,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n path: '/cart-owner/inventory',\n },\n {\n label: 'View Orders',\n icon: ShoppingCart,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n path: '/cart-owner/orders',\n },\n {\n label: 'Analytics',\n icon: BarChart3,\n color: 'bg-accent-purple-subtle text-text-primary',\n path: '/cart-owner/analytics',\n },\n {\n label: 'Staff',\n icon: UserCheck,\n color: 'bg-accent-purple-subtle text-text-primary',\n path: '/cart-owner/staff',\n },\n {\n label: 'Raise Capital',\n icon: TrendingUp,\n color: 'bg-accent-purple-subtle text-text-primary',\n path: '/cart-owner/list-investment',\n },\n ].map((action) => {\n const Icon = action.icon;\n return (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'flex flex-col items-center gap-2 rounded-lg p-4 transition-colors hover:opacity-80',\n action.color\n )}\n >\n <Icon className=\"h-5 w-5\" />\n <span className=\"text-xs font-medium text-center\">{action.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Recent Orders */}\n <div>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"text-base font-semibold text-text-primary\">Recent Orders</h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n View All Orders\n </button>\n </div>\n\n {recentOrders.length === 0 ? (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-8 text-center text-sm text-text-secondary shadow-sm\">\n No orders yet. New orders from customers will appear here.\n </div>\n ) : (\n <div className=\"space-y-3\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\"\n >\n <div className=\"flex flex-col lg:flex-row lg:items-start lg:justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h4 className=\"font-semibold text-text-primary text-sm\">\n #{order.id.slice(0, 8)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n statusStyles[order.status] || 'bg-bg-sunken text-text-secondary'\n )}\n >\n {order.status}\n </span>\n </div>\n {order.items.length > 0 && (\n <p className=\"text-xs text-text-secondary mb-1 truncate\">\n Items: {order.items.map((i) => i.name).join(', ')}\n </p>\n )}\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-semibold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {timeAgo(order.orderDate)}\n </span>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/orders')}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Eye className=\"h-3 w-3\" />\n View\n </button>\n {order.status === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleUpdateStatus(order.id, 'CONFIRMED')}\n className=\"inline-flex items-center gap-1 rounded-md bg-status-success-bg-subtle px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors\"\n >\n <CheckCircle className=\"h-3 w-3\" />\n Accept\n </button>\n )}\n {(order.status === 'confirmed' || order.status === 'preparing') && (\n <button\n type=\"button\"\n onClick={() => handleUpdateStatus(order.id, 'READY')}\n className=\"inline-flex items-center gap-1 rounded-md bg-[var(--color-accent-soft)] px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors\"\n >\n <CheckCircle className=\"h-3 w-3\" />\n Mark Ready\n </button>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Revenue Table (Last 7 Days) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border-subtle px-5 py-4\">\n <h3 className=\"text-base font-semibold text-text-primary\">Revenue (Last 7 Days)</h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/analytics')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n View Analytics\n </button>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-subtle\">\n <th className=\"px-5 py-3 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-3 text-right font-medium text-text-secondary\">\n Orders\n </th>\n <th className=\"px-5 py-3 text-right font-medium text-text-secondary\">\n Revenue\n </th>\n <th className=\"px-5 py-3 text-left font-medium text-text-secondary\">Trend</th>\n </tr>\n </thead>\n <tbody>\n {revenueData.map((day) => {\n const maxRevenue = Math.max(...revenueData.map((d) => d.revenue), 1);\n const width = (day.revenue / maxRevenue) * 100;\n return (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-3 text-text-primary text-xs\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n weekday: 'short',\n })}\n </td>\n <td className=\"px-5 py-3 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-3 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n <td className=\"px-5 py-3 w-40\">\n <div className=\"h-4 rounded bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded bg-[var(--color-accent-soft)]\"\n style={{ width: `${width}%` }}\n />\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* This Month Summary */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Business Summary</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(metrics.totalRevenue, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary mt-1\">Total Revenue</div>\n </div>\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">{metrics.totalOrders}</div>\n <div className=\"text-xs text-text-secondary mt-1\">Total Orders</div>\n </div>\n <div className=\"text-center p-3 rounded-lg bg-bg-sunken/50\">\n <div className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(metrics.averageOrderValue, { minimumFractionDigits: 0 })}\n </div>\n <div className=\"text-xs text-text-secondary mt-1\">Avg Order Value</div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Sidebar (1/3) */}\n <div className=\"space-y-6\">\n {/* Notifications */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Bell className=\"h-4 w-4\" />\n Notifications\n </h3>\n </div>\n <p className=\"text-xs text-text-secondary\">\n You have no notifications yet. Order and review alerts will appear here.\n </p>\n </div>\n\n {/* Top Selling Items */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Flame className=\"h-4 w-4 text-status-warning-text\" />\n Top Selling Items\n </h3>\n {topSellingItems.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n No sales yet. Your best sellers will appear here once orders come in.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {topSellingItems.map((item, idx) => (\n <div key={item.name} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-sm font-bold text-text-secondary w-5\">{idx + 1}</span>\n <div className=\"min-w-0\">\n <p className=\"text-xs font-medium text-text-primary truncate\">\n {item.name}\n </p>\n <p className=\"text-[10px] text-text-secondary\">{item.quantity} sold</p>\n </div>\n </div>\n <span className=\"text-xs font-semibold text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Staff Overview */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4\" />\n Staff Overview\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/staff')}\n className=\"text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n Manage\n </button>\n </div>\n {workers.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n No staff added yet. Invite workers and delivery partners from Staff.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {workers.map((member) => (\n <div key={member.id} className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <div\n className={cn(\n 'w-2 h-2 rounded-full',\n member.status === 'ACTIVE'\n ? 'bg-status-success-text'\n : 'bg-muted-foreground'\n )}\n />\n <div>\n <p className=\"text-xs font-medium text-text-primary\">{member.name}</p>\n <p className=\"text-[10px] text-text-secondary capitalize\">\n {member.role.toLowerCase()}\n </p>\n </div>\n </div>\n <span className=\"text-[10px] capitalize text-text-secondary\">\n {member.status.toLowerCase()}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* Quick Stats */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Quick Stats</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Active Offerings</span>\n <span className=\"text-sm font-semibold text-text-primary\">\n {metrics.activeOfferings}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Customer Rating</span>\n <span className=\"text-sm font-semibold text-text-primary flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text fill-status-warning-text\" />\n {metrics.rating.toFixed(1)}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">Reviews</span>\n <span className=\"text-sm font-semibold text-text-primary\">{reviews.length}</span>\n </div>\n </div>\n </div>\n\n {/* Business Settings Links */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Business Settings</h3>\n <div className=\"space-y-2\">\n {[\n { label: 'Service Settings', icon: Settings, path: '/cart-owner/settings' },\n { label: 'Business Profile', icon: Edit, path: '/cart-owner/profile' },\n { label: 'Add Offerings', icon: Plus, path: '/cart-owner/inventory' },\n ].map((link) => {\n const Icon = link.icon;\n return (\n <button\n key={link.label}\n type=\"button\"\n onClick={() => navigateTo(link.path)}\n className=\"w-full flex items-center justify-between rounded-md border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <span className=\"flex items-center gap-2\">\n <Icon className=\"h-3.5 w-3.5\" />\n {link.label}\n </span>\n <ChevronRight className=\"h-3 w-3 text-text-secondary\" />\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Recent Activity */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Recent Activity</h3>\n {recentOrders.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No recent activity yet.</p>\n ) : (\n <div className=\"space-y-2 text-xs\">\n {recentOrders.map((order) => (\n <div key={order.id} className=\"flex items-center gap-2\">\n <Activity className=\"h-3.5 w-3.5 text-text-secondary shrink-0\" />\n <span className=\"text-text-secondary truncate\">\n Order #{order.id.slice(0, 8)} {order.status}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|