@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.626.1

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 (104) hide show
  1. package/dist/subscriberbot/components/EmptyState.js +17 -10
  2. package/dist/subscriberbot/components/EmptyState.js.map +1 -1
  3. package/dist/subscriberbot/components/InvestmentCard.js +23 -22
  4. package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
  5. package/dist/subscriberbot/components/MetricsCard.js +15 -12
  6. package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
  7. package/dist/subscriberbot/components/PageLayout.js +27 -15
  8. package/dist/subscriberbot/components/PageLayout.js.map +1 -1
  9. package/dist/subscriberbot/components/RatingDisplay.js +3 -3
  10. package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
  11. package/dist/subscriberbot/components/StatusBadge.js +25 -13
  12. package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
  13. package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
  14. package/dist/subscriberbot/pages/HomePage.js +72 -63
  15. package/dist/subscriberbot/pages/HomePage.js.map +1 -1
  16. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +106 -100
  17. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
  18. package/dist/subscriberbot/pages/admin/AdminDashboard.js +125 -85
  19. package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
  20. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +51 -45
  21. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
  22. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +246 -241
  23. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
  24. package/dist/subscriberbot/pages/admin/AdminProfilePage.js +131 -129
  25. package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
  26. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +247 -242
  27. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
  28. package/dist/subscriberbot/pages/admin/CartManagementPage.js +307 -302
  29. package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
  30. package/dist/subscriberbot/pages/admin/UserManagementPage.js +308 -303
  31. package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
  32. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +89 -84
  33. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  34. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +269 -264
  35. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  36. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +269 -227
  37. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  38. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +191 -186
  39. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  40. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +168 -166
  41. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  42. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +344 -347
  43. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  44. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +270 -272
  45. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
  46. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +294 -289
  47. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
  48. package/dist/subscriberbot/pages/common/HelpSupportPage.js +156 -158
  49. package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
  50. package/dist/subscriberbot/pages/common/NotificationCenterPage.js +94 -87
  51. package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
  52. package/dist/subscriberbot/pages/common/SettingsPage.js +749 -740
  53. package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
  54. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +357 -324
  55. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
  56. package/dist/subscriberbot/pages/customer/CartDetailPage.js +281 -247
  57. package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
  58. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +106 -98
  59. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
  60. package/dist/subscriberbot/pages/customer/CheckoutPage.js +235 -238
  61. package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
  62. package/dist/subscriberbot/pages/customer/CustomerDashboard.js +426 -390
  63. package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
  64. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +488 -479
  65. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
  66. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +522 -512
  67. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
  68. package/dist/subscriberbot/pages/customer/FavoritesPage.js +73 -66
  69. package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
  70. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +75 -67
  71. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
  72. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +82 -76
  73. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
  74. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +100 -93
  75. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
  76. package/dist/subscriberbot/pages/customer/ReviewsPage.js +97 -90
  77. package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
  78. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +86 -79
  79. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
  80. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +330 -293
  81. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
  82. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +269 -261
  83. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  84. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +97 -91
  85. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  86. package/dist/subscriberbot/pages/investor/InvestorDashboard.js +354 -322
  87. package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
  88. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +118 -111
  89. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  90. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +75 -69
  91. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
  92. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +435 -430
  93. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
  94. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +328 -289
  95. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
  96. package/dist/subscriberbot/pages/worker/WorkerDashboard.js +135 -103
  97. package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
  98. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +120 -114
  99. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
  100. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +125 -120
  101. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
  102. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +354 -344
  103. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
  104. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"OrderManagementPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/cart-owner/OrderManagementPage.tsx"],"sourcesContent":["/**\n * Order Management Page\n *\n * Stats overview, status-filtered order list with search/date/sort/fulfillment filters,\n * order detail modal, accept/reject/ready/complete actions, priority highlighting.\n *\n * @module subscriberbot/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Search,\n Clock,\n CheckCircle2,\n XCircle,\n ChefHat,\n PackageCheck,\n Phone,\n MapPin,\n User,\n RefreshCw,\n Truck,\n ShoppingBag,\n X,\n AlertCircle,\n Filter,\n ChevronDown,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { mockOrders } from '../../mocks/data';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\nimport type { MockOrder, OrderStatus } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\ninterface OrderFilters {\n status: string;\n dateRange: string;\n searchQuery: string;\n sortBy: string;\n fulfillmentType: string;\n}\n\n/** Extended order type with cart-owner specific fields */\ninterface ExtendedOrder extends MockOrder {\n customerName?: string;\n customerPhone?: string;\n fulfillmentType?: 'delivery' | 'pickup' | 'cart_dispatch';\n specialInstructions?: string;\n}\n\n// ============================================================================\n// Extended Mock Orders\n// ============================================================================\n\nconst extendedOrders: ExtendedOrder[] = [\n ...mockOrders,\n {\n id: 'ORD-010',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [\n { id: 'food-1', name: 'Masala Dosa', quantity: 3, price: 120 },\n { id: 'food-2', name: 'Filter Coffee', quantity: 3, price: 60 },\n ],\n subtotal: 540,\n taxes: 54,\n deliveryFee: 30,\n total: 624,\n status: 'pending' as OrderStatus,\n orderDate: '2024-01-16T17:30:00Z',\n estimatedDeliveryTime: '2024-01-16T18:00:00Z',\n deliveryAddress: {\n street: '42 Lake Road',\n area: 'Ulsoor',\n city: 'Bangalore',\n pincode: '560008',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T17:30:00Z', description: 'Order placed' },\n ],\n assignedWorker: { id: 'worker-1', name: 'Ravi Kumar', phone: '+91-9876543210', rating: 4.8 },\n customerName: 'Priya Sharma',\n customerPhone: '+91-9876543220',\n fulfillmentType: 'delivery' as const,\n specialInstructions: 'Extra sambar please',\n },\n {\n id: 'ORD-011',\n cartId: 'FOOD-002',\n cartName: 'Chaat Corner',\n cartImage: '',\n items: [\n { id: 'food-3', name: 'Pani Puri', quantity: 2, price: 80 },\n { id: 'food-4', name: 'Bhel Puri', quantity: 1, price: 70 },\n ],\n subtotal: 230,\n taxes: 23,\n deliveryFee: 0,\n total: 253,\n status: 'confirmed' as OrderStatus,\n orderDate: '2024-01-16T16:00:00Z',\n deliveryAddress: {\n street: '88 MG Road',\n area: 'MG Road',\n city: 'Bangalore',\n pincode: '560001',\n },\n paymentMethod: 'Cash',\n paymentStatus: 'pending' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T15:50:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T16:00:00Z', description: 'Order confirmed' },\n ],\n customerName: 'Amit Patel',\n customerPhone: '+91-9876543221',\n fulfillmentType: 'pickup' as const,\n },\n {\n id: 'ORD-012',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [{ id: 'food-5', name: 'Rava Dosa', quantity: 2, price: 100 }],\n subtotal: 200,\n taxes: 20,\n deliveryFee: 30,\n total: 250,\n status: 'preparing' as OrderStatus,\n orderDate: '2024-01-16T15:00:00Z',\n deliveryAddress: {\n street: '15 Church Street',\n area: 'Church Street',\n city: 'Bangalore',\n pincode: '560001',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T14:50:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T14:55:00Z', description: 'Order confirmed' },\n {\n status: 'preparing',\n timestamp: '2024-01-16T15:00:00Z',\n description: 'Preparation started',\n },\n ],\n customerName: 'Deepak Reddy',\n customerPhone: '+91-9876543222',\n fulfillmentType: 'delivery' as const,\n specialInstructions: 'No onions',\n },\n {\n id: 'ORD-013',\n cartId: 'SVC-001',\n cartName: 'Quick Fix Repairs',\n cartImage: '',\n items: [{ id: 'svc-1', name: 'Mobile Screen Repair', quantity: 1, price: 2500 }],\n subtotal: 2500,\n taxes: 250,\n deliveryFee: 0,\n total: 2750,\n status: 'ready' as OrderStatus,\n orderDate: '2024-01-16T12:00:00Z',\n deliveryAddress: {\n street: '22 HSR Layout',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n paymentMethod: 'Card',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T11:00:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T11:10:00Z', description: 'Order confirmed' },\n { status: 'preparing', timestamp: '2024-01-16T11:30:00Z', description: 'Service started' },\n { status: 'ready', timestamp: '2024-01-16T12:00:00Z', description: 'Service completed' },\n ],\n customerName: 'Kiran Nair',\n customerPhone: '+91-9876543223',\n fulfillmentType: 'pickup' as const,\n },\n {\n id: 'ORD-014',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [\n { id: 'food-1', name: 'Masala Dosa', quantity: 1, price: 120 },\n { id: 'food-2', name: 'Filter Coffee', quantity: 2, price: 60 },\n ],\n subtotal: 240,\n taxes: 24,\n deliveryFee: 30,\n total: 294,\n status: 'cancelled' as OrderStatus,\n orderDate: '2024-01-15T18:00:00Z',\n deliveryAddress: {\n street: '5 BTM Layout',\n area: 'BTM Layout',\n city: 'Bangalore',\n pincode: '560076',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'refunded' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-15T17:50:00Z', description: 'Order placed' },\n {\n status: 'cancelled',\n timestamp: '2024-01-15T18:00:00Z',\n description: 'Order cancelled by customer',\n },\n ],\n customerName: 'Sneha Gupta',\n customerPhone: '+91-9876543224',\n fulfillmentType: 'delivery' as const,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<string, { color: string; label: string }> = {\n pending: { color: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400', label: 'New Order' },\n confirmed: { color: 'bg-blue-500/20 text-blue-600 dark:text-blue-400', label: 'Confirmed' },\n preparing: { color: 'bg-orange-500/20 text-orange-600 dark:text-orange-400', label: 'Preparing' },\n ready: { color: 'bg-green-500/20 text-green-600 dark:text-green-400', label: 'Ready' },\n out_for_delivery: {\n color: 'bg-cyan-500/20 text-cyan-600 dark:text-cyan-400',\n label: 'Out for Delivery',\n },\n delivered: { color: 'bg-green-500/20 text-green-600 dark:text-green-400', label: 'Completed' },\n cancelled: { color: 'bg-red-500/20 text-red-600 dark:text-red-400', label: 'Cancelled' },\n};\n\nconst fulfillmentBadge: Record<string, { icon: typeof Truck; label: string; color: string }> = {\n delivery: {\n icon: Truck,\n label: 'Delivery',\n color: 'bg-purple-500/20 text-purple-600 dark:text-purple-400',\n },\n pickup: {\n icon: ShoppingBag,\n label: 'Pickup',\n color: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n },\n cart_dispatch: { icon: MapPin, label: 'Cart Dispatch', color: 'bg-bg-sunken text-text-secondary' },\n};\n\nconst formatTimeAgo = (dateString: string) => {\n const date = new Date(dateString);\n const now = new Date();\n const diffMin = Math.floor((now.getTime() - date.getTime()) / (1000 * 60));\n if (diffMin < 1) return 'Just now';\n if (diffMin < 60) return `${diffMin} min ago`;\n if (diffMin < 1440) return `${Math.floor(diffMin / 60)} hours ago`;\n return date.toLocaleDateString('en-IN', { day: '2-digit', month: 'short' });\n};\n\nconst formatTime = (dateString: string) => {\n return new Date(dateString).toLocaleTimeString('en-IN', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n};\n\nconst getPriorityColor = (order: (typeof extendedOrders)[0]) => {\n const ageMin = (new Date().getTime() - new Date(order.orderDate).getTime()) / (1000 * 60);\n if (order.status === 'pending' && ageMin > 10) return 'border-red-500/50 bg-red-500/5';\n if (order.status === 'preparing' && ageMin > 30) return 'border-yellow-500/50 bg-yellow-500/5';\n return 'border-border-subtle';\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const OrderManagementPage = () => {\n const { navigateTo } = useSubscriberBot();\n\n // Data - use inline state so actions can update it\n const [orders, setOrders] = useState(extendedOrders);\n\n // Filters\n const [filters, setFilters] = useState<OrderFilters>({\n status: '',\n dateRange: 'all',\n searchQuery: '',\n sortBy: 'recent',\n fulfillmentType: '',\n });\n\n // Modal\n const [selectedOrder, setSelectedOrder] = useState<(typeof extendedOrders)[0] | null>(null);\n const [showOrderDetails, setShowOrderDetails] = useState(false);\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const stats = useMemo(() => {\n const total = orders.length;\n const pending = orders.filter((o) => o.status === 'pending').length;\n const active = orders.filter((o) =>\n ['confirmed', 'preparing', 'ready', 'out_for_delivery'].includes(o.status)\n ).length;\n const completed = orders.filter((o) => o.status === 'delivered').length;\n const totalRevenue = orders\n .filter((o) => o.status === 'delivered')\n .reduce((s, o) => s + o.total, 0);\n const avgOrder = completed > 0 ? Math.round(totalRevenue / completed) : 0;\n return { total, pending, active, completed, totalRevenue, avgOrder };\n }, [orders]);\n\n // ---- Filtered orders ----\n const filteredOrders = useMemo(() => {\n let result = [...orders];\n\n if (filters.status) {\n result = result.filter((o) => o.status === filters.status);\n }\n if (filters.fulfillmentType) {\n result = result.filter((o) => o.fulfillmentType === filters.fulfillmentType);\n }\n if (filters.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n result = result.filter(\n (o) =>\n o.id.toLowerCase().includes(q) ||\n (o.customerName || '').toLowerCase().includes(q) ||\n o.items.some((item) => item.name.toLowerCase().includes(q))\n );\n }\n if (filters.dateRange !== 'all') {\n const now = new Date();\n const limit = new Date();\n if (filters.dateRange === 'today') limit.setHours(0, 0, 0, 0);\n else if (filters.dateRange === '7days') limit.setDate(now.getDate() - 7);\n else if (filters.dateRange === '30days') limit.setDate(now.getDate() - 30);\n result = result.filter((o) => new Date(o.orderDate) >= limit);\n }\n\n switch (filters.sortBy) {\n case 'recent':\n result.sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime());\n break;\n case 'oldest':\n result.sort((a, b) => new Date(a.orderDate).getTime() - new Date(b.orderDate).getTime());\n break;\n case 'amount_high':\n result.sort((a, b) => b.total - a.total);\n break;\n case 'amount_low':\n result.sort((a, b) => a.total - b.total);\n break;\n }\n\n return result;\n }, [orders, filters]);\n\n // ---- Actions ----\n const handleOrderAction = (\n orderId: string,\n action: 'accept' | 'reject' | 'ready' | 'complete'\n ) => {\n const statusMap: Record<string, OrderStatus> = {\n accept: 'confirmed',\n reject: 'cancelled',\n ready: 'ready',\n complete: 'delivered',\n };\n const messages: Record<string, string> = {\n accept: 'Order accepted',\n reject: 'Order rejected',\n ready: 'Order marked as ready',\n complete: 'Order completed',\n };\n\n setOrders((prev) =>\n prev.map((o) => (o.id === orderId ? { ...o, status: statusMap[action] } : o))\n );\n showStatus(messages[action], 'success');\n if (showOrderDetails && selectedOrder?.id === orderId) {\n setShowOrderDetails(false);\n }\n };\n\n return (\n <PageLayout\n title=\"Order Management\"\n description=\"Manage incoming and active orders\"\n actions={\n <button\n type=\"button\"\n onClick={() => showStatus('Orders refreshed', 'success')}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n Refresh\n </button>\n }\n >\n <div className=\"space-y-4\">\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-green-500/30 bg-green-500/10'\n : 'border-red-500/30 bg-red-500/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Stats Overview */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.total}</p>\n </div>\n <div className=\"rounded-lg border border-yellow-500/30 bg-yellow-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-yellow-600 dark:text-yellow-400\">Pending</p>\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {stats.pending}\n </p>\n </div>\n <div className=\"rounded-lg border border-blue-500/30 bg-blue-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-blue-600 dark:text-blue-400\">Active</p>\n <p className=\"text-2xl font-bold text-blue-600 dark:text-blue-400\">{stats.active}</p>\n </div>\n <div className=\"rounded-lg border border-green-500/30 bg-green-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-green-600 dark:text-green-400\">Completed</p>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {stats.completed}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalRevenue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Avg Order</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.avgOrder, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-3\">\n <div className=\"relative sm:col-span-2 lg:col-span-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search orders...\"\n value={filters.searchQuery}\n onChange={(e) => setFilters((p) => ({ ...p, searchQuery: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={filters.status}\n onChange={(e) => setFilters((p) => ({ ...p, status: 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=\"\">All Orders</option>\n <option value=\"pending\">New Orders</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"delivered\">Completed</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n <select\n value={filters.fulfillmentType}\n onChange={(e) => setFilters((p) => ({ ...p, fulfillmentType: 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=\"\">All Types</option>\n <option value=\"pickup\">Pickup</option>\n <option value=\"delivery\">Delivery</option>\n <option value=\"cart_dispatch\">Cart Dispatch</option>\n </select>\n <select\n value={filters.dateRange}\n onChange={(e) => setFilters((p) => ({ ...p, dateRange: 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=\"7days\">Last 7 Days</option>\n <option value=\"30days\">Last 30 Days</option>\n <option value=\"all\">All Time</option>\n </select>\n <select\n value={filters.sortBy}\n onChange={(e) => setFilters((p) => ({ ...p, sortBy: 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=\"recent\">Most Recent</option>\n <option value=\"oldest\">Oldest First</option>\n <option value=\"amount_high\">Amount: High to Low</option>\n <option value=\"amount_low\">Amount: Low to High</option>\n </select>\n </div>\n </div>\n\n {/* Orders List */}\n {filteredOrders.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 rounded-lg border border-border-subtle bg-bg-surface shadow-sm text-center\">\n <PackageCheck className=\"h-12 w-12 text-text-secondary opacity-40 mb-3\" />\n <h3 className=\"text-lg font-semibold text-text-primary mb-1\">No orders found</h3>\n <p className=\"text-sm text-text-secondary\">\n {filters.searchQuery || filters.status\n ? 'Try adjusting your filters'\n : 'No orders to display'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {filteredOrders.map((order) => {\n const status = statusConfig[order.status] || {\n color: 'bg-bg-sunken text-text-secondary',\n label: order.status,\n };\n const fulfillment =\n fulfillmentBadge[order.fulfillmentType || 'delivery'] || fulfillmentBadge.delivery;\n const FulfillmentIcon = fulfillment.icon;\n\n return (\n <div\n key={order.id}\n className={cn(\n 'rounded-lg border bg-bg-surface shadow-sm transition-shadow hover:shadow-md',\n getPriorityColor(order)\n )}\n >\n <div className=\"p-4 sm:p-5\">\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-3 mb-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm sm:text-base font-semibold text-text-primary\">\n Order #{order.id}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n status.color\n )}\n >\n {status.label}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n fulfillment.color\n )}\n >\n <FulfillmentIcon className=\"h-3 w-3\" />\n {fulfillment.label}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {order.customerName || 'Customer'} | {formatTimeAgo(order.orderDate)}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderDetails(true);\n }}\n className=\"rounded-md border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n View Details\n </button>\n </div>\n </div>\n\n {/* Items */}\n <div className=\"border-t border-border-subtle pt-3 mb-3\">\n <div className=\"flex flex-wrap gap-2\">\n {order.items.map((item, idx) => (\n <span\n key={idx}\n className=\"inline-flex items-center rounded bg-bg-sunken px-2 py-1 text-xs text-text-primary\"\n >\n {item.quantity}x {item.name}\n </span>\n ))}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-2\">\n {order.status === 'pending' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'accept')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-2 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Accept Order\n </button>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'reject')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-red-500/10 px-3 py-2 text-xs font-medium text-red-600 dark:text-red-400 hover:bg-red-500/20 transition-colors\"\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Reject\n </button>\n </>\n )}\n {order.status === 'confirmed' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'ready')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-orange-500/10 px-3 py-2 text-xs font-medium text-orange-600 dark:text-orange-400 hover:bg-orange-500/20 transition-colors\"\n >\n <ChefHat className=\"h-3.5 w-3.5\" />\n Start Preparing\n </button>\n )}\n {order.status === 'preparing' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'ready')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-2 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <PackageCheck className=\"h-3.5 w-3.5\" />\n Mark as Ready\n </button>\n )}\n {order.status === 'ready' && order.fulfillmentType === 'pickup' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'complete')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-2 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete Order\n </button>\n )}\n {['confirmed', 'preparing', 'ready'].includes(order.status) && (\n <button\n type=\"button\"\n onClick={() => alert('Contact feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Contact Customer\n </button>\n )}\n </div>\n\n {/* Special Instructions */}\n {order.specialInstructions && (\n <div className=\"mt-3 rounded-md border border-yellow-500/30 bg-yellow-500/10 p-3\">\n <p className=\"text-xs font-medium text-yellow-600 dark:text-yellow-400\">\n Special Instructions:\n </p>\n <p className=\"text-xs text-yellow-600 dark:text-yellow-400 mt-0.5\">\n {order.specialInstructions}\n </p>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Order Details Modal */}\n {showOrderDetails && selectedOrder && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Order Details</h3>\n <button\n type=\"button\"\n onClick={() => setShowOrderDetails(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {/* Order Meta */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Order ID</p>\n <p className=\"text-sm font-medium text-text-primary\">#{selectedOrder.id}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Status</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium mt-0.5',\n (statusConfig[selectedOrder.status] || statusConfig.pending).color\n )}\n >\n {(statusConfig[selectedOrder.status] || statusConfig.pending).label}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Customer</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {selectedOrder.customerName || 'N/A'}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Order Time</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatTime(selectedOrder.orderDate)}\n </p>\n </div>\n </div>\n\n {/* Items */}\n <div className=\"border-t border-border-subtle pt-4\">\n <h4 className=\"text-sm font-medium text-text-primary mb-3\">Order Items</h4>\n <div className=\"space-y-2\">\n {selectedOrder.items.map((item, idx) => (\n <div key={idx} className=\"flex justify-between items-start\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x{' '}\n {item.quantity}\n </p>\n </div>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Totals */}\n <div className=\"border-t border-border-subtle pt-4 space-y-2\">\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Subtotal</span>\n <span>\n {formatCurrency(selectedOrder.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Delivery Fee</span>\n <span>\n {formatCurrency(selectedOrder.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Tax</span>\n <span>{formatCurrency(selectedOrder.taxes, { minimumFractionDigits: 0 })}</span>\n </div>\n <div className=\"flex justify-between font-semibold text-text-primary pt-2 border-t border-border-subtle\">\n <span>Total</span>\n <span>{formatCurrency(selectedOrder.total, { minimumFractionDigits: 0 })}</span>\n </div>\n </div>\n\n {/* Delivery Address */}\n {selectedOrder.fulfillmentType === 'delivery' && selectedOrder.deliveryAddress && (\n <div className=\"border-t border-border-subtle pt-4\">\n <h4 className=\"text-sm font-medium text-text-primary mb-2 flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Delivery Address\n </h4>\n <p className=\"text-sm text-text-secondary\">\n {selectedOrder.deliveryAddress.street}, {selectedOrder.deliveryAddress.area}\n <br />\n {selectedOrder.deliveryAddress.city} - {selectedOrder.deliveryAddress.pincode}\n </p>\n </div>\n )}\n\n {/* Modal Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowOrderDetails(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n Close\n </button>\n {selectedOrder.status === 'pending' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(selectedOrder.id, 'accept')}\n className=\"flex-1 rounded-md bg-green-500/10 px-4 py-2 text-sm font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n Accept Order\n </button>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(selectedOrder.id, 'reject')}\n className=\"flex-1 rounded-md bg-red-500/10 px-4 py-2 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-500/20 transition-colors\"\n >\n Reject Order\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"OrderManagementPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/cart-owner/OrderManagementPage.tsx"],"sourcesContent":["/**\n * Order Management Page\n *\n * Stats overview, status-filtered order list with search/date/sort/fulfillment filters,\n * order detail modal, accept/reject/ready/complete actions, priority highlighting.\n *\n * @module subscriberbot/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Search,\n Clock,\n CheckCircle2,\n XCircle,\n ChefHat,\n PackageCheck,\n Phone,\n MapPin,\n User,\n RefreshCw,\n Truck,\n ShoppingBag,\n X,\n AlertCircle,\n Filter,\n ChevronDown,\n} from 'lucide-react';\nimport { PagePurpose, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { mockOrders } from '../../mocks/data';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\nimport type { MockOrder, OrderStatus } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\ninterface OrderFilters {\n status: string;\n dateRange: string;\n searchQuery: string;\n sortBy: string;\n fulfillmentType: string;\n}\n\n/** Extended order type with cart-owner specific fields */\ninterface ExtendedOrder extends MockOrder {\n customerName?: string;\n customerPhone?: string;\n fulfillmentType?: 'delivery' | 'pickup' | 'cart_dispatch';\n specialInstructions?: string;\n}\n\n// ============================================================================\n// Extended Mock Orders\n// ============================================================================\n\nconst extendedOrders: ExtendedOrder[] = [\n ...mockOrders,\n {\n id: 'ORD-010',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [\n { id: 'food-1', name: 'Masala Dosa', quantity: 3, price: 120 },\n { id: 'food-2', name: 'Filter Coffee', quantity: 3, price: 60 },\n ],\n subtotal: 540,\n taxes: 54,\n deliveryFee: 30,\n total: 624,\n status: 'pending' as OrderStatus,\n orderDate: '2024-01-16T17:30:00Z',\n estimatedDeliveryTime: '2024-01-16T18:00:00Z',\n deliveryAddress: {\n street: '42 Lake Road',\n area: 'Ulsoor',\n city: 'Bangalore',\n pincode: '560008',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T17:30:00Z', description: 'Order placed' },\n ],\n assignedWorker: { id: 'worker-1', name: 'Ravi Kumar', phone: '+91-9876543210', rating: 4.8 },\n customerName: 'Priya Sharma',\n customerPhone: '+91-9876543220',\n fulfillmentType: 'delivery' as const,\n specialInstructions: 'Extra sambar please',\n },\n {\n id: 'ORD-011',\n cartId: 'FOOD-002',\n cartName: 'Chaat Corner',\n cartImage: '',\n items: [\n { id: 'food-3', name: 'Pani Puri', quantity: 2, price: 80 },\n { id: 'food-4', name: 'Bhel Puri', quantity: 1, price: 70 },\n ],\n subtotal: 230,\n taxes: 23,\n deliveryFee: 0,\n total: 253,\n status: 'confirmed' as OrderStatus,\n orderDate: '2024-01-16T16:00:00Z',\n deliveryAddress: {\n street: '88 MG Road',\n area: 'MG Road',\n city: 'Bangalore',\n pincode: '560001',\n },\n paymentMethod: 'Cash',\n paymentStatus: 'pending' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T15:50:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T16:00:00Z', description: 'Order confirmed' },\n ],\n customerName: 'Amit Patel',\n customerPhone: '+91-9876543221',\n fulfillmentType: 'pickup' as const,\n },\n {\n id: 'ORD-012',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [{ id: 'food-5', name: 'Rava Dosa', quantity: 2, price: 100 }],\n subtotal: 200,\n taxes: 20,\n deliveryFee: 30,\n total: 250,\n status: 'preparing' as OrderStatus,\n orderDate: '2024-01-16T15:00:00Z',\n deliveryAddress: {\n street: '15 Church Street',\n area: 'Church Street',\n city: 'Bangalore',\n pincode: '560001',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T14:50:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T14:55:00Z', description: 'Order confirmed' },\n {\n status: 'preparing',\n timestamp: '2024-01-16T15:00:00Z',\n description: 'Preparation started',\n },\n ],\n customerName: 'Deepak Reddy',\n customerPhone: '+91-9876543222',\n fulfillmentType: 'delivery' as const,\n specialInstructions: 'No onions',\n },\n {\n id: 'ORD-013',\n cartId: 'SVC-001',\n cartName: 'Quick Fix Repairs',\n cartImage: '',\n items: [{ id: 'svc-1', name: 'Mobile Screen Repair', quantity: 1, price: 2500 }],\n subtotal: 2500,\n taxes: 250,\n deliveryFee: 0,\n total: 2750,\n status: 'ready' as OrderStatus,\n orderDate: '2024-01-16T12:00:00Z',\n deliveryAddress: {\n street: '22 HSR Layout',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n paymentMethod: 'Card',\n paymentStatus: 'completed' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-16T11:00:00Z', description: 'Order placed' },\n { status: 'confirmed', timestamp: '2024-01-16T11:10:00Z', description: 'Order confirmed' },\n { status: 'preparing', timestamp: '2024-01-16T11:30:00Z', description: 'Service started' },\n { status: 'ready', timestamp: '2024-01-16T12:00:00Z', description: 'Service completed' },\n ],\n customerName: 'Kiran Nair',\n customerPhone: '+91-9876543223',\n fulfillmentType: 'pickup' as const,\n },\n {\n id: 'ORD-014',\n cartId: 'FOOD-001',\n cartName: 'Dosa Express',\n cartImage: '',\n items: [\n { id: 'food-1', name: 'Masala Dosa', quantity: 1, price: 120 },\n { id: 'food-2', name: 'Filter Coffee', quantity: 2, price: 60 },\n ],\n subtotal: 240,\n taxes: 24,\n deliveryFee: 30,\n total: 294,\n status: 'cancelled' as OrderStatus,\n orderDate: '2024-01-15T18:00:00Z',\n deliveryAddress: {\n street: '5 BTM Layout',\n area: 'BTM Layout',\n city: 'Bangalore',\n pincode: '560076',\n },\n paymentMethod: 'UPI',\n paymentStatus: 'refunded' as const,\n timeline: [\n { status: 'pending', timestamp: '2024-01-15T17:50:00Z', description: 'Order placed' },\n {\n status: 'cancelled',\n timestamp: '2024-01-15T18:00:00Z',\n description: 'Order cancelled by customer',\n },\n ],\n customerName: 'Sneha Gupta',\n customerPhone: '+91-9876543224',\n fulfillmentType: 'delivery' as const,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<string, { color: string; label: string }> = {\n pending: { color: 'bg-status-warning-bg/20 text-status-warning-text', label: 'New Order' },\n confirmed: { color: 'bg-status-info-bg/20 text-status-info-text', label: 'Confirmed' },\n preparing: { color: 'bg-status-warning-bg/20 text-status-warning-text', label: 'Preparing' },\n ready: { color: 'bg-status-success-bg/20 text-status-success-text', label: 'Ready' },\n out_for_delivery: {\n color: 'bg-status-info-bg/20 text-status-info-text',\n label: 'Out for Delivery',\n },\n delivered: { color: 'bg-status-success-bg/20 text-status-success-text', label: 'Completed' },\n cancelled: { color: 'bg-status-error-bg/20 text-status-error-text', label: 'Cancelled' },\n};\n\nconst fulfillmentBadge: Record<string, { icon: typeof Truck; label: string; color: string }> = {\n delivery: {\n icon: Truck,\n label: 'Delivery',\n color: 'bg-accent-purple-subtle text-accent-purple',\n },\n pickup: {\n icon: ShoppingBag,\n label: 'Pickup',\n color: 'bg-status-info-bg/20 text-status-info-text',\n },\n cart_dispatch: {\n icon: MapPin,\n label: 'Cart Dispatch',\n color: 'bg-bg-sunken text-text-secondary',\n },\n};\n\nconst formatTimeAgo = (dateString: string) => {\n const date = new Date(dateString);\n const now = new Date();\n const diffMin = Math.floor((now.getTime() - date.getTime()) / (1000 * 60));\n if (diffMin < 1) return 'Just now';\n if (diffMin < 60) return `${diffMin} min ago`;\n if (diffMin < 1440) return `${Math.floor(diffMin / 60)} hours ago`;\n return date.toLocaleDateString('en-IN', { day: '2-digit', month: 'short' });\n};\n\nconst formatTime = (dateString: string) => {\n return new Date(dateString).toLocaleTimeString('en-IN', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n};\n\nconst getPriorityColor = (order: (typeof extendedOrders)[0]) => {\n const ageMin = (new Date().getTime() - new Date(order.orderDate).getTime()) / (1000 * 60);\n if (order.status === 'pending' && ageMin > 10)\n return 'border-status-error-border/50 bg-status-error-bg/5';\n if (order.status === 'preparing' && ageMin > 30)\n return 'border-status-warning-border/50 bg-status-warning-bg/5';\n return 'border-border-seam';\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const OrderManagementPage = () => {\n const { navigateTo } = useSubscriberBot();\n\n // Data - use inline state so actions can update it\n const [orders, setOrders] = useState(extendedOrders);\n\n // Filters\n const [filters, setFilters] = useState<OrderFilters>({\n status: '',\n dateRange: 'all',\n searchQuery: '',\n sortBy: 'recent',\n fulfillmentType: '',\n });\n\n // Modal\n const [selectedOrder, setSelectedOrder] = useState<(typeof extendedOrders)[0] | null>(null);\n const [showOrderDetails, setShowOrderDetails] = useState(false);\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const stats = useMemo(() => {\n const total = orders.length;\n const pending = orders.filter((o) => o.status === 'pending').length;\n const active = orders.filter((o) =>\n ['confirmed', 'preparing', 'ready', 'out_for_delivery'].includes(o.status)\n ).length;\n const completed = orders.filter((o) => o.status === 'delivered').length;\n const totalRevenue = orders\n .filter((o) => o.status === 'delivered')\n .reduce((s, o) => s + o.total, 0);\n const avgOrder = completed > 0 ? Math.round(totalRevenue / completed) : 0;\n return { total, pending, active, completed, totalRevenue, avgOrder };\n }, [orders]);\n\n // ---- Filtered orders ----\n const filteredOrders = useMemo(() => {\n let result = [...orders];\n\n if (filters.status) {\n result = result.filter((o) => o.status === filters.status);\n }\n if (filters.fulfillmentType) {\n result = result.filter((o) => o.fulfillmentType === filters.fulfillmentType);\n }\n if (filters.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n result = result.filter(\n (o) =>\n o.id.toLowerCase().includes(q) ||\n (o.customerName || '').toLowerCase().includes(q) ||\n o.items.some((item) => item.name.toLowerCase().includes(q))\n );\n }\n if (filters.dateRange !== 'all') {\n const now = new Date();\n const limit = new Date();\n if (filters.dateRange === 'today') limit.setHours(0, 0, 0, 0);\n else if (filters.dateRange === '7days') limit.setDate(now.getDate() - 7);\n else if (filters.dateRange === '30days') limit.setDate(now.getDate() - 30);\n result = result.filter((o) => new Date(o.orderDate) >= limit);\n }\n\n switch (filters.sortBy) {\n case 'recent':\n result.sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime());\n break;\n case 'oldest':\n result.sort((a, b) => new Date(a.orderDate).getTime() - new Date(b.orderDate).getTime());\n break;\n case 'amount_high':\n result.sort((a, b) => b.total - a.total);\n break;\n case 'amount_low':\n result.sort((a, b) => a.total - b.total);\n break;\n }\n\n return result;\n }, [orders, filters]);\n\n // ---- Actions ----\n const handleOrderAction = (\n orderId: string,\n action: 'accept' | 'reject' | 'ready' | 'complete'\n ) => {\n const statusMap: Record<string, OrderStatus> = {\n accept: 'confirmed',\n reject: 'cancelled',\n ready: 'ready',\n complete: 'delivered',\n };\n const messages: Record<string, string> = {\n accept: 'Order accepted',\n reject: 'Order rejected',\n ready: 'Order marked as ready',\n complete: 'Order completed',\n };\n\n setOrders((prev) =>\n prev.map((o) => (o.id === orderId ? { ...o, status: statusMap[action] } : o))\n );\n showStatus(messages[action], 'success');\n if (showOrderDetails && selectedOrder?.id === orderId) {\n setShowOrderDetails(false);\n }\n };\n\n return (\n <PageLayout\n title=\"Order Management\"\n description=\"Manage incoming and active orders\"\n titleGradient\n actions={\n <button\n type=\"button\"\n onClick={() => showStatus('Orders refreshed', 'success')}\n className=\"inline-flex items-center gap-2 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <RefreshCw className=\"h-4 w-4\" />\n Refresh\n </button>\n }\n >\n <div className=\"space-y-4\">\n <PagePurpose icon={<ShoppingBag className=\"h-4 w-4\" />}>\n The live queue for every order hitting your cart. Triage new orders the moment\n they arrive — accept, move them through preparing and ready, and mark them\n delivered so customers get accurate status updates. Filter by status to focus on\n what's pending right now, and watch revenue add up through the day.\n </PagePurpose>\n\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-status-success-border/30 bg-status-success-bg/10'\n : 'border-status-error-border/30 bg-status-error-bg/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Stats Overview — the ONE emphasis zone */}\n <EmphasisPanel className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Total Orders</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.total}</p>\n </div>\n <div className=\"rounded-lg border border-status-warning-border/30 bg-status-warning-bg/5 p-4 shadow-sm\">\n <p className=\"text-xs text-status-warning-text\">Pending</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.pending}</p>\n </div>\n <div className=\"rounded-lg border border-status-info-border/30 bg-status-info-bg/5 p-4 shadow-sm\">\n <p className=\"text-xs text-status-info-text\">Active</p>\n <p className=\"text-2xl font-bold text-status-info-text\">{stats.active}</p>\n </div>\n <div className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg/5 p-4 shadow-sm\">\n <p className=\"text-xs text-status-success-text\">Completed</p>\n <p className=\"text-2xl font-bold text-status-success-text\">{stats.completed}</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalRevenue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Avg Order</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.avgOrder, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </EmphasisPanel>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-5 gap-3\">\n <div className=\"relative sm:col-span-2 lg:col-span-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search orders...\"\n value={filters.searchQuery}\n onChange={(e) => setFilters((p) => ({ ...p, searchQuery: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={filters.status}\n onChange={(e) => setFilters((p) => ({ ...p, status: e.target.value }))}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Orders</option>\n <option value=\"pending\">New Orders</option>\n <option value=\"confirmed\">Confirmed</option>\n <option value=\"preparing\">Preparing</option>\n <option value=\"ready\">Ready</option>\n <option value=\"delivered\">Completed</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n <select\n value={filters.fulfillmentType}\n onChange={(e) => setFilters((p) => ({ ...p, fulfillmentType: e.target.value }))}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Types</option>\n <option value=\"pickup\">Pickup</option>\n <option value=\"delivery\">Delivery</option>\n <option value=\"cart_dispatch\">Cart Dispatch</option>\n </select>\n <select\n value={filters.dateRange}\n onChange={(e) => setFilters((p) => ({ ...p, dateRange: e.target.value }))}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"today\">Today</option>\n <option value=\"7days\">Last 7 Days</option>\n <option value=\"30days\">Last 30 Days</option>\n <option value=\"all\">All Time</option>\n </select>\n <select\n value={filters.sortBy}\n onChange={(e) => setFilters((p) => ({ ...p, sortBy: e.target.value }))}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"recent\">Most Recent</option>\n <option value=\"oldest\">Oldest First</option>\n <option value=\"amount_high\">Amount: High to Low</option>\n <option value=\"amount_low\">Amount: Low to High</option>\n </select>\n </div>\n </div>\n\n {/* Orders List */}\n {filteredOrders.length === 0 ? (\n <EmptyState\n illustration={filters.searchQuery || filters.status ? 'empty-search' : 'empty-sessions'}\n title=\"No orders found\"\n description={\n filters.searchQuery || filters.status\n ? 'Try adjusting your filters to see more orders.'\n : 'No orders to display yet. New orders will appear here the moment customers place them.'\n }\n />\n ) : (\n <div className=\"space-y-4\">\n {filteredOrders.map((order) => {\n const status = statusConfig[order.status] || {\n color: 'bg-bg-sunken text-text-secondary',\n label: order.status,\n };\n const fulfillment =\n fulfillmentBadge[order.fulfillmentType || 'delivery'] || fulfillmentBadge.delivery;\n const FulfillmentIcon = fulfillment.icon;\n\n return (\n <div\n key={order.id}\n className={cn(\n 'rounded-lg border bg-bg-surface shadow-sm transition-shadow hover:shadow-md',\n getPriorityColor(order)\n )}\n >\n <div className=\"p-4 sm:p-5\">\n {/* Header */}\n <div className=\"flex flex-col lg:flex-row lg:items-center lg:justify-between gap-3 mb-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm sm:text-base font-semibold text-text-primary\">\n Order #{order.id}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n status.color\n )}\n >\n {status.label}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n fulfillment.color\n )}\n >\n <FulfillmentIcon className=\"h-3 w-3\" />\n {fulfillment.label}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n {order.customerName || 'Customer'} | {formatTimeAgo(order.orderDate)}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <button\n type=\"button\"\n onClick={() => {\n setSelectedOrder(order);\n setShowOrderDetails(true);\n }}\n className=\"rounded-md border border-border-seam px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n View Details\n </button>\n </div>\n </div>\n\n {/* Items */}\n <div className=\"border-t border-border-seam pt-3 mb-3\">\n <div className=\"flex flex-wrap gap-2\">\n {order.items.map((item, idx) => (\n <span\n key={idx}\n className=\"inline-flex items-center rounded bg-bg-sunken px-2 py-1 text-xs text-text-primary\"\n >\n {item.quantity}x {item.name}\n </span>\n ))}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-2\">\n {order.status === 'pending' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'accept')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-success-bg/10 px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Accept Order\n </button>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'reject')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-error-bg/10 px-3 py-2 text-xs font-medium text-status-error-text hover:bg-status-error-bg/20 transition-colors\"\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Reject\n </button>\n </>\n )}\n {order.status === 'confirmed' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'ready')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-warning-bg/10 px-3 py-2 text-xs font-medium text-status-warning-text hover:bg-status-warning-bg/20 transition-colors\"\n >\n <ChefHat className=\"h-3.5 w-3.5\" />\n Start Preparing\n </button>\n )}\n {order.status === 'preparing' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'ready')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-success-bg/10 px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n >\n <PackageCheck className=\"h-3.5 w-3.5\" />\n Mark as Ready\n </button>\n )}\n {order.status === 'ready' && order.fulfillmentType === 'pickup' && (\n <button\n type=\"button\"\n onClick={() => handleOrderAction(order.id, 'complete')}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-status-success-bg/10 px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete Order\n </button>\n )}\n {['confirmed', 'preparing', 'ready'].includes(order.status) && (\n <button\n type=\"button\"\n onClick={() => alert('Contact feature coming soon!')}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-seam px-3 py-2 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Contact Customer\n </button>\n )}\n </div>\n\n {/* Special Instructions */}\n {order.specialInstructions && (\n <div className=\"mt-3 rounded-md border border-status-warning-border/30 bg-status-warning-bg/10 p-3\">\n <p className=\"text-xs font-medium text-status-warning-text\">\n Special Instructions:\n </p>\n <p className=\"text-xs text-status-warning-text mt-0.5\">\n {order.specialInstructions}\n </p>\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Order Details Modal */}\n {showOrderDetails && selectedOrder && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Order Details</h3>\n <button\n type=\"button\"\n onClick={() => setShowOrderDetails(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {/* Order Meta */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Order ID</p>\n <p className=\"text-sm font-medium text-text-primary\">#{selectedOrder.id}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Status</p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium mt-0.5',\n (statusConfig[selectedOrder.status] || statusConfig.pending).color\n )}\n >\n {(statusConfig[selectedOrder.status] || statusConfig.pending).label}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Customer</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {selectedOrder.customerName || 'N/A'}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Order Time</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatTime(selectedOrder.orderDate)}\n </p>\n </div>\n </div>\n\n {/* Items */}\n <div className=\"border-t border-border-seam pt-4\">\n <h4 className=\"text-sm font-medium text-text-primary mb-3\">Order Items</h4>\n <div className=\"space-y-2\">\n {selectedOrder.items.map((item, idx) => (\n <div key={idx} className=\"flex justify-between items-start\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x{' '}\n {item.quantity}\n </p>\n </div>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </p>\n </div>\n ))}\n </div>\n </div>\n\n {/* Totals */}\n <div className=\"border-t border-border-seam pt-4 space-y-2\">\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Subtotal</span>\n <span>\n {formatCurrency(selectedOrder.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Delivery Fee</span>\n <span>\n {formatCurrency(selectedOrder.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-sm text-text-secondary\">\n <span>Tax</span>\n <span>{formatCurrency(selectedOrder.taxes, { minimumFractionDigits: 0 })}</span>\n </div>\n <div className=\"flex justify-between font-semibold text-text-primary pt-2 border-t border-border-seam\">\n <span>Total</span>\n <span>{formatCurrency(selectedOrder.total, { minimumFractionDigits: 0 })}</span>\n </div>\n </div>\n\n {/* Delivery Address */}\n {selectedOrder.fulfillmentType === 'delivery' && selectedOrder.deliveryAddress && (\n <div className=\"border-t border-border-seam pt-4\">\n <h4 className=\"text-sm font-medium text-text-primary mb-2 flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Delivery Address\n </h4>\n <p className=\"text-sm text-text-secondary\">\n {selectedOrder.deliveryAddress.street}, {selectedOrder.deliveryAddress.area}\n <br />\n {selectedOrder.deliveryAddress.city} - {selectedOrder.deliveryAddress.pincode}\n </p>\n </div>\n )}\n\n {/* Modal Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowOrderDetails(false)}\n className=\"flex-1 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n Close\n </button>\n {selectedOrder.status === 'pending' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(selectedOrder.id, 'accept')}\n className=\"flex-1 rounded-md bg-status-success-bg/10 px-4 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n >\n Accept Order\n </button>\n <button\n type=\"button\"\n onClick={() => handleOrderAction(selectedOrder.id, 'reject')}\n className=\"flex-1 rounded-md bg-status-error-bg/10 px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/20 transition-colors\"\n >\n Reject Order\n </button>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}