@burdenoff/microfe-kadaikodi 2026.626.2 → 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.
Files changed (96) hide show
  1. package/dist/kadaikodi/hooks/useKadaikodiApi.js +260 -105
  2. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  3. package/dist/kadaikodi/pages/HomePage.js +4 -4
  4. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +341 -461
  6. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminDashboard.js +115 -399
  8. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +140 -283
  10. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +282 -453
  12. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminProfilePage.js +115 -242
  14. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  15. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +2 -2
  16. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  17. package/dist/kadaikodi/pages/admin/CartManagementPage.js +279 -333
  18. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  19. package/dist/kadaikodi/pages/admin/UserManagementPage.js +299 -372
  20. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  21. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +503 -627
  22. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  23. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +339 -282
  24. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  25. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +329 -432
  26. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  27. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +374 -384
  28. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +249 -208
  30. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +276 -279
  32. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  33. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +229 -447
  34. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +171 -627
  36. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/HelpSupportPage.js +331 -415
  38. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/kadaikodi/pages/common/NotificationCenterPage.js +18 -670
  40. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  41. package/dist/kadaikodi/pages/common/SettingsPage.js +34 -46
  42. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  43. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +193 -447
  44. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  45. package/dist/kadaikodi/pages/customer/CartDetailPage.js +6 -6
  46. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  47. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
  48. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  49. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -2
  50. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  51. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +191 -369
  52. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  53. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +233 -389
  54. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  55. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +255 -215
  56. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  57. package/dist/kadaikodi/pages/customer/FavoritesPage.js +141 -178
  58. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  59. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  60. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +155 -161
  61. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +76 -118
  63. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/customer/ReviewsPage.js +14 -140
  65. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +135 -213
  67. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +272 -774
  69. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  70. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +258 -523
  71. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +112 -600
  73. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  74. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +128 -295
  75. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  76. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +205 -291
  77. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  78. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +159 -500
  79. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  80. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +426 -514
  81. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  82. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +231 -225
  83. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  84. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +197 -301
  85. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  86. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +247 -399
  87. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  88. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +294 -327
  89. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  90. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +179 -397
  91. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/kadaikodi/mocks/data.js +0 -1517
  94. package/dist/kadaikodi/mocks/data.js.map +0 -1
  95. package/dist/kadaikodi/mocks/users.js +0 -34
  96. package/dist/kadaikodi/mocks/users.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CustomerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/CustomerDashboard.tsx"],"sourcesContent":["/**\n * Customer Dashboard Page\n * @module kadaikodi/pages/customer\n *\n * Welcome dashboard with time-of-day greeting, AI insights panel,\n * stats grid, recent orders with per-item display, recommended carts,\n * quick links sidebar, current location card, and special offers.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Heart,\n Star,\n CreditCard,\n ArrowRight,\n Search,\n Clock,\n MapPin,\n Package,\n User,\n Navigation,\n Lightbulb,\n TrendingUp,\n Zap,\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 { useOrders, useProviders, useDashboardStats } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ninterface RecommendedCart {\n id: string;\n name: string;\n category: string;\n rating: number;\n distance: number;\n estimatedTime: number;\n image: string;\n isOpen: boolean;\n}\n\ninterface CustomerStats {\n totalOrders: number;\n totalSpent: number;\n favoriteCount: number;\n avgRating: number;\n}\n\ninterface AIInsight {\n id: string;\n type: 'suggestion' | 'opportunity' | 'trend';\n title: string;\n description: string;\n confidence: number;\n action: string;\n}\n\nfunction getTimeOfDayGreeting(): 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\nexport function CustomerDashboard() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { t: translate } = useI18n();\n\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n const { data: statsData, isLoading: isLoadingStats } = useDashboardStats();\n\n const isLoading = isLoadingOrders || isLoadingProviders || isLoadingStats;\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Customer';\n\n const aiInsights: AIInsight[] = [\n {\n id: '1',\n type: 'suggestion',\n title: 'New Cart Nearby',\n description:\n 'Healthy Bowls cart just opened 0.2km from your location. They specialize in acai bowls and smoothies.',\n confidence: 92,\n action: 'Explore Cart',\n },\n {\n id: '2',\n type: 'opportunity',\n title: 'Special Offer Available',\n description:\n 'Your favorite Dosa Express is offering 20% off on orders above ₹300. Valid until tonight.',\n confidence: 95,\n action: 'Order Now',\n },\n {\n id: '3',\n type: 'trend',\n title: 'Peak Hours Alert',\n description:\n 'Order now to avoid lunch rush. Delivery times typically increase by 15-20 minutes after 12 PM.',\n confidence: 88,\n action: 'View Carts',\n },\n ];\n\n const recentOrders = orders.slice(0, 3);\n const recommendedCarts = providers.slice(0, 3);\n\n const stats: CustomerStats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, order) => acc + order.total, 0),\n favoriteCount: 6, // Still mock as we don't have favorite hooks yet\n avgRating: 4.5, // Still mock\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'delivered':\n return 'bg-status-success-bg-subtle text-status-success-text';\n case 'preparing':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'out_for_delivery':\n return 'bg-[var(--color-accent-soft)] text-text-primary';\n case 'confirmed':\n return 'bg-[var(--color-accent-soft)] text-text-primary';\n case 'cancelled':\n return 'bg-status-error-bg-subtle text-status-error-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n };\n\n const getInsightIcon = (type: string) => {\n switch (type) {\n case 'suggestion':\n return <Lightbulb className=\"h-4 w-4\" />;\n case 'opportunity':\n return <TrendingUp className=\"h-4 w-4\" />;\n case 'trend':\n return <Zap className=\"h-4 w-4\" />;\n default:\n return <Lightbulb className=\"h-4 w-4\" />;\n }\n };\n\n const getInsightColor = (type: string) => {\n switch (type) {\n case 'suggestion':\n return 'bg-[var(--color-accent-soft)] text-text-primary border-border-focus/20';\n case 'opportunity':\n return 'bg-status-success-bg-subtle text-status-success-text border-status-success-text/20';\n case 'trend':\n return 'bg-status-warning-bg-subtle text-status-warning-text border-status-warning-text/20';\n default:\n return 'bg-bg-sunken text-text-secondary border-border-subtle';\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title={t('kadaikodi.customerDashboard.title', 'Dashboard')}>\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n <p className=\"text-sm text-text-secondary\">\n {t('kadaikodi.customerDashboard.loading', 'Loading your dashboard...')}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t('kadaikodi.customerDashboard.welcomeBack', 'Welcome Back!')}\n description={`${getTimeOfDayGreeting()}, ${firstName}`}\n >\n <PagePurpose className=\"mb-6\">\n Your home base on Kadaikodi — discover mobile food carts near you, reorder favourites in\n a tap, and keep an eye on your orders and spending. Start by exploring nearby carts or\n revisiting a recent order below.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-customer-dashboard\"\n className=\"mb-6\"\n steps={[\n {\n id: 'discover',\n label: 'Discover carts near you',\n description: 'Browse open mobile carts in your area and view their menus.',\n onClick: () => navigateTo('/customer/carts'),\n },\n {\n id: 'address',\n label: 'Set your delivery address',\n description: 'Save your home or work address for faster checkout.',\n onClick: () => navigateTo('/customer/addresses'),\n },\n {\n id: 'payment',\n label: 'Add a payment method',\n description: 'Securely store a card or UPI so ordering is one tap.',\n onClick: () => navigateTo('/customer/payment-methods'),\n },\n ]}\n />\n\n {/* Stats Overview — the one emphasis zone for this dashboard */}\n {stats && (\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.yourActivity', 'Your Activity')}\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Package className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalOrders}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.totalOrders', 'Total Orders')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Heart className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.favoriteCount}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.favoriteCarts', 'Favorite Carts')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Star className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.avgRating.toFixed(1)}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.avgRatingGiven', 'Avg Rating Given')}\n </p>\n </div>\n </div>\n </div>\n </div>\n </EmphasisPanel>\n )}\n\n <div className=\"mt-8 grid grid-cols-1 gap-8 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2 space-y-8\">\n {/* Quick Actions */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.customerDashboard.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)]\">\n <Search className=\"h-5 w-5 text-text-primary\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.discoverCarts', 'Discover Carts')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.findNearbyCarts', 'Find nearby carts')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-success-bg-subtle\">\n <Clock className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.orderHistory', 'Order History')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.viewPastOrders', 'View past orders')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/favorites')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-error-bg-subtle\">\n <Heart className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.favorites', 'Favorites')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.savedCarts', 'Saved carts')}\n </p>\n </div>\n </button>\n </div>\n </section>\n\n {/* Recent Orders */}\n <section>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n {t('kadaikodi.common.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {recentOrders.length > 0 ? (\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\"\n >\n <div className=\"flex flex-col sm:flex-row sm:items-start sm: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 <h3 className=\"text-sm font-semibold text-text-primary\">\n {order.cartName}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mb-2 leading-relaxed\">\n {order.items.map((item) => `${item.name} (${item.quantity})`).join(', ')}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span>{new Date(order.orderDate).toLocaleDateString()}</span>\n {order.rating && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {order.rating}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/orders/${order.id}`)}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('kadaikodi.customerDashboard.viewDetails', 'View Details')}\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title={t('kadaikodi.customerDashboard.noRecentOrders', 'No recent orders')}\n description={t(\n 'kadaikodi.customerDashboard.noRecentOrdersDesc',\n 'Your orders will show up here once you place one. Discover a cart to get started.'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n {t('kadaikodi.customerDashboard.discoverCarts', 'Discover Carts')}\n </button>\n }\n />\n )}\n </section>\n\n {/* Recommended Carts */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.customerDashboard.recommendedForYou', 'Recommended for You')}\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {recommendedCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow\"\n >\n <div className=\"relative h-40\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 right-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-error-bg-subtle text-status-error-text'\n )}\n >\n {cart.isOpen\n ? t('kadaikodi.customerDashboard.open', 'Open')\n : t('kadaikodi.customerDashboard.closed', 'Closed')}\n </span>\n </div>\n </div>\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{cart.name}</h3>\n <p className=\"text-xs text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-1 text-xs\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"font-medium text-text-primary\">{cart.rating}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.distance}km away\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {cart.estimatedTime} mins\n </span>\n </div>\n <button\n type=\"button\"\n disabled={!cart.isOpen}\n onClick={() => cart.isOpen && navigateTo(`/customer/carts/${cart.id}`)}\n className={cn(\n 'w-full rounded-lg py-2 text-sm font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen\n ? t('kadaikodi.customerDashboard.viewMenu', 'View Menu')\n : t('kadaikodi.customerDashboard.currentlyClosed', 'Currently Closed')}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* AI Insights Panel */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">\n {t(\n 'kadaikodi.customerDashboard.personalizedRecommendations',\n 'Personalized Recommendations'\n )}\n </h3>\n <div className=\"space-y-3\">\n {aiInsights.map((insight) => (\n <div\n key={insight.id}\n className={cn('rounded-lg border p-3', getInsightColor(insight.type))}\n >\n <div className=\"flex items-start gap-2\">\n <div className=\"mt-0.5 shrink-0\">{getInsightIcon(insight.type)}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs font-semibold\">{insight.title}</p>\n <span className=\"text-[10px] opacity-70\">{insight.confidence}%</span>\n </div>\n <p className=\"mt-1 text-xs opacity-80 leading-relaxed\">\n {insight.description}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"mt-2 text-[10px] font-semibold underline underline-offset-2\"\n >\n {insight.action}\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Quick Links */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('kadaikodi.customerDashboard.quickLinks', 'Quick Links')}\n </h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <User className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.profileSettings', 'Profile Settings')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.savedAddresses', 'Saved Addresses')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/payment-methods')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.paymentMethods', 'Payment Methods')}\n </button>\n </div>\n </div>\n\n {/* Current Location */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('kadaikodi.customerDashboard.currentLocation', 'Current Location')}\n </h3>\n <div className=\"flex items-start gap-3\">\n <Navigation className=\"h-4 w-4 text-text-primary mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">Koramangala</p>\n <p className=\"text-xs text-text-secondary\">80 Feet Road, 6th Block</p>\n <p className=\"text-xs text-text-secondary\">Bangalore, Karnataka</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-3 w-full rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('kadaikodi.customerDashboard.updateLocation', 'Update Location')}\n </button>\n </div>\n\n {/* Special Offers */}\n <div className=\"rounded-lg bg-gradient-to-r from-action-primary-bg/10 to-accent-purple/10 border border-border-focus/20 p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-2\">\n {t('kadaikodi.customerDashboard.specialOffers', 'Special Offers')}\n </h3>\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n {t(\n 'kadaikodi.customerDashboard.specialOffersDescription',\n 'Get 25% off on your next order from featured carts'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"w-full rounded-lg bg-foreground px-3 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n {t('kadaikodi.customerDashboard.viewOffers', 'View Offers')}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CustomerDashboard.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/CustomerDashboard.tsx"],"sourcesContent":["/**\n * Customer Dashboard Page\n * @module kadaikodi/pages/customer\n *\n * Welcome dashboard with time-of-day greeting, AI insights panel,\n * stats grid, recent orders with per-item display, recommended carts,\n * quick links sidebar, current location card, and special offers.\n */\n\nimport { useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Heart,\n Star,\n CreditCard,\n ArrowRight,\n Search,\n Clock,\n MapPin,\n Package,\n User,\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 { useOrders, useProviders } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ninterface CustomerStats {\n totalOrders: number;\n totalSpent: number;\n}\n\nfunction getTimeOfDayGreeting(): 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\nexport function CustomerDashboard() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { t: translate } = useI18n();\n\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n\n const isLoading = isLoadingOrders || isLoadingProviders;\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Customer';\n\n const recentOrders = orders.slice(0, 3);\n const recommendedCarts = providers.slice(0, 3);\n\n const stats: CustomerStats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, order) => acc + order.total, 0),\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'delivered':\n return 'bg-status-success-bg-subtle text-status-success-text';\n case 'preparing':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'out_for_delivery':\n return 'bg-[var(--color-accent-soft)] text-text-primary';\n case 'confirmed':\n return 'bg-[var(--color-accent-soft)] text-text-primary';\n case 'cancelled':\n return 'bg-status-error-bg-subtle text-status-error-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title={t('kadaikodi.customerDashboard.title', 'Dashboard')}>\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n <p className=\"text-sm text-text-secondary\">\n {t('kadaikodi.customerDashboard.loading', 'Loading your dashboard...')}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t('kadaikodi.customerDashboard.welcomeBack', 'Welcome Back!')}\n description={`${getTimeOfDayGreeting()}, ${firstName}`}\n >\n <PagePurpose className=\"mb-6\">\n Your home base on Kadaikodi — discover mobile food carts near you, reorder favourites in a\n tap, and keep an eye on your orders and spending. Start by exploring nearby carts or\n revisiting a recent order below.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-customer-dashboard\"\n className=\"mb-6\"\n steps={[\n {\n id: 'discover',\n label: 'Discover carts near you',\n description: 'Browse open mobile carts in your area and view their menus.',\n onClick: () => navigateTo('/customer/carts'),\n },\n {\n id: 'address',\n label: 'Set your delivery address',\n description: 'Save your home or work address for faster checkout.',\n onClick: () => navigateTo('/customer/addresses'),\n },\n {\n id: 'payment',\n label: 'Add a payment method',\n description: 'Securely store a card or UPI so ordering is one tap.',\n onClick: () => navigateTo('/customer/payment-methods'),\n },\n ]}\n />\n\n {/* Stats Overview — the one emphasis zone for this dashboard */}\n {stats && (\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.yourActivity', 'Your Activity')}\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Package className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalOrders}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.totalOrders', 'Total Orders')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </div>\n </div>\n </EmphasisPanel>\n )}\n\n <div className=\"mt-8 grid grid-cols-1 gap-8 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2 space-y-8\">\n {/* Quick Actions */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.customerDashboard.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-[var(--color-accent-soft)]\">\n <Search className=\"h-5 w-5 text-text-primary\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.discoverCarts', 'Discover Carts')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.findNearbyCarts', 'Find nearby carts')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-success-bg-subtle\">\n <Clock className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.orderHistory', 'Order History')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.viewPastOrders', 'View past orders')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/favorites')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-error-bg-subtle\">\n <Heart className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.favorites', 'Favorites')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('kadaikodi.customerDashboard.savedCarts', 'Saved carts')}\n </p>\n </div>\n </button>\n </div>\n </section>\n\n {/* Recent Orders */}\n <section>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('kadaikodi.customerDashboard.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n {t('kadaikodi.common.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {recentOrders.length > 0 ? (\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\"\n >\n <div className=\"flex flex-col sm:flex-row sm:items-start sm: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 <h3 className=\"text-sm font-semibold text-text-primary\">\n {order.cartName}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mb-2 leading-relaxed\">\n {order.items.map((item) => `${item.name} (${item.quantity})`).join(', ')}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span>{new Date(order.orderDate).toLocaleDateString()}</span>\n {order.rating && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {order.rating}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/orders/${order.id}`)}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('kadaikodi.customerDashboard.viewDetails', 'View Details')}\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title={t('kadaikodi.customerDashboard.noRecentOrders', 'No recent orders')}\n description={t(\n 'kadaikodi.customerDashboard.noRecentOrdersDesc',\n 'Your orders will show up here once you place one. Discover a cart to get started.'\n )}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n {t('kadaikodi.customerDashboard.discoverCarts', 'Discover Carts')}\n </button>\n }\n />\n )}\n </section>\n\n {/* Recommended Carts */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.customerDashboard.recommendedForYou', 'Recommended for You')}\n </h2>\n {recommendedCarts.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {recommendedCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow\"\n >\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{cart.name}</h3>\n <p className=\"text-xs text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-error-bg-subtle text-status-error-text'\n )}\n >\n {cart.isOpen\n ? t('kadaikodi.customerDashboard.open', 'Open')\n : t('kadaikodi.customerDashboard.closed', 'Closed')}\n </span>\n </div>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.totalRatings > 0 && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"font-medium text-text-primary\">\n {cart.rating.toFixed(1)}\n </span>\n <span>({cart.totalRatings})</span>\n </span>\n )}\n {cart.location.address && (\n <span className=\"flex items-center gap-1 truncate\">\n <MapPin className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{cart.location.address}</span>\n </span>\n )}\n </div>\n <button\n type=\"button\"\n disabled={!cart.isOpen}\n onClick={() => cart.isOpen && navigateTo(`/customer/carts/${cart.id}`)}\n className={cn(\n 'w-full rounded-lg py-2 text-sm font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen\n ? t('kadaikodi.customerDashboard.viewMenu', 'View Menu')\n : t('kadaikodi.customerDashboard.currentlyClosed', 'Currently Closed')}\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title={t('kadaikodi.customerDashboard.noCarts', 'No carts available yet')}\n description={t(\n 'kadaikodi.customerDashboard.noCartsDesc',\n 'Carts will appear here as vendors join the platform. Check back soon.'\n )}\n />\n )}\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Quick Links */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('kadaikodi.customerDashboard.quickLinks', 'Quick Links')}\n </h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <User className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.profileSettings', 'Profile Settings')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.savedAddresses', 'Saved Addresses')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/payment-methods')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n {t('kadaikodi.customerDashboard.paymentMethods', 'Payment Methods')}\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}