@burdenoff/microfe-kadaikodi 2026.704.1 → 2026.704.2
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/hooks/useKadaikodiApi.js +77 -26
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +341 -461
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +115 -399
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +140 -283
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +282 -453
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js +115 -242
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +2 -2
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +503 -627
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +339 -282
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +323 -422
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +374 -383
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +249 -208
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +1 -1
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +171 -627
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js +331 -415
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js +18 -670
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -2
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js +191 -369
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +233 -389
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +76 -118
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +135 -213
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +272 -774
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +232 -343
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +112 -600
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js +127 -294
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +204 -290
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +159 -500
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +399 -487
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +13 -13
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js +192 -296
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +245 -397
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +85 -117
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +177 -395
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/AnalyticsDashboard.tsx"],"sourcesContent":["/**\n * Analytics Dashboard Page\n *\n * Revenue overview (today/week/month/year with growth), order statistics,\n * popular times progress bars, performance metrics, top selling offerings,\n * category performance, customer overview with top customers table,\n * peak hours/days, date range selector.\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useState } from 'react';\nimport {\n IndianRupee,\n ShoppingCart,\n Users,\n TrendingUp,\n BarChart3,\n Clock,\n Star,\n ArrowUpRight,\n ArrowDownRight,\n Download,\n Target,\n Percent,\n ThumbsUp,\n CalendarDays,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useAdminAnalytics, useDashboardStats } from '../../hooks/useKadaikodiApi';\nimport { formatCurrency, formatNumber } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Mock Analytics Data (full from legacy)\n// ============================================================================\n\nconst analyticsData = {\n revenue: {\n today: 12450,\n week: 87150,\n month: 348600,\n year: 4183200,\n growth: { daily: 12.5, weekly: 8.3, monthly: 15.2 },\n },\n orders: {\n total: 156,\n pending: 3,\n completed: 145,\n cancelled: 8,\n averageValue: 285,\n averagePreparationTime: 18,\n popularTimes: [\n { hour: 8, orders: 12 },\n { hour: 9, orders: 15 },\n { hour: 10, orders: 18 },\n { hour: 11, orders: 22 },\n { hour: 12, orders: 28 },\n { hour: 13, orders: 32 },\n { hour: 14, orders: 16 },\n { hour: 15, orders: 12 },\n { hour: 16, orders: 14 },\n { hour: 17, orders: 18 },\n { hour: 18, orders: 20 },\n { hour: 19, orders: 25 },\n { hour: 20, orders: 22 },\n { hour: 21, orders: 15 },\n ],\n },\n offerings: {\n topSelling: [\n { id: '1', name: 'Masala Dosa', quantity: 245, revenue: 19600, category: 'Food & Beverage' },\n {\n id: '2',\n name: 'Haircut Service',\n quantity: 89,\n revenue: 11340,\n category: 'Personal Care & Beauty',\n },\n { id: '3', name: 'Filter Coffee', quantity: 312, revenue: 9360, category: 'Food & Beverage' },\n {\n id: '4',\n name: 'Mobile Repair',\n quantity: 67,\n revenue: 6680,\n category: 'Repair & Maintenance',\n },\n { id: '5', name: 'Pongal', quantity: 98, revenue: 5880, category: 'Food & Beverage' },\n ],\n leastSelling: [\n { id: '6', name: 'Bisi Bele Bath', quantity: 12, revenue: 1440, category: 'Food & Beverage' },\n { id: '7', name: 'Cleaning Service', quantity: 8, revenue: 640, category: 'Home Services' },\n { id: '8', name: 'Kosambari', quantity: 15, revenue: 450, category: 'Food & Beverage' },\n ],\n categories: [\n { category: 'Food & Beverage', revenue: 45000, orders: 450 },\n { category: 'Personal Care & Beauty', revenue: 25000, orders: 180 },\n { category: 'Repair & Maintenance', revenue: 15000, orders: 120 },\n { category: 'Home Services', revenue: 8000, orders: 80 },\n ],\n },\n customers: {\n total: 342,\n new: 45,\n returning: 297,\n topCustomers: [\n { id: '1', name: 'Rahul Sharma', orders: 23, totalSpent: 6555 },\n { id: '2', name: 'Priya Patel', orders: 19, totalSpent: 5415 },\n { id: '3', name: 'Amit Kumar', orders: 17, totalSpent: 4845 },\n { id: '4', name: 'Sneha Reddy', orders: 15, totalSpent: 4275 },\n { id: '5', name: 'Vijay Singh', orders: 14, totalSpent: 3990 },\n ],\n satisfaction: { rating: 4.6, reviews: 89, positiveReviews: 78 },\n },\n performance: {\n acceptanceRate: 94,\n cancellationRate: 6,\n onTimeDeliveryRate: 88,\n averageRating: 4.6,\n peakHours: [\n { hour: '12-1 PM', orders: 32 },\n { hour: '1-2 PM', orders: 28 },\n { hour: '7-8 PM', orders: 25 },\n { hour: '8-9 PM', orders: 22 },\n ],\n peakDays: [\n { day: 'Sunday', orders: 45 },\n { day: 'Saturday', orders: 42 },\n { day: 'Friday', orders: 38 },\n ],\n },\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const AnalyticsDashboard = () => {\n const { navigateTo } = useKadaikodi();\n const { data: analytics } = useAdminAnalytics();\n const { data: dashboardStats } = useDashboardStats();\n const [dateRange, setDateRange] = useState('week');\n\n const orderTrends = analytics?.orderTrends ?? [];\n const customerGrowth = analytics?.customerGrowth ?? [];\n\n const maxPopularTime = Math.max(...analyticsData.orders.popularTimes.map((t) => t.orders));\n const maxCategoryRevenue = Math.max(...analyticsData.offerings.categories.map((c) => c.revenue));\n const maxPeakHourOrders = Math.max(...analyticsData.performance.peakHours.map((h) => h.orders));\n const maxPeakDayOrders = Math.max(...analyticsData.performance.peakDays.map((d) => d.orders));\n\n const formatPct = (v: number) => `${v > 0 ? '+' : ''}${v}%`;\n\n return (\n <PageLayout\n title=\"Analytics Dashboard\"\n description=\"Business performance insights and data\"\n actions={\n <div className=\"flex items-center gap-2\">\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"year\">This Year</option>\n </select>\n <button\n type=\"button\"\n onClick={() => alert('Export feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\">\n The performance story of your cart. Use this page to understand how your business is really\n doing — track revenue over time, see how orders break down, learn which hours are busiest so\n you can staff and stock accordingly, and spot your best-selling items. Change the date range\n to compare periods and act on what's growing (or slowing).\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-owner-analytics\"\n className=\"mb-6\"\n steps={[\n {\n id: 'inventory',\n label: 'Restock your best-sellers',\n description: 'Make sure popular items never run out.',\n onClick: () => navigateTo('/owner/inventory'),\n },\n {\n id: 'orders',\n label: 'Work through live orders',\n description: 'Keep prep and delivery times sharp.',\n onClick: () => navigateTo('/owner/orders'),\n },\n {\n id: 'staff',\n label: 'Plan staff for peak hours',\n description: 'Cover the busiest times you see here.',\n onClick: () => navigateTo('/owner/staff'),\n },\n ]}\n />\n\n <div className=\"space-y-6\">\n {/* Revenue Overview — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Revenue Overview</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: \"Today's Revenue\",\n value: analyticsData.revenue.today,\n growth: analyticsData.revenue.growth.daily,\n },\n {\n label: 'This Week',\n value: analyticsData.revenue.week,\n growth: analyticsData.revenue.growth.weekly,\n },\n {\n label: 'This Month',\n value: analyticsData.revenue.month,\n growth: analyticsData.revenue.growth.monthly,\n },\n { label: 'This Year', value: analyticsData.revenue.year, growth: null },\n ].map((card) => (\n <div\n key={card.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 <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {card.growth !== null && (\n <div\n className={cn(\n 'flex items-center gap-1 text-xs font-medium',\n card.growth >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {card.growth >= 0 ? (\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowDownRight className=\"h-3.5 w-3.5\" />\n )}\n {formatPct(card.growth)}\n </div>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">\n {formatCurrency(card.value, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">{card.label}</p>\n </div>\n ))}\n </div>\n </EmphasisPanel>\n\n {/* Order Statistics + Popular Times */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"grid grid-cols-2 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {dashboardStats?.totalOrders ?? 0}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Avg. Order Value</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(analyticsData.orders.averageValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {analyticsData.orders.completed}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Cancelled</p>\n <p className=\"text-xl font-bold text-status-error-text\">\n {analyticsData.orders.cancelled}\n </p>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-1\">Avg. Preparation Time</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {analyticsData.orders.averagePreparationTime} minutes\n </p>\n </div>\n </div>\n </div>\n\n {/* Popular Times */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Popular Times\n </h2>\n </div>\n <div className=\"p-5 space-y-2\">\n {analyticsData.orders.popularTimes.map((t) => {\n const pct = (t.orders / maxPopularTime) * 100;\n const label = `${t.hour}:00`;\n return (\n <div key={t.hour}>\n <div className=\"flex items-center justify-between text-xs mb-0.5\">\n <span className=\"text-text-primary w-14\">{label}</span>\n <span className=\"text-text-secondary\">{t.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full transition-all',\n t.orders > 25\n ? 'bg-status-error-bg-subtle'\n : t.orders > 18\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-success-bg-subtle'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Performance Metrics */}\n <section>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Performance Metrics</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: 'Acceptance Rate',\n value: `${analyticsData.performance.acceptanceRate}%`,\n icon: Target,\n color: 'text-status-success-text',\n },\n {\n label: 'Cancellation Rate',\n value: `${analyticsData.performance.cancellationRate}%`,\n icon: Percent,\n color: 'text-status-error-text',\n },\n {\n label: 'On-Time Delivery',\n value: `${analyticsData.performance.onTimeDeliveryRate}%`,\n icon: Clock,\n color: 'text-text-primary',\n },\n {\n label: 'Average Rating',\n value: `${analyticsData.performance.averageRating}`,\n icon: Star,\n color: 'text-status-warning-text',\n },\n ].map((metric) => {\n const Icon = metric.icon;\n return (\n <div\n key={metric.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className={cn('h-5 w-5', metric.color)} />\n <span className=\"text-xs text-text-secondary\">{metric.label}</span>\n </div>\n <p className={cn('text-2xl font-bold', metric.color)}>{metric.value}</p>\n </div>\n );\n })}\n </div>\n </section>\n\n {/* Top Selling + Category Performance */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Top Selling Offerings */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Top Selling Offerings\n </h2>\n </div>\n <div className=\"divide-y divide-border\">\n {analyticsData.offerings.topSelling.map((item, i) => (\n <div key={item.id} className=\"flex items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium text-text-secondary\">\n {i + 1}\n </span>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {item.category} | {item.quantity} sold\n </p>\n </div>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n {/* Least Selling */}\n <div className=\"border-t border-border-subtle px-5 py-3\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Least Selling</p>\n {analyticsData.offerings.leastSelling.map((item) => (\n <div key={item.id} className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-xs text-text-secondary\">{item.name}</span>\n <span className=\"text-xs text-text-secondary\">\n {item.quantity} sold |{' '}\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n </div>\n\n {/* Category Performance */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Category Performance\n </h2>\n </div>\n <div className=\"p-5 space-y-4\">\n {analyticsData.offerings.categories.map((cat) => {\n const pct = (cat.revenue / maxCategoryRevenue) * 100;\n return (\n <div key={cat.category}>\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-text-primary\">{cat.category}</span>\n <span className=\"text-text-secondary\">\n {formatCurrency(cat.revenue, { minimumFractionDigits: 0 })} ({cat.orders}{' '}\n orders)\n </span>\n </div>\n <div className=\"h-2.5 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Customer Overview + Peak Hours/Days */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Customer Overview */}\n <div className=\"lg:col-span-2 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Customer Overview\n </h2>\n </div>\n <div className=\"p-5\">\n {/* Customer Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Customers</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {dashboardStats?.activeCustomers ?? 0}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">New This Month</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {analyticsData.customers.new}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Returning</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {analyticsData.customers.returning}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Satisfaction</p>\n <p className=\"text-xl font-bold text-status-warning-text flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n {analyticsData.customers.satisfaction.rating}\n </p>\n </div>\n </div>\n\n {/* Top Customers Table */}\n <p className=\"text-sm font-medium text-text-primary mb-2\">Top Customers</p>\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=\"py-2 text-left font-medium text-text-secondary\">#</th>\n <th className=\"py-2 text-left font-medium text-text-secondary\">Customer</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">Orders</th>\n <th className=\"py-2 text-right font-medium text-text-secondary\">\n Total Spent\n </th>\n </tr>\n </thead>\n <tbody>\n {analyticsData.customers.topCustomers.map((cust, i) => (\n <tr key={cust.id} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"py-2.5 text-text-secondary\">{i + 1}</td>\n <td className=\"py-2.5 font-medium text-text-primary\">{cust.name}</td>\n <td className=\"py-2.5 text-right text-text-primary\">{cust.orders}</td>\n <td className=\"py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(cust.totalSpent, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Reviews Summary */}\n <div className=\"mt-4 flex items-center gap-4 text-sm\">\n <div className=\"flex items-center gap-1.5\">\n <ThumbsUp className=\"h-4 w-4 text-status-success-text\" />\n <span className=\"text-text-secondary\">\n {analyticsData.customers.satisfaction.positiveReviews}/\n {analyticsData.customers.satisfaction.reviews} positive reviews\n </span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Peak Hours & Days */}\n <div className=\"space-y-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Peak Hours\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakHours.map((h) => {\n const pct = (h.orders / maxPeakHourOrders) * 100;\n return (\n <div key={h.hour}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{h.hour}</span>\n <span className=\"text-text-secondary\">{h.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={cn(\n 'h-full rounded-full',\n h.orders > 28\n ? 'bg-status-error-bg-subtle'\n : h.orders > 22\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-success-bg-subtle'\n )}\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Peak Days\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {analyticsData.performance.peakDays.map((d) => {\n const pct = (d.orders / maxPeakDayOrders) * 100;\n return (\n <div key={d.day}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{d.day}</span>\n <span className=\"text-text-secondary\">{d.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n\n {/* Order Trends Table (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Daily Order Trends\n </h2>\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-2.5 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">Orders</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">\n Revenue\n </th>\n </tr>\n </thead>\n <tbody>\n {orderTrends.map((day) => (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-2.5 text-text-primary\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n })}\n </td>\n <td className=\"px-5 py-2.5 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Customer Growth Mini Chart (from mockAdminAnalytics) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Users className=\"h-4 w-4 text-text-secondary\" />\n Monthly Customer Growth\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"flex items-end gap-1.5 h-20\">\n {customerGrowth.map((month) => {\n const maxNew = Math.max(...customerGrowth.map((m) => m.newCustomers), 1);\n const height = (month.newCustomers / maxNew) * 100;\n return (\n <div\n key={month.month}\n className=\"flex-1 rounded-t bg-[var(--color-accent-soft)] hover:bg-[var(--color-accent-soft)] transition-colors cursor-default\"\n style={{ height: `${height}%` }}\n title={`${month.month}: ${month.newCustomers} new customers`}\n />\n );\n })}\n </div>\n <div className=\"flex justify-between mt-2 text-xs text-text-secondary\">\n {customerGrowth.length > 0 && (\n <>\n <span>{customerGrowth[0].month}</span>\n <span>{customerGrowth[customerGrowth.length - 1].month}</span>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;AAuCA,IAAM,IAAgB;CACpB,SAAS;EACP,OAAO;EACP,MAAM;EACN,OAAO;EACP,MAAM;EACN,QAAQ;GAAE,OAAO;GAAM,QAAQ;GAAK,SAAS;GAAM;EACpD;CACD,QAAQ;EACN,OAAO;EACP,SAAS;EACT,WAAW;EACX,WAAW;EACX,cAAc;EACd,wBAAwB;EACxB,cAAc;GACZ;IAAE,MAAM;IAAG,QAAQ;IAAI;GACvB;IAAE,MAAM;IAAG,QAAQ;IAAI;GACvB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACxB;IAAE,MAAM;IAAI,QAAQ;IAAI;GACzB;EACF;CACD,WAAW;EACT,YAAY;GACV;IAAE,IAAI;IAAK,MAAM;IAAe,UAAU;IAAK,SAAS;IAAO,UAAU;IAAmB;GAC5F;IACE,IAAI;IACJ,MAAM;IACN,UAAU;IACV,SAAS;IACT,UAAU;IACX;GACD;IAAE,IAAI;IAAK,MAAM;IAAiB,UAAU;IAAK,SAAS;IAAM,UAAU;IAAmB;GAC7F;IACE,IAAI;IACJ,MAAM;IACN,UAAU;IACV,SAAS;IACT,UAAU;IACX;GACD;IAAE,IAAI;IAAK,MAAM;IAAU,UAAU;IAAI,SAAS;IAAM,UAAU;IAAmB;GACtF;EACD,cAAc;GACZ;IAAE,IAAI;IAAK,MAAM;IAAkB,UAAU;IAAI,SAAS;IAAM,UAAU;IAAmB;GAC7F;IAAE,IAAI;IAAK,MAAM;IAAoB,UAAU;IAAG,SAAS;IAAK,UAAU;IAAiB;GAC3F;IAAE,IAAI;IAAK,MAAM;IAAa,UAAU;IAAI,SAAS;IAAK,UAAU;IAAmB;GACxF;EACD,YAAY;GACV;IAAE,UAAU;IAAmB,SAAS;IAAO,QAAQ;IAAK;GAC5D;IAAE,UAAU;IAA0B,SAAS;IAAO,QAAQ;IAAK;GACnE;IAAE,UAAU;IAAwB,SAAS;IAAO,QAAQ;IAAK;GACjE;IAAE,UAAU;IAAiB,SAAS;IAAM,QAAQ;IAAI;GACzD;EACF;CACD,WAAW;EACT,OAAO;EACP,KAAK;EACL,WAAW;EACX,cAAc;GACZ;IAAE,IAAI;IAAK,MAAM;IAAgB,QAAQ;IAAI,YAAY;IAAM;GAC/D;IAAE,IAAI;IAAK,MAAM;IAAe,QAAQ;IAAI,YAAY;IAAM;GAC9D;IAAE,IAAI;IAAK,MAAM;IAAc,QAAQ;IAAI,YAAY;IAAM;GAC7D;IAAE,IAAI;IAAK,MAAM;IAAe,QAAQ;IAAI,YAAY;IAAM;GAC9D;IAAE,IAAI;IAAK,MAAM;IAAe,QAAQ;IAAI,YAAY;IAAM;GAC/D;EACD,cAAc;GAAE,QAAQ;GAAK,SAAS;GAAI,iBAAiB;GAAI;EAChE;CACD,aAAa;EACX,gBAAgB;EAChB,kBAAkB;EAClB,oBAAoB;EACpB,eAAe;EACf,WAAW;GACT;IAAE,MAAM;IAAW,QAAQ;IAAI;GAC/B;IAAE,MAAM;IAAU,QAAQ;IAAI;GAC9B;IAAE,MAAM;IAAU,QAAQ;IAAI;GAC9B;IAAE,MAAM;IAAU,QAAQ;IAAI;GAC/B;EACD,UAAU;GACR;IAAE,KAAK;IAAU,QAAQ;IAAI;GAC7B;IAAE,KAAK;IAAY,QAAQ;IAAI;GAC/B;IAAE,KAAK;IAAU,QAAQ;IAAI;GAC9B;EACF;CACF,EAMY,UAA2B;CACtC,IAAM,EAAE,kBAAe,GAAc,EAC/B,EAAE,MAAM,MAAc,GAAmB,EACzC,EAAE,MAAM,MAAmB,GAAmB,EAC9C,CAAC,GAAW,KAAgB,EAAS,OAAO,EAE5C,IAAc,GAAW,eAAe,EAAE,EAC1C,IAAiB,GAAW,kBAAkB,EAAE,EAEhD,IAAiB,KAAK,IAAI,GAAG,EAAc,OAAO,aAAa,KAAK,MAAM,EAAE,OAAO,CAAC,EACpF,IAAqB,KAAK,IAAI,GAAG,EAAc,UAAU,WAAW,KAAK,MAAM,EAAE,QAAQ,CAAC,EAC1F,IAAoB,KAAK,IAAI,GAAG,EAAc,YAAY,UAAU,KAAK,MAAM,EAAE,OAAO,CAAC,EACzF,IAAmB,KAAK,IAAI,GAAG,EAAc,YAAY,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,EAEvF,KAAa,MAAc,GAAG,IAAI,IAAI,MAAM,KAAK,EAAE;AAEzD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,UAAD;IACE,OAAO;IACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;IAC7C,WAAU;cAHZ;KAKE,kBAAC,UAAD;MAAQ,OAAM;gBAAQ;MAAc,CAAA;KACpC,kBAAC,UAAD;MAAQ,OAAM;gBAAO;MAAkB,CAAA;KACvC,kBAAC,UAAD;MAAQ,OAAM;gBAAQ;MAAmB,CAAA;KACzC,kBAAC,UAAD;MAAQ,OAAM;gBAAO;MAAkB,CAAA;KAChC;OACT,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,MAAM,8BAA8B;IACnD,WAAU;cAHZ,CAKE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,SAEzB;MACL;;YAvBV;GA0BE,kBAAC,GAAD;IAAa,WAAU;cAAO;IAKhB,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,WAAU;IACV,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAW,mBAAmB;MAC9C;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAW,gBAAgB;MAC3C;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAW,eAAe;MAC1C;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAiD;MAAqB,CAAA,EACpF,kBAAC,OAAD;MAAK,WAAU;gBACZ;OACC;QACE,OAAO;QACP,OAAO,EAAc,QAAQ;QAC7B,QAAQ,EAAc,QAAQ,OAAO;QACtC;OACD;QACE,OAAO;QACP,OAAO,EAAc,QAAQ;QAC7B,QAAQ,EAAc,QAAQ,OAAO;QACtC;OACD;QACE,OAAO;QACP,OAAO,EAAc,QAAQ;QAC7B,QAAQ,EAAc,QAAQ,OAAO;QACtC;OACD;QAAE,OAAO;QAAa,OAAO,EAAc,QAAQ;QAAM,QAAQ;QAAM;OACxE,CAAC,KAAK,MACL,kBAAC,OAAD;OAEE,WAAU;iBAFZ;QAIE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,GAAD,EAAa,WAAU,+BAAgC,CAAA;UACnD,CAAA,EACL,EAAK,WAAW,QACf,kBAAC,OAAD;UACE,WAAW,EACT,+CACA,EAAK,UAAU,IAAI,6BAA6B,yBACjD;oBAJH,CAMG,EAAK,UAAU,IACd,kBAAC,GAAD,EAAc,WAAU,eAAgB,CAAA,GAExC,kBAAC,GAAD,EAAgB,WAAU,eAAgB,CAAA,EAE3C,EAAU,EAAK,OAAO,CACnB;YAEJ;;QACN,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAe,EAAK,OAAO,EAAE,uBAAuB,GAAG,CAAC;SACvD,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAAoC,EAAK;SAAU,CAAA;QAC5D;SA3BC,EAAK,MA2BN,CACN;MACE,CAAA,CACQ,EAAA,CAAA;KAGhB,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EAAA,mBAErD;;QACD,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAgB,CAAA,EAC3D,kBAAC,KAAD;WAAG,WAAU;qBACV,GAAgB,eAAe;WAC9B,CAAA,CACA,EAAA,CAAA;UACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAoB,CAAA,EAC/D,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAe,EAAc,OAAO,cAAc,EACjD,uBAAuB,GACxB,CAAC;WACA,CAAA,CACA,EAAA,CAAA;UACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAa,CAAA,EACxD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAc,OAAO;WACpB,CAAA,CACA,EAAA,CAAA;UACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAa,CAAA,EACxD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAc,OAAO;WACpB,CAAA,CACA,EAAA,CAAA;UACF;YACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAmC;SAAyB,CAAA,EACzE,kBAAC,KAAD;SAAG,WAAU;mBAAb,CACG,EAAc,OAAO,wBAAuB,WAC3C;WACA,EAAA,CAAA,CACF;UACF;UAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EAAA,gBAE9C;;QACD,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAc,OAAO,aAAa,KAAK,MAAM;SAC5C,IAAM,IAAO,EAAE,SAAS,IAAkB;AAE1C,gBACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAJR,GAAG,EAAE,KAAK;WAIqC,CAAA,EACvD,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CAAuC,EAAE,QAAO,UAAc;aAC1D;aACN,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAW,EACT,sCACA,EAAE,SAAS,KACP,8BACA,EAAE,SAAS,KACT,gCACA,8BACP;WACD,OAAO,EAAE,OAAO,GAAG,EAAI,IAAI;WAC3B,CAAA;UACE,CAAA,CACF,EAAA,EAlBI,EAAE,KAkBN;UAER;QACE,CAAA,CACF;SACF;;KAGN,kBAAC,WAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;gBAAiD;MAAwB,CAAA,EACvF,kBAAC,OAAD;MAAK,WAAU;gBACZ;OACC;QACE,OAAO;QACP,OAAO,GAAG,EAAc,YAAY,eAAe;QACnD,MAAM;QACN,OAAO;QACR;OACD;QACE,OAAO;QACP,OAAO,GAAG,EAAc,YAAY,iBAAiB;QACrD,MAAM;QACN,OAAO;QACR;OACD;QACE,OAAO;QACP,OAAO,GAAG,EAAc,YAAY,mBAAmB;QACvD,MAAM;QACN,OAAO;QACR;OACD;QACE,OAAO;QACP,OAAO,GAAG,EAAc,YAAY;QACpC,MAAM;QACN,OAAO;QACR;OACF,CAAC,KAAK,MAAW;OAChB,IAAM,IAAO,EAAO;AACpB,cACE,kBAAC,OAAD;QAEE,WAAU;kBAFZ,CAIE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAM,WAAW,EAAG,WAAW,EAAO,MAAM,EAAI,CAAA,EAChD,kBAAC,QAAD;UAAM,WAAU;oBAA+B,EAAO;UAAa,CAAA,CAC/D;YACN,kBAAC,KAAD;SAAG,WAAW,EAAG,sBAAsB,EAAO,MAAM;mBAAG,EAAO;SAAU,CAAA,CACpE;UARC,EAAO,MAQR;QAER;MACE,CAAA,CACE,EAAA,CAAA;KAGV,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,MAAD;UAAI,WAAU;oBAAd,CACE,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,EAAA,wBAEnD;;SACD,CAAA;QACN,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAc,UAAU,WAAW,KAAK,GAAM,MAC7C,kBAAC,OAAD;UAAmB,WAAU;oBAA7B,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBACb,IAAI;YACA,CAAA,EACP,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAyC,EAAK;YAAS,CAAA,EACpE,kBAAC,KAAD;YAAG,WAAU;sBAAb;aACG,EAAK;aAAS;aAAI,EAAK;aAAS;aAC/B;cACA,EAAA,CAAA,CACF;cACN,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAe,EAAK,SAAS,EAAE,uBAAuB,GAAG,CAAC;WACtD,CAAA,CACH;YAfI,EAAK,GAeT,CACN;SACE,CAAA;QAEN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA+C;UAAiB,CAAA,EAC5E,EAAc,UAAU,aAAa,KAAK,MACzC,kBAAC,OAAD;UAAmB,WAAU;oBAA7B,CACE,kBAAC,QAAD;WAAM,WAAU;qBAA+B,EAAK;WAAY,CAAA,EAChE,kBAAC,QAAD;WAAM,WAAU;qBAAhB;YACG,EAAK;YAAS;YAAQ;YACtB,EAAe,EAAK,SAAS,EAAE,uBAAuB,GAAG,CAAC;YACtD;aACH;YANI,EAAK,GAMT,CACN,CACE;;QACF;UAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,EAAA,uBAElD;;QACD,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAc,UAAU,WAAW,KAAK,MAAQ;SAC/C,IAAM,IAAO,EAAI,UAAU,IAAsB;AACjD,gBACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAqB,EAAI;WAAgB,CAAA,EACzD,kBAAC,QAAD;WAAM,WAAU;qBAAhB;YACG,EAAe,EAAI,SAAS,EAAE,uBAAuB,GAAG,CAAC;YAAC;YAAG,EAAI;YAAQ;YAAI;YAEzE;aACH;aACN,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAU;WACV,OAAO,EAAE,OAAO,GAAG,EAAI,IAAI;WAC3B,CAAA;UACE,CAAA,CACF,EAAA,EAdI,EAAI,SAcR;UAER;QACE,CAAA,CACF;SACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EAAA,oBAE9C;;QACD,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SAEE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAA8B;YAAmB,CAAA,EAC9D,kBAAC,KAAD;YAAG,WAAU;sBACV,GAAgB,mBAAmB;YAClC,CAAA,CACA,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAA8B;YAAkB,CAAA,EAC7D,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAc,UAAU;YACvB,CAAA,CACA,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAA8B;YAAa,CAAA,EACxD,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAc,UAAU;YACvB,CAAA,CACA,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;YAAG,WAAU;sBAA8B;YAAgB,CAAA,EAC3D,kBAAC,KAAD;YAAG,WAAU;sBAAb,CACE,kBAAC,GAAD,EAAM,WAAU,6DAA8D,CAAA,EAC7E,EAAc,UAAU,aAAa,OACpC;cACA,EAAA,CAAA;WACF;;SAGN,kBAAC,KAAD;UAAG,WAAU;oBAA6C;UAAiB,CAAA;SAC3E,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,SAAD;WAAO,WAAU;qBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;YAAI,WAAU;sBAAd;aACE,kBAAC,MAAD;cAAI,WAAU;wBAAiD;cAAM,CAAA;aACrE,kBAAC,MAAD;cAAI,WAAU;wBAAiD;cAAa,CAAA;aAC5E,kBAAC,MAAD;cAAI,WAAU;wBAAkD;cAAW,CAAA;aAC3E,kBAAC,MAAD;cAAI,WAAU;wBAAkD;cAE3D,CAAA;aACF;eACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAc,UAAU,aAAa,KAAK,GAAM,MAC/C,kBAAC,MAAD;YAAkB,WAAU;sBAA5B;aACE,kBAAC,MAAD;cAAI,WAAU;wBAA8B,IAAI;cAAO,CAAA;aACvD,kBAAC,MAAD;cAAI,WAAU;wBAAwC,EAAK;cAAU,CAAA;aACrE,kBAAC,MAAD;cAAI,WAAU;wBAAuC,EAAK;cAAY,CAAA;aACtE,kBAAC,MAAD;cAAI,WAAU;wBACX,EAAe,EAAK,YAAY,EAAE,uBAAuB,GAAG,CAAC;cAC3D,CAAA;aACF;cAPI,EAAK,GAOT,CACL,EACI,CAAA,CACF;;UACJ,CAAA;SAGN,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,oCAAqC,CAAA,EACzD,kBAAC,QAAD;YAAM,WAAU;sBAAhB;aACG,EAAc,UAAU,aAAa;aAAgB;aACrD,EAAc,UAAU,aAAa;aAAQ;aACzC;cACH;;UACF,CAAA;SACF;UACF;UAGN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,MAAD;UAAI,WAAU;oBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EAAA,aAE9C;;SACD,CAAA,EACN,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAc,YAAY,UAAU,KAAK,MAAM;UAC9C,IAAM,IAAO,EAAE,SAAS,IAAqB;AAC7C,iBACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAqB,EAAE;YAAY,CAAA,EACnD,kBAAC,QAAD;YAAM,WAAU;sBAAhB,CAAuC,EAAE,QAAO,UAAc;cAC1D;cACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YACE,WAAW,EACT,uBACA,EAAE,SAAS,KACP,8BACA,EAAE,SAAS,KACT,gCACA,8BACP;YACD,OAAO,EAAE,OAAO,GAAG,EAAI,IAAI;YAC3B,CAAA;WACE,CAAA,CACF,EAAA,EAlBI,EAAE,KAkBN;WAER;SACE,CAAA,CACF;WAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,MAAD;UAAI,WAAU;oBAAd,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EAAA,YAErD;;SACD,CAAA,EACN,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAc,YAAY,SAAS,KAAK,MAAM;UAC7C,IAAM,IAAO,EAAE,SAAS,IAAoB;AAC5C,iBACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAqB,EAAE;YAAW,CAAA,EAClD,kBAAC,QAAD;YAAM,WAAU;sBAAhB,CAAuC,EAAE,QAAO,UAAc;cAC1D;cACN,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,OAAD;YACE,WAAU;YACV,OAAO,EAAE,OAAO,GAAG,EAAI,IAAI;YAC3B,CAAA;WACE,CAAA,CACF,EAAA,EAXI,EAAE,IAWN;WAER;SACE,CAAA,CACF;UACF;SACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,MAAD;QAAI,WAAU;kBAAd,CACE,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,EAAA,qBAEnD;;OACD,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACE,kBAAC,MAAD;WAAI,WAAU;qBAAwD;WAAS,CAAA;UAC/E,kBAAC,MAAD;WAAI,WAAU;qBAAyD;WAAW,CAAA;UAClF,kBAAC,MAAD;WAAI,WAAU;qBAAyD;WAElE,CAAA;UACF;YACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAY,KAAK,MAChB,kBAAC,MAAD;SAAmB,WAAU;mBAA7B;UACE,kBAAC,MAAD;WAAI,WAAU;qBACX,IAAI,KAAK,EAAI,KAAK,CAAC,mBAAmB,SAAS;YAC9C,KAAK;YACL,OAAO;YACR,CAAC;WACC,CAAA;UACL,kBAAC,MAAD;WAAI,WAAU;qBAA4C,EAAI;WAAY,CAAA;UAC1E,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAe,EAAI,SAAS,EAAE,uBAAuB,GAAG,CAAC;WACvD,CAAA;UACF;WAXI,EAAI,KAWR,CACL,EACI,CAAA,CACF;;OACJ,CAAA,CACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,MAAD;QAAI,WAAU;kBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EAAA,0BAE9C;;OACD,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,KAAK,MAAU;SAC7B,IAAM,IAAS,KAAK,IAAI,GAAG,EAAe,KAAK,MAAM,EAAE,aAAa,EAAE,EAAE;AAExE,gBACE,kBAAC,OAAD;UAEE,WAAU;UACV,OAAO,EAAE,QAAQ,GALL,EAAM,eAAe,IAAU,IAKhB,IAAI;UAC/B,OAAO,GAAG,EAAM,MAAM,IAAI,EAAM,aAAa;UAC7C,EAJK,EAAM,MAIX;UAEJ;QACE,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAe,SAAS,KACvB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,QAAD,EAAA,UAAO,EAAe,GAAG,OAAa,CAAA,EACtC,kBAAC,QAAD,EAAA,UAAO,EAAe,EAAe,SAAS,GAAG,OAAa,CAAA,CAC7D,EAAA,CAAA;QAED,CAAA,CACF;SACF;;KACF;;GACK"}
|
|
1
|
+
{"version":3,"file":"AnalyticsDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/AnalyticsDashboard.tsx"],"sourcesContent":["/**\n * Analytics Dashboard Page\n *\n * Performance insights for the signed-in owner's own service provider (cart):\n * revenue overview with real period-over-period growth, order statistics,\n * popular times, performance metrics, top/least selling offerings, category\n * performance, reviews & ratings, peak hours/days and daily order trends —\n * every number derived from live backend data (no fabrication).\n *\n * @module kadaikodi/pages/cart-owner\n */\n\nimport { useMemo, useState } from 'react';\nimport {\n IndianRupee,\n ShoppingCart,\n TrendingUp,\n BarChart3,\n Clock,\n Star,\n ArrowUpRight,\n ArrowDownRight,\n Download,\n Target,\n Percent,\n CalendarDays,\n ThumbsUp,\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} from '../../hooks/useKadaikodiApi';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DAY_MS = 86_400_000;\n\nconst CATEGORY_LABELS: Record<string, string> = {\n FOOD_BEVERAGE: 'Food & Beverage',\n PERSONAL_CARE_BEAUTY: 'Personal Care & Beauty',\n CLOTHING_FASHION: 'Clothing & Fashion',\n REPAIR_MAINTENANCE: 'Repair & Maintenance',\n HOME_SERVICES: 'Home Services',\n HEALTH_WELLNESS: 'Health & Wellness',\n EDUCATION_SKILLS: 'Education & Skills',\n RETAIL_MERCHANDISE: 'Retail & Merchandise',\n GROCERY_ESSENTIALS: 'Grocery & Essentials',\n};\n\nconst startOfToday = (): Date => {\n const d = new Date();\n d.setHours(0, 0, 0, 0);\n return d;\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const AnalyticsDashboard = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n const [dateRange, setDateRange] = useState('week');\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\n const offeringCategoryByName = useMemo(\n () => new Map(offerings.map((o) => [o.name, CATEGORY_LABELS[o.category] ?? o.category])),\n [offerings]\n );\n\n // ---- Revenue (real, from delivered orders) ----\n const revenue = useMemo(() => {\n const delivered = orders.filter((o) => o.status === 'delivered');\n const t0 = startOfToday().getTime();\n const inRange = (start: number, end: number) =>\n delivered\n .filter((o) => {\n const d = new Date(o.orderDate).getTime();\n return d >= start && d < end;\n })\n .reduce((s, o) => s + o.total, 0);\n\n const today = inRange(t0, t0 + DAY_MS);\n const yesterday = inRange(t0 - DAY_MS, t0);\n const week = inRange(t0 - 6 * DAY_MS, t0 + DAY_MS);\n const prevWeek = inRange(t0 - 13 * DAY_MS, t0 - 6 * DAY_MS);\n const month = inRange(t0 - 29 * DAY_MS, t0 + DAY_MS);\n const prevMonth = inRange(t0 - 59 * DAY_MS, t0 - 29 * DAY_MS);\n const year = inRange(t0 - 364 * DAY_MS, t0 + DAY_MS);\n\n const growth = (cur: number, prev: number): number | null =>\n prev > 0 ? Math.round(((cur - prev) / prev) * 1000) / 10 : null;\n\n return {\n today,\n week,\n month,\n year,\n dailyGrowth: growth(today, yesterday),\n weeklyGrowth: growth(week, prevWeek),\n monthlyGrowth: growth(month, prevMonth),\n };\n }, [orders]);\n\n // ---- Order & performance stats (real) ----\n const orderStats = useMemo(() => {\n const total = orders.length;\n const delivered = orders.filter((o) => o.status === 'delivered');\n const cancelled = orders.filter((o) => o.status === 'cancelled');\n const avgOrderValue =\n delivered.length > 0\n ? Math.round(delivered.reduce((s, o) => s + o.total, 0) / delivered.length)\n : 0;\n return {\n total,\n completed: delivered.length,\n cancelled: cancelled.length,\n avgOrderValue,\n acceptanceRate: total > 0 ? Math.round(((total - cancelled.length) / total) * 100) : 0,\n cancellationRate: total > 0 ? Math.round((cancelled.length / total) * 100) : 0,\n completionRate: total > 0 ? Math.round((delivered.length / total) * 100) : 0,\n };\n }, [orders]);\n\n // ---- Popular times, peak hours & days (real, from order timestamps) ----\n const { popularTimes, peakHours, peakDays } = useMemo(() => {\n const hourCounts = new Array<number>(24).fill(0);\n const dayCounts = new Map<string, number>();\n orders.forEach((o) => {\n const d = new Date(o.orderDate);\n hourCounts[d.getHours()] += 1;\n const day = d.toLocaleDateString('en-US', { weekday: 'long' });\n dayCounts.set(day, (dayCounts.get(day) ?? 0) + 1);\n });\n const times = hourCounts\n .map((count, hour) => ({ hour, orders: count }))\n .filter((h) => h.orders > 0);\n return {\n popularTimes: times,\n peakHours: [...times].sort((a, b) => b.orders - a.orders).slice(0, 4),\n peakDays: [...dayCounts.entries()]\n .map(([day, count]) => ({ day, orders: count }))\n .sort((a, b) => b.orders - a.orders)\n .slice(0, 3),\n };\n }, [orders]);\n\n // ---- Top / least selling & category performance (real, from order items) ----\n const { topSelling, leastSelling, categories } = useMemo(() => {\n const itemAgg = new Map<string, { quantity: number; revenue: number; category: string }>();\n const catAgg = new Map<string, { revenue: number; units: number }>();\n orders.forEach((o) =>\n o.items.forEach((it) => {\n const category = offeringCategoryByName.get(it.name) ?? 'Other';\n const item = itemAgg.get(it.name) ?? { quantity: 0, revenue: 0, category };\n item.quantity += it.quantity;\n item.revenue += it.price * it.quantity;\n itemAgg.set(it.name, item);\n const cat = catAgg.get(category) ?? { revenue: 0, units: 0 };\n cat.revenue += it.price * it.quantity;\n cat.units += it.quantity;\n catAgg.set(category, cat);\n })\n );\n const items = [...itemAgg.entries()].map(([name, v]) => ({ name, ...v }));\n return {\n topSelling: [...items].sort((a, b) => b.revenue - a.revenue).slice(0, 5),\n leastSelling: [...items].sort((a, b) => a.quantity - b.quantity).slice(0, 3),\n categories: [...catAgg.entries()]\n .map(([category, v]) => ({ category, ...v }))\n .sort((a, b) => b.revenue - a.revenue),\n };\n }, [orders, offeringCategoryByName]);\n\n // ---- Reviews & ratings (real) ----\n const reviewSummary = useMemo(() => {\n const count = reviews.length;\n const average = count > 0 ? reviews.reduce((s, r) => s + r.rating, 0) / count : 0;\n const positive = reviews.filter((r) => r.rating >= 4).length;\n const distribution = [5, 4, 3, 2, 1].map((star) => ({\n star,\n count: reviews.filter((r) => r.rating === star).length,\n }));\n const recent = [...reviews]\n .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())\n .slice(0, 4);\n return { count, average, positive, distribution, recent };\n }, [reviews]);\n\n // ---- Daily order trends (real, last 14 days) ----\n const orderTrends = useMemo(() => {\n const t0 = startOfToday().getTime();\n const days: { date: string; orders: number; revenue: number }[] = [];\n for (let i = 13; i >= 0; i--) {\n const start = t0 - i * DAY_MS;\n const end = start + DAY_MS;\n const dayOrders = orders.filter((o) => {\n const d = new Date(o.orderDate).getTime();\n return d >= start && d < end;\n });\n days.push({\n date: new 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 const maxPopularTime = Math.max(...popularTimes.map((t) => t.orders), 1);\n const maxCategoryRevenue = Math.max(...categories.map((c) => c.revenue), 1);\n const maxPeakHourOrders = Math.max(...peakHours.map((h) => h.orders), 1);\n const maxPeakDayOrders = Math.max(...peakDays.map((d) => d.orders), 1);\n const maxDistribution = Math.max(...reviewSummary.distribution.map((d) => d.count), 1);\n\n const formatPct = (v: number) => `${v > 0 ? '+' : ''}${v}%`;\n\n // ---- Loading / no-provider states ----\n if (providersLoading) {\n return (\n <PageLayout title=\"Analytics Dashboard\" description=\"Business performance insights and data\">\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=\"Analytics Dashboard\" description=\"Business performance insights and data\">\n <EmptyState\n illustration=\"empty-data\"\n title=\"No analytics yet\"\n description=\"You don't have a service provider yet. Set up your cart and start taking orders to see your performance insights here.\"\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 Set up your cart\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const revenueCards = [\n { label: \"Today's Revenue\", value: revenue.today, growth: revenue.dailyGrowth },\n { label: 'This Week', value: revenue.week, growth: revenue.weeklyGrowth },\n { label: 'This Month', value: revenue.month, growth: revenue.monthlyGrowth },\n { label: 'This Year', value: revenue.year, growth: null as number | null },\n ];\n\n return (\n <PageLayout\n title=\"Analytics Dashboard\"\n description={`Performance insights for ${myProvider.name}`}\n actions={\n <div className=\"flex items-center gap-2\">\n <select\n value={dateRange}\n onChange={(e) => setDateRange(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"year\">This Year</option>\n </select>\n <button\n type=\"button\"\n onClick={() => alert('Export feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-sm text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n </div>\n }\n >\n <PagePurpose className=\"mb-6\">\n The performance story of your cart. Use this page to understand how your business is really\n doing — track revenue over time, see how orders break down, learn which hours are busiest so\n you can staff and stock accordingly, and spot your best-selling items. All figures are drawn\n from your live orders and reviews.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-owner-analytics\"\n className=\"mb-6\"\n steps={[\n {\n id: 'inventory',\n label: 'Restock your best-sellers',\n description: 'Make sure popular items never run out.',\n onClick: () => navigateTo('/cart-owner/inventory'),\n },\n {\n id: 'orders',\n label: 'Work through live orders',\n description: 'Keep prep and delivery times sharp.',\n onClick: () => navigateTo('/cart-owner/orders'),\n },\n {\n id: 'staff',\n label: 'Plan staff for peak hours',\n description: 'Cover the busiest times you see here.',\n onClick: () => navigateTo('/cart-owner/staff'),\n },\n ]}\n />\n\n <div className=\"space-y-6\">\n {/* Revenue Overview — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Revenue Overview</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n {revenueCards.map((card) => (\n <div\n key={card.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 <IndianRupee className=\"h-5 w-5 text-text-secondary\" />\n </div>\n {card.growth !== null && (\n <div\n className={cn(\n 'flex items-center gap-1 text-xs font-medium',\n card.growth >= 0 ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {card.growth >= 0 ? (\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n ) : (\n <ArrowDownRight className=\"h-3.5 w-3.5\" />\n )}\n {formatPct(card.growth)}\n </div>\n )}\n </div>\n <p className=\"mt-3 text-2xl font-bold text-text-primary\">\n {formatCurrency(card.value, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"mt-1 text-sm text-text-secondary\">{card.label}</p>\n </div>\n ))}\n </div>\n </EmphasisPanel>\n\n {/* Order Statistics + Popular Times */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">{orderStats.total}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Avg. Order Value</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(orderStats.avgOrderValue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {orderStats.completed}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Cancelled</p>\n <p className=\"text-xl font-bold text-status-error-text\">{orderStats.cancelled}</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Popular Times */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Popular Times\n </h2>\n </div>\n <div className=\"p-5 space-y-2\">\n {popularTimes.length === 0 ? (\n <p className=\"text-sm text-text-secondary py-4 text-center\">\n No order activity yet. Busy hours will appear here once orders come in.\n </p>\n ) : (\n popularTimes.map((t) => {\n const pct = (t.orders / maxPopularTime) * 100;\n return (\n <div key={t.hour}>\n <div className=\"flex items-center justify-between text-xs mb-0.5\">\n <span className=\"text-text-primary w-14\">{`${t.hour}:00`}</span>\n <span className=\"text-text-secondary\">{t.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n\n {/* Performance Metrics */}\n <section>\n <h2 className=\"text-base font-semibold text-text-primary mb-3\">Performance Metrics</h2>\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-4\">\n {[\n {\n label: 'Acceptance Rate',\n value: `${orderStats.acceptanceRate}%`,\n icon: Target,\n color: 'text-status-success-text',\n },\n {\n label: 'Cancellation Rate',\n value: `${orderStats.cancellationRate}%`,\n icon: Percent,\n color: 'text-status-error-text',\n },\n {\n label: 'Completion Rate',\n value: `${orderStats.completionRate}%`,\n icon: TrendingUp,\n color: 'text-text-primary',\n },\n {\n label: 'Average Rating',\n value: myProvider.rating.toFixed(1),\n icon: Star,\n color: 'text-status-warning-text',\n },\n ].map((metric) => {\n const Icon = metric.icon;\n return (\n <div\n key={metric.label}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\"\n >\n <div className=\"flex items-center gap-2 mb-2\">\n <Icon className={cn('h-5 w-5', metric.color)} />\n <span className=\"text-xs text-text-secondary\">{metric.label}</span>\n </div>\n <p className={cn('text-2xl font-bold', metric.color)}>{metric.value}</p>\n </div>\n );\n })}\n </div>\n </section>\n\n {/* Top Selling + Category Performance */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Top Selling Offerings */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Top Selling Offerings\n </h2>\n </div>\n {topSelling.length === 0 ? (\n <p className=\"text-sm text-text-secondary p-5\">\n No sales yet. Your best-selling items will appear here.\n </p>\n ) : (\n <>\n <div className=\"divide-y divide-border\">\n {topSelling.map((item, i) => (\n <div key={item.name} className=\"flex items-center justify-between px-5 py-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-bg-sunken text-xs font-medium text-text-secondary\">\n {i + 1}\n </span>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {item.category} | {item.quantity} sold\n </p>\n </div>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n {leastSelling.length > 0 && (\n <div className=\"border-t border-border-subtle px-5 py-3\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Least Selling</p>\n {leastSelling.map((item) => (\n <div key={item.name} className=\"flex items-center justify-between py-1.5\">\n <span className=\"text-xs text-text-secondary\">{item.name}</span>\n <span className=\"text-xs text-text-secondary\">\n {item.quantity} sold |{' '}\n {formatCurrency(item.revenue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n\n {/* Category Performance */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Category Performance\n </h2>\n </div>\n <div className=\"p-5 space-y-4\">\n {categories.length === 0 ? (\n <p className=\"text-sm text-text-secondary py-4 text-center\">\n No category data yet.\n </p>\n ) : (\n categories.map((cat) => {\n const pct = (cat.revenue / maxCategoryRevenue) * 100;\n return (\n <div key={cat.category}>\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-text-primary\">{cat.category}</span>\n <span className=\"text-text-secondary\">\n {formatCurrency(cat.revenue, { minimumFractionDigits: 0 })} ({cat.units}{' '}\n sold)\n </span>\n </div>\n <div className=\"h-2.5 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n </div>\n\n {/* Reviews & Ratings + Peak Hours/Days */}\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Reviews & Ratings */}\n <div className=\"lg:col-span-2 rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n Reviews & Ratings\n </h2>\n </div>\n <div className=\"p-5\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-4 mb-5\">\n <div>\n <p className=\"text-xs text-text-secondary\">Total Reviews</p>\n <p className=\"text-xl font-bold text-text-primary\">{reviewSummary.count}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Average Rating</p>\n <p className=\"text-xl font-bold text-status-warning-text flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n {reviewSummary.count > 0 ? reviewSummary.average.toFixed(1) : '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Positive (4★+)</p>\n <p className=\"text-xl font-bold text-status-success-text\">\n {reviewSummary.positive}\n </p>\n </div>\n </div>\n\n {reviewSummary.count === 0 ? (\n <p className=\"text-sm text-text-secondary py-4 text-center\">\n No reviews yet. Customer reviews will appear here once you start fulfilling orders.\n </p>\n ) : (\n <>\n {/* Rating distribution */}\n <div className=\"space-y-1.5 mb-5\">\n {reviewSummary.distribution.map((d) => (\n <div key={d.star} className=\"flex items-center gap-2 text-xs\">\n <span className=\"w-8 text-text-secondary flex items-center gap-0.5\">\n {d.star}\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n </span>\n <div className=\"flex-1 h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${(d.count / maxDistribution) * 100}%` }}\n />\n </div>\n <span className=\"w-6 text-right text-text-secondary\">{d.count}</span>\n </div>\n ))}\n </div>\n\n {/* Recent reviews */}\n <p className=\"text-sm font-medium text-text-primary mb-2\">Recent Reviews</p>\n <div className=\"space-y-3\">\n {reviewSummary.recent.map((r) => (\n <div\n key={r.id}\n className=\"rounded-md border border-border-subtle p-3 text-sm\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"flex items-center gap-0.5 text-status-warning-text text-xs font-medium\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {r.rating.toFixed(1)}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {new Date(r.createdAt).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n year: 'numeric',\n })}\n </span>\n </div>\n {r.review && <p className=\"text-xs text-text-secondary\">{r.review}</p>}\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Peak Hours & Days */}\n <div className=\"space-y-6\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n Peak Hours\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {peakHours.length === 0 ? (\n <p className=\"text-sm text-text-secondary py-2 text-center\">No data yet.</p>\n ) : (\n peakHours.map((h) => {\n const pct = (h.orders / maxPeakHourOrders) * 100;\n return (\n <div key={h.hour}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{`${h.hour}:00`}</span>\n <span className=\"text-text-secondary\">{h.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <CalendarDays className=\"h-4 w-4 text-text-secondary\" />\n Peak Days\n </h2>\n </div>\n <div className=\"p-5 space-y-3\">\n {peakDays.length === 0 ? (\n <p className=\"text-sm text-text-secondary py-2 text-center\">No data yet.</p>\n ) : (\n peakDays.map((d) => {\n const pct = (d.orders / maxPeakDayOrders) * 100;\n return (\n <div key={d.day}>\n <div className=\"flex items-center justify-between text-xs mb-1\">\n <span className=\"text-text-primary\">{d.day}</span>\n <span className=\"text-text-secondary\">{d.orders} orders</span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[var(--color-accent-soft)]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n\n {/* Reviews satisfaction footnote */}\n {reviewSummary.count > 0 && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center gap-1.5 text-sm\">\n <ThumbsUp className=\"h-4 w-4 text-status-success-text\" />\n <span className=\"text-text-secondary\">\n {reviewSummary.positive}/{reviewSummary.count} positive reviews\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Daily Order Trends (last 14 days, real) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm\">\n <div className=\"border-b border-border-subtle px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary flex items-center gap-2\">\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n Daily Order Trends\n </h2>\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-2.5 text-left font-medium text-text-secondary\">Date</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">Orders</th>\n <th className=\"px-5 py-2.5 text-right font-medium text-text-secondary\">Revenue</th>\n </tr>\n </thead>\n <tbody>\n {orderTrends.map((day) => (\n <tr key={day.date} className=\"border-b border-border-subtle last:border-0\">\n <td className=\"px-5 py-2.5 text-text-primary\">\n {new Date(day.date).toLocaleDateString('en-IN', {\n day: '2-digit',\n month: 'short',\n })}\n </td>\n <td className=\"px-5 py-2.5 text-right text-text-primary\">{day.orders}</td>\n <td className=\"px-5 py-2.5 text-right font-medium text-text-primary\">\n {formatCurrency(day.revenue, { minimumFractionDigits: 0 })}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|