@burdenoff/microfe-adaptercloud 2026.625.1 → 2026.625.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 (93) hide show
  1. package/dist/adaptercloud/components/PageLayout.js +24 -17
  2. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  3. package/dist/adaptercloud/pages/HomePage.js +18 -16
  4. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  5. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +90 -82
  6. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/adaptercloud/pages/admin/AdminDashboard.js +70 -44
  8. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +60 -55
  10. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +97 -92
  12. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +59 -57
  14. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +118 -104
  16. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/CartManagementPage.js +145 -140
  18. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/UserManagementPage.js +152 -147
  20. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +87 -81
  22. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  23. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +179 -165
  24. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  25. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +73 -48
  26. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  27. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +95 -93
  28. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  29. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +110 -107
  30. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +293 -299
  32. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +218 -224
  34. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +122 -128
  36. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/adaptercloud/pages/common/HelpSupportPage.js +248 -244
  38. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +96 -91
  40. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
  42. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +63 -61
  44. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/customer/CartDetailPage.js +110 -108
  46. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +221 -217
  48. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/customer/CheckoutPage.js +89 -87
  50. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +410 -381
  52. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +120 -118
  54. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +86 -81
  56. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/FavoritesPage.js +53 -51
  58. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +114 -109
  60. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +60 -58
  62. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +87 -72
  64. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/ReviewsPage.js +65 -63
  66. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +68 -53
  68. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +63 -61
  70. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +86 -84
  72. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +57 -55
  74. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +341 -308
  76. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  77. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +34 -32
  78. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +48 -46
  80. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +383 -381
  82. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  83. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +348 -319
  84. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +84 -59
  86. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +73 -71
  88. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +76 -74
  90. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  91. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +70 -68
  92. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  93. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/worker/TaskDetailsPage.tsx"],"sourcesContent":["/**\n * Task Details Page\n *\n * Full-featured task details page with:\n * - Loading state with spinner\n * - Notes section: textarea for adding worker notes + Save Notes button\n * - Reference Photos grid display\n * - Special Instructions section with yellow warning-style card\n * - Start Task / Complete Task action buttons with state changes\n * - Call Customer button linking to tel:\n * - Navigate to Location button opening Google Maps\n * - Due time warning banner\n * - Task type icon display\n * - Status and priority badges\n * - Order items with special instructions per item\n * - Full delivery address\n * - Status timeline\n *\n * @module adaptercloud/pages/worker\n */\n\nimport { useState, useEffect, useMemo, useCallback } from'react';\nimport { useParams } from'react-router-dom';\nimport {\n ArrowLeft,\n Package,\n Phone,\n MapPin,\n Clock,\n IndianRupee,\n Navigation,\n CheckCircle2,\n Circle,\n PlayCircle,\n ShoppingBag,\n User,\n AlertTriangle,\n FileText,\n Loader2,\n Truck,\n ChefHat,\n Boxes,\n Sparkles,\n Camera,\n StickyNote,\n Save,\n Timer,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { StatusBadge } from'../../components/StatusBadge';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\nimport type { TaskStatus } from'../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface TaskOrderItem {\n name: string;\n quantity: number;\n specialInstructions?: string;\n}\n\ninterface TaskCustomerInfo {\n name: string;\n phone: string;\n address: string;\n}\n\ninterface TaskDetails {\n id: string;\n orderId: string;\n cartId: string;\n cartName: string;\n type: 'delivery' | 'preparation' | 'inventory' | 'cleanup' | 'service' | 'pickup';\n status: TaskStatus;\n priority: 'high' | 'medium' | 'low' | 'urgent';\n title: string;\n description: string;\n estimatedTime: number;\n assignedBy: string;\n assignedTime: string;\n dueTime: string;\n location?: string;\n earnings: number;\n distance?: number;\n customerInfo: TaskCustomerInfo;\n orderItems: TaskOrderItem[];\n specialInstructions?: string;\n photos?: string[];\n notes?: string;\n}\n\ninterface TimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getTaskTypeIcon(type: string) {\n switch (type) {\n case'delivery':\n return Truck;\n case'preparation':\n return ChefHat;\n case'inventory':\n return Boxes;\n case'cleanup':\n return Sparkles;\n case'pickup':\n return ShoppingBag;\n case'service':\n return Package;\n default:\n return FileText;\n }\n}\n\nfunction getPriorityStyle(priority: string): string {\n switch (priority) {\n case'urgent':\n return'bg-status-error-bg-subtle/20 text-status-error-text';\n case'high':\n return'bg-accent-orange-subtle/20 text-accent-orange';\n case'medium':\n return'bg-status-warning-bg-subtle/20 text-status-warning-text';\n case'low':\n return'bg-status-success-bg-subtle/20 text-status-success-text';\n default:\n return'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction buildTimeline(task: TaskDetails): TimelineEvent[] {\n const assignedTs = task.assignedTime;\n const inProgressTs =\n task.status === 'in_progress' || task.status === 'completed'\n ? new Date(new Date(assignedTs).getTime() + 15 * 60000).toISOString()\n : null;\n const completedTs = task.status === 'completed' ? new Date().toISOString() : null;\n\n return [\n { status: 'assigned', label: 'Task Assigned', timestamp: assignedTs, completed: true },\n {\n status: 'in_progress',\n label: 'Work Started',\n timestamp: inProgressTs,\n completed: task.status === 'in_progress' || task.status === 'completed',\n },\n {\n status: 'completed',\n label: 'Task Completed',\n timestamp: completedTs,\n completed: task.status === 'completed',\n },\n ];\n}\n\nfunction formatTime(dateString: string): string {\n return new Date(dateString).toLocaleTimeString('en-IN', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function TaskDetailsPage() {\n const { taskId } = useParams<{ taskId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [task, setTask] = useState<TaskDetails | null>(null);\n const [loading, setLoading] = useState(true);\n const [notes, setNotes] = useState('');\n\n const loadTask = useCallback(() => {\n setLoading(true);\n setTimeout(() => {\n const mockTask: TaskDetails = {\n id: taskId || 'TASK-001',\n orderId: 'ORD-123',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'delivery',\n status: 'pending',\n priority: 'high',\n title: 'Deliver Order #ORD-123',\n description: 'Deliver 2x Masala Dosa, 1x Filter Coffee to customer at Koramangala',\n estimatedTime: 25,\n assignedBy: 'Cart Manager',\n assignedTime: new Date(Date.now() - 5 * 60 * 1000).toISOString(),\n dueTime: new Date(Date.now() + 30 * 60 * 1000).toISOString(),\n location: 'Koramangala 5th Block',\n earnings: 95,\n distance: 3.5,\n customerInfo: {\n name: 'Rahul Sharma',\n phone: '+91-98765-43210',\n address: '123, MG Road, Near Central Mall, Koramangala 5th Block, Bangalore - 560034',\n },\n orderItems: [\n { name: 'Masala Dosa', quantity: 2, specialInstructions: 'Extra spicy' },\n { name: 'Filter Coffee', quantity: 1, specialInstructions: 'Less sugar' },\n ],\n specialInstructions: 'Please call before delivery. Customer prefers contactless delivery.',\n photos: [\n 'https://images.unsplash.com/photo-1630384060421-cb20d0e0649d?w=400',\n 'https://images.unsplash.com/photo-1572802419224-296b0aeee0d9?w=400',\n ],\n notes: '',\n };\n setTask(mockTask);\n setNotes(mockTask.notes || '');\n setLoading(false);\n }, 600);\n }, [taskId]);\n\n useEffect(() => {\n loadTask();\n }, [loadTask]);\n\n const handleStartTask = () => {\n if (task) {\n setTask({ ...task, status: 'in_progress' });\n alert('Task started successfully');\n }\n };\n\n const handleCompleteTask = () => {\n if (task) {\n setTask({ ...task, status: 'completed' });\n alert('Task completed successfully');\n }\n };\n\n const handleCallCustomer = () => {\n if (task?.customerInfo?.phone) {\n window.location.href = `tel:${task.customerInfo.phone.replace(/\\s/g, '')}`;\n }\n };\n\n const handleNavigateToLocation = () => {\n if (task?.customerInfo?.address) {\n const encoded = encodeURIComponent(task.customerInfo.address);\n window.open(`https://maps.google.com?q=${encoded}`, '_blank');\n }\n };\n\n const handleSaveNotes = () => {\n if (task) {\n setTask({ ...task, notes });\n alert('Notes saved successfully');\n }\n };\n\n const timeline = useMemo(() => (task ? buildTimeline(task) : []), [task]);\n\n // Loading state\n if (loading) {\n return (\n <PageLayout title=\"Task Details\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading task details...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n // Not found\n if (!task) {\n return (\n <PageLayout title=\"Task Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n icon={<FileText className=\"h-12 w-12\" />}\n title=\"Task not found\"\n description={`No task found with ID\"${taskId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const TaskTypeIcon = getTaskTypeIcon(task.type);\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Task Details</span>\n </div>\n }\n description=\"Manage and track your assigned task\"\n >\n <div className=\"space-y-6\">\n {/* Task Header Card */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <TaskTypeIcon className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-text-primary\">{task.title}</h2>\n <p className=\"text-sm text-text-secondary mt-1\">{task.description}</p>\n <div className=\"flex flex-wrap items-center gap-2 mt-3\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium uppercase',\n getPriorityStyle(task.priority)\n )}\n >\n {task.priority}\n </span>\n <StatusBadge status={task.status} />\n <span className=\"text-xs text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {task.estimatedTime} min\n </span>\n </div>\n </div>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-xs text-text-secondary\">Assigned by</p>\n <p className=\"text-sm font-medium text-text-primary\">{task.assignedBy}</p>\n <p className=\"text-xs text-text-secondary mt-1\">{formatTime(task.assignedTime)}</p>\n </div>\n </div>\n\n {/* Due Time Warning Banner */}\n {task.dueTime && task.status !== 'completed' && (\n <div className=\"rounded-md bg-status-warning-bg-subtle/10 border border-status-warning-border/20 p-3\">\n <div className=\"flex items-center gap-2\">\n <Timer className=\"h-4 w-4 text-status-warning-text shrink-0\" />\n <span className=\"text-xs font-medium text-status-warning-text\">\n Due by {formatTime(task.dueTime)}\n </span>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Left Column */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Customer Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Customer Information</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <User className=\"h-5 w-5\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {task.customerInfo.name}\n </p>\n <p className=\"text-xs text-text-secondary\">{task.customerInfo.phone}</p>\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={handleCallCustomer}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Call Customer\n </button>\n <button\n type=\"button\"\n onClick={handleNavigateToLocation}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Navigation className=\"h-3.5 w-3.5\" />\n Navigate\n </button>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-2\">Delivery Address</p>\n <div className=\"rounded-md bg-bg-sunken/50 p-3\">\n <p className=\"text-xs text-text-primary flex items-start gap-2\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 mt-0.5 text-text-secondary\" />\n {task.customerInfo.address}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Order Items */}\n {task.orderItems.length > 0 && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Order Items</h3>\n <div className=\"space-y-2\">\n {task.orderItems.map((item, index) => (\n <div\n key={index}\n className=\"flex items-start justify-between p-3 rounded-md bg-bg-sunken/50\"\n >\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {item.quantity}x {item.name}\n </p>\n {item.specialInstructions && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Note: {item.specialInstructions}\n </p>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Special Instructions */}\n {task.specialInstructions && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n Special Instructions\n </h3>\n <div className=\"rounded-md bg-status-warning-bg-subtle/10 border border-status-warning-border/20 p-4\">\n <p className=\"text-sm text-status-warning-text flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 shrink-0 mt-0.5 text-status-warning-text\" />\n {task.specialInstructions}\n </p>\n </div>\n </div>\n )}\n\n {/* Reference Photos */}\n {task.photos && task.photos.length > 0 && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Camera className=\"h-4 w-4 text-text-secondary\" />\n Reference Photos\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {task.photos.map((photo, index) => (\n <img\n key={index}\n src={photo}\n alt={`Reference ${index + 1}`}\n className=\"w-full h-32 object-cover rounded-lg border border-border-subtle\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Task Notes */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <StickyNote className=\"h-4 w-4 text-text-secondary\" />\n Task Notes\n </h3>\n <textarea\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n placeholder=\"Add your notes about this task...\"\n rows={4}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-accent-blue-subtle/40 resize-none\"\n />\n <button\n type=\"button\"\n onClick={handleSaveNotes}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Save className=\"h-3.5 w-3.5\" />\n Save Notes\n </button>\n </div>\n </div>\n\n {/* Right Sidebar */}\n <div className=\"space-y-6\">\n {/* Task Details */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Task Details</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Order ID</p>\n <p className=\"text-sm font-medium font-mono text-text-primary\">{task.orderId}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShoppingBag className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Cart</p>\n <p className=\"text-sm font-medium text-text-primary\">{task.cartName}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Due At</p>\n <p className=\"text-sm text-text-primary\">{formatDate(task.dueTime)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <IndianRupee className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Earnings</p>\n <p className=\"text-sm font-medium text-status-success-text\">\n {formatCurrency(task.earnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </div>\n {task.distance != null && (\n <div className=\"flex items-center gap-2\">\n <Navigation className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Distance</p>\n <p className=\"text-sm text-text-primary\">{task.distance} km</p>\n </div>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Assigned At</p>\n <p className=\"text-sm text-text-primary\">{formatDate(task.assignedTime)}</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Status Timeline */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Status Timeline</h3>\n <div className=\"relative\">\n {timeline.map((event, index) => {\n const isLast = index === timeline.length - 1;\n const Icon = event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={event.status} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n event.completed\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg-subtle/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-5', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n {task.status === 'pending' && (\n <button\n type=\"button\"\n onClick={handleStartTask}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-accent-blue-subtle/10 px-4 py-3 text-sm font-medium text-accent-blue hover:bg-accent-blue-subtle/20 transition-colors\"\n >\n <PlayCircle className=\"h-4 w-4\" />\n Start Task\n </button>\n )}\n {task.status === 'in_progress' && (\n <button\n type=\"button\"\n onClick={handleCompleteTask}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-status-success-bg-subtle/10 px-4 py-3 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-4 w-4\" />\n Complete Task\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-accent px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Tasks\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TaskDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/worker/TaskDetailsPage.tsx"],"sourcesContent":["/**\n * Task Details Page\n *\n * Full-featured task details page with:\n * - Loading state with spinner\n * - Notes section: textarea for adding worker notes + Save Notes button\n * - Reference Photos grid display\n * - Special Instructions section with yellow warning-style card\n * - Start Task / Complete Task action buttons with state changes\n * - Call Customer button linking to tel:\n * - Navigate to Location button opening Google Maps\n * - Due time warning banner\n * - Task type icon display\n * - Status and priority badges\n * - Order items with special instructions per item\n * - Full delivery address\n * - Status timeline\n *\n * @module adaptercloud/pages/worker\n */\n\nimport { useState, useEffect, useMemo, useCallback } from'react';\nimport { useParams } from'react-router-dom';\nimport {\n ArrowLeft,\n Package,\n Phone,\n MapPin,\n Clock,\n IndianRupee,\n Navigation,\n CheckCircle2,\n Circle,\n PlayCircle,\n ShoppingBag,\n User,\n AlertTriangle,\n FileText,\n Loader2,\n Truck,\n ChefHat,\n Boxes,\n Sparkles,\n Camera,\n StickyNote,\n Save,\n Timer,\n} from'lucide-react';\nimport { EmphasisPanel, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { StatusBadge } from'../../components/StatusBadge';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\nimport type { TaskStatus } from'../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface TaskOrderItem {\n name: string;\n quantity: number;\n specialInstructions?: string;\n}\n\ninterface TaskCustomerInfo {\n name: string;\n phone: string;\n address: string;\n}\n\ninterface TaskDetails {\n id: string;\n orderId: string;\n cartId: string;\n cartName: string;\n type: 'delivery' | 'preparation' | 'inventory' | 'cleanup' | 'service' | 'pickup';\n status: TaskStatus;\n priority: 'high' | 'medium' | 'low' | 'urgent';\n title: string;\n description: string;\n estimatedTime: number;\n assignedBy: string;\n assignedTime: string;\n dueTime: string;\n location?: string;\n earnings: number;\n distance?: number;\n customerInfo: TaskCustomerInfo;\n orderItems: TaskOrderItem[];\n specialInstructions?: string;\n photos?: string[];\n notes?: string;\n}\n\ninterface TimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction getTaskTypeIcon(type: string) {\n switch (type) {\n case'delivery':\n return Truck;\n case'preparation':\n return ChefHat;\n case'inventory':\n return Boxes;\n case'cleanup':\n return Sparkles;\n case'pickup':\n return ShoppingBag;\n case'service':\n return Package;\n default:\n return FileText;\n }\n}\n\nfunction getPriorityStyle(priority: string): string {\n switch (priority) {\n case'urgent':\n return'bg-status-error-bg-subtle/20 text-status-error-text';\n case'high':\n return'bg-accent-orange-subtle/20 text-accent-orange';\n case'medium':\n return'bg-status-warning-bg-subtle/20 text-status-warning-text';\n case'low':\n return'bg-status-success-bg-subtle/20 text-status-success-text';\n default:\n return'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction buildTimeline(task: TaskDetails): TimelineEvent[] {\n const assignedTs = task.assignedTime;\n const inProgressTs =\n task.status === 'in_progress' || task.status === 'completed'\n ? new Date(new Date(assignedTs).getTime() + 15 * 60000).toISOString()\n : null;\n const completedTs = task.status === 'completed' ? new Date().toISOString() : null;\n\n return [\n { status: 'assigned', label: 'Task Assigned', timestamp: assignedTs, completed: true },\n {\n status: 'in_progress',\n label: 'Work Started',\n timestamp: inProgressTs,\n completed: task.status === 'in_progress' || task.status === 'completed',\n },\n {\n status: 'completed',\n label: 'Task Completed',\n timestamp: completedTs,\n completed: task.status === 'completed',\n },\n ];\n}\n\nfunction formatTime(dateString: string): string {\n return new Date(dateString).toLocaleTimeString('en-IN', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function TaskDetailsPage() {\n const { taskId } = useParams<{ taskId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [task, setTask] = useState<TaskDetails | null>(null);\n const [loading, setLoading] = useState(true);\n const [notes, setNotes] = useState('');\n\n const loadTask = useCallback(() => {\n setLoading(true);\n setTimeout(() => {\n const mockTask: TaskDetails = {\n id: taskId || 'TASK-001',\n orderId: 'ORD-123',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'delivery',\n status: 'pending',\n priority: 'high',\n title: 'Deliver Order #ORD-123',\n description: 'Deliver 2x Masala Dosa, 1x Filter Coffee to customer at Koramangala',\n estimatedTime: 25,\n assignedBy: 'Cart Manager',\n assignedTime: new Date(Date.now() - 5 * 60 * 1000).toISOString(),\n dueTime: new Date(Date.now() + 30 * 60 * 1000).toISOString(),\n location: 'Koramangala 5th Block',\n earnings: 95,\n distance: 3.5,\n customerInfo: {\n name: 'Rahul Sharma',\n phone: '+91-98765-43210',\n address: '123, MG Road, Near Central Mall, Koramangala 5th Block, Bangalore - 560034',\n },\n orderItems: [\n { name: 'Masala Dosa', quantity: 2, specialInstructions: 'Extra spicy' },\n { name: 'Filter Coffee', quantity: 1, specialInstructions: 'Less sugar' },\n ],\n specialInstructions: 'Please call before delivery. Customer prefers contactless delivery.',\n photos: [\n 'https://images.unsplash.com/photo-1630384060421-cb20d0e0649d?w=400',\n 'https://images.unsplash.com/photo-1572802419224-296b0aeee0d9?w=400',\n ],\n notes: '',\n };\n setTask(mockTask);\n setNotes(mockTask.notes || '');\n setLoading(false);\n }, 600);\n }, [taskId]);\n\n useEffect(() => {\n loadTask();\n }, [loadTask]);\n\n const handleStartTask = () => {\n if (task) {\n setTask({ ...task, status: 'in_progress' });\n alert('Task started successfully');\n }\n };\n\n const handleCompleteTask = () => {\n if (task) {\n setTask({ ...task, status: 'completed' });\n alert('Task completed successfully');\n }\n };\n\n const handleCallCustomer = () => {\n if (task?.customerInfo?.phone) {\n window.location.href = `tel:${task.customerInfo.phone.replace(/\\s/g, '')}`;\n }\n };\n\n const handleNavigateToLocation = () => {\n if (task?.customerInfo?.address) {\n const encoded = encodeURIComponent(task.customerInfo.address);\n window.open(`https://maps.google.com?q=${encoded}`, '_blank');\n }\n };\n\n const handleSaveNotes = () => {\n if (task) {\n setTask({ ...task, notes });\n alert('Notes saved successfully');\n }\n };\n\n const timeline = useMemo(() => (task ? buildTimeline(task) : []), [task]);\n\n // Loading state\n if (loading) {\n return (\n <PageLayout title=\"Task Details\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading task details...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n // Not found\n if (!task) {\n return (\n <PageLayout title=\"Task Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n icon={<FileText className=\"h-12 w-12\" />}\n title=\"Task not found\"\n description={`No task found with ID\"${taskId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"rounded-lg bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n View All Orders\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const TaskTypeIcon = getTaskTypeIcon(task.type);\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Task Details</span>\n </div>\n }\n description=\"Manage and track your assigned task\"\n purpose=\"Everything you need to complete this job — the task itself, the customer and delivery address, and the buttons to call, navigate, and update its status. Work through it top to bottom and mark it done when finished.\"\n >\n <div className=\"space-y-6\">\n {/* Task Header Card (emphasis zone) */}\n <EmphasisPanel className=\"p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <TaskTypeIcon className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <h2 className=\"text-xl font-bold text-text-primary\">{task.title}</h2>\n <p className=\"text-sm text-text-secondary mt-1\">{task.description}</p>\n <div className=\"flex flex-wrap items-center gap-2 mt-3\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium uppercase',\n getPriorityStyle(task.priority)\n )}\n >\n {task.priority}\n </span>\n <StatusBadge status={task.status} />\n <span className=\"text-xs text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {task.estimatedTime} min\n </span>\n </div>\n </div>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-xs text-text-secondary\">Assigned by</p>\n <p className=\"text-sm font-medium text-text-primary\">{task.assignedBy}</p>\n <p className=\"text-xs text-text-secondary mt-1\">{formatTime(task.assignedTime)}</p>\n </div>\n </div>\n\n {/* Due Time Warning Banner */}\n {task.dueTime && task.status !== 'completed' && (\n <div className=\"rounded-md bg-status-warning-bg-subtle/10 border border-status-warning-border/20 p-3\">\n <div className=\"flex items-center gap-2\">\n <Timer className=\"h-4 w-4 text-status-warning-text shrink-0\" />\n <span className=\"text-xs font-medium text-status-warning-text\">\n Due by {formatTime(task.dueTime)}\n </span>\n </div>\n </div>\n )}\n </EmphasisPanel>\n\n <NextSteps\n storageKey=\"adaptercloud-worker-task\"\n steps={[\n {\n id: 'navigate',\n label: 'Navigate to the customer',\n description: 'Open directions to the delivery or service address.',\n onClick: handleNavigateToLocation,\n },\n {\n id: 'call',\n label: 'Call the customer',\n description: 'Confirm details or let them know you are on the way.',\n onClick: handleCallCustomer,\n },\n {\n id: 'complete',\n label: 'Mark the task complete',\n description: 'Update the status once the job is done.',\n onClick: handleCompleteTask,\n done: task.status === 'completed',\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Left Column */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Customer Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Customer Information</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <User className=\"h-5 w-5\" />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {task.customerInfo.name}\n </p>\n <p className=\"text-xs text-text-secondary\">{task.customerInfo.phone}</p>\n </div>\n </div>\n </div>\n <div className=\"flex gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={handleCallCustomer}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Call Customer\n </button>\n <button\n type=\"button\"\n onClick={handleNavigateToLocation}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Navigation className=\"h-3.5 w-3.5\" />\n Navigate\n </button>\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-2\">Delivery Address</p>\n <div className=\"rounded-md bg-bg-sunken/50 p-3\">\n <p className=\"text-xs text-text-primary flex items-start gap-2\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 mt-0.5 text-text-secondary\" />\n {task.customerInfo.address}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Order Items */}\n {task.orderItems.length > 0 && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Order Items</h3>\n <div className=\"space-y-2\">\n {task.orderItems.map((item, index) => (\n <div\n key={index}\n className=\"flex items-start justify-between p-3 rounded-md bg-bg-sunken/50\"\n >\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {item.quantity}x {item.name}\n </p>\n {item.specialInstructions && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Note: {item.specialInstructions}\n </p>\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Special Instructions */}\n {task.specialInstructions && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n Special Instructions\n </h3>\n <div className=\"rounded-md bg-status-warning-bg-subtle/10 border border-status-warning-border/20 p-4\">\n <p className=\"text-sm text-status-warning-text flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 shrink-0 mt-0.5 text-status-warning-text\" />\n {task.specialInstructions}\n </p>\n </div>\n </div>\n )}\n\n {/* Reference Photos */}\n {task.photos && task.photos.length > 0 && (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <Camera className=\"h-4 w-4 text-text-secondary\" />\n Reference Photos\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {task.photos.map((photo, index) => (\n <img\n key={index}\n src={photo}\n alt={`Reference ${index + 1}`}\n className=\"w-full h-32 object-cover rounded-lg border border-border-subtle\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Task Notes */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary flex items-center gap-2 mb-3\">\n <StickyNote className=\"h-4 w-4 text-text-secondary\" />\n Task Notes\n </h3>\n <textarea\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n placeholder=\"Add your notes about this task...\"\n rows={4}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-accent-blue-subtle/40 resize-none\"\n />\n <button\n type=\"button\"\n onClick={handleSaveNotes}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <Save className=\"h-3.5 w-3.5\" />\n Save Notes\n </button>\n </div>\n </div>\n\n {/* Right Sidebar */}\n <div className=\"space-y-6\">\n {/* Task Details */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Task Details</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <FileText className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Order ID</p>\n <p className=\"text-sm font-medium font-mono text-text-primary\">{task.orderId}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <ShoppingBag className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Cart</p>\n <p className=\"text-sm font-medium text-text-primary\">{task.cartName}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Due At</p>\n <p className=\"text-sm text-text-primary\">{formatDate(task.dueTime)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <IndianRupee className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Earnings</p>\n <p className=\"text-sm font-medium text-status-success-text\">\n {formatCurrency(task.earnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </div>\n {task.distance != null && (\n <div className=\"flex items-center gap-2\">\n <Navigation className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Distance</p>\n <p className=\"text-sm text-text-primary\">{task.distance} km</p>\n </div>\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Assigned At</p>\n <p className=\"text-sm text-text-primary\">{formatDate(task.assignedTime)}</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Status Timeline */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">Status Timeline</h3>\n <div className=\"relative\">\n {timeline.map((event, index) => {\n const isLast = index === timeline.length - 1;\n const Icon = event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={event.status} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n event.completed\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg-subtle/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-5', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3\">\n {task.status === 'pending' && (\n <button\n type=\"button\"\n onClick={handleStartTask}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-accent-blue-subtle/10 px-4 py-3 text-sm font-medium text-accent-blue hover:bg-accent-blue-subtle/20 transition-colors\"\n >\n <PlayCircle className=\"h-4 w-4\" />\n Start Task\n </button>\n )}\n {task.status === 'in_progress' && (\n <button\n type=\"button\"\n onClick={handleCompleteTask}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-status-success-bg-subtle/10 px-4 py-3 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-4 w-4\" />\n Complete Task\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => navigateTo('/worker/orders')}\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg bg-accent px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Tasks\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -6,17 +6,18 @@ import { formatCurrency as s } from "../../utils/formatters.js";
6
6
  import { useState as c } from "react";
7
7
  import { Boxes as l, CalendarDays as u, CheckCircle2 as d, ChefHat as f, ChevronRight as p, ClipboardList as m, Clock as h, Loader2 as g, MapPin as _, Package as v, Pause as y, Play as b, Sparkles as x, Star as S, Timer as C, TrendingUp as w, Truck as T, User as E, Zap as D } from "lucide-react";
8
8
  import { jsx as O, jsxs as k } from "react/jsx-runtime";
9
+ import { EmphasisPanel as A, NextSteps as j } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/adaptercloud/pages/worker/WorkerDashboard.tsx
10
- var A = {
11
+ var M = {
11
12
  high: "bg-status-error-bg-subtle/20 text-status-error-text",
12
13
  medium: "bg-status-warning-bg-subtle/20 text-status-warning-text",
13
14
  low: "bg-status-success-bg-subtle/20 text-status-success-text"
14
- }, j = {
15
+ }, N = {
15
16
  pending: "bg-secondary text-secondary-foreground",
16
17
  in_progress: "bg-accent-blue-subtle/20 text-accent-blue",
17
18
  completed: "bg-status-success-bg-subtle/20 text-status-success-text"
18
19
  };
19
- function M(e) {
20
+ function P(e) {
20
21
  switch (e) {
21
22
  case "delivery": return T;
22
23
  case "preparation": return f;
@@ -25,56 +26,56 @@ function M(e) {
25
26
  default: return m;
26
27
  }
27
28
  }
28
- var N = {
29
+ var F = {
29
30
  high: 3,
30
31
  medium: 2,
31
32
  low: 1
32
- }, P = () => {
33
- let { navigateTo: l, currentUser: f } = e(), m = f?.id || "", { data: x = [], isLoading: T } = o(m), { data: P, isLoading: F } = a(m), I = r(), L = i(), [R, z] = c(null), [B, V] = c(!1), [H, U] = c(null), W = async (e, t) => {
33
+ }, I = () => {
34
+ let { navigateTo: l, currentUser: f } = e(), m = f?.id || "", { data: x = [], isLoading: T } = o(m), { data: I, isLoading: L } = a(m), R = r(), z = i(), [B, V] = c(null), [H, U] = c(!1), [W, G] = c(null), K = async (e, t) => {
34
35
  let n = "";
35
36
  switch (t) {
36
37
  case "start":
37
- n = "IN_PROGRESS", z(e);
38
+ n = "IN_PROGRESS", V(e);
38
39
  break;
39
40
  case "complete":
40
- n = "COMPLETED", R === e && z(null);
41
+ n = "COMPLETED", B === e && V(null);
41
42
  break;
42
43
  case "pause":
43
- n = "PENDING", R === e && z(null);
44
+ n = "PENDING", B === e && V(null);
44
45
  break;
45
46
  }
46
47
  try {
47
- await I.mutateAsync({
48
+ await R.mutateAsync({
48
49
  taskId: e,
49
50
  status: n
50
51
  });
51
52
  } catch (e) {
52
53
  console.error("Failed to update task status:", e), alert("Failed to update task status. Please try again.");
53
54
  }
54
- }, G = async () => {
55
- let e = B ? "CLOCK_OUT" : "CLOCK_IN";
55
+ }, q = async () => {
56
+ let e = H ? "CLOCK_OUT" : "CLOCK_IN";
56
57
  try {
57
- let t = await L.mutateAsync({
58
+ let t = await z.mutateAsync({
58
59
  workerId: m,
59
60
  action: e
60
61
  });
61
62
  if (t.success) {
62
- if (B) V(!1), U(null);
63
+ if (H) U(!1), G(null);
63
64
  else {
64
65
  let e = (/* @__PURE__ */ new Date()).toLocaleTimeString("en-IN", {
65
66
  hour: "2-digit",
66
67
  minute: "2-digit",
67
68
  hour12: !0
68
69
  });
69
- V(!0), U(e);
70
+ U(!0), G(e);
70
71
  }
71
- alert(t.message || `${B ? "Clocked out" : "Clocked in"} successfully`);
72
+ alert(t.message || `${H ? "Clocked out" : "Clocked in"} successfully`);
72
73
  }
73
74
  } catch (e) {
74
75
  console.error("Failed to clock in/out:", e), alert("Action failed. Please try again.");
75
76
  }
76
77
  };
77
- if (T || F) return /* @__PURE__ */ O(n, {
78
+ if (T || L) return /* @__PURE__ */ O(n, {
78
79
  title: "Dashboard",
79
80
  description: "Your work overview for today",
80
81
  children: /* @__PURE__ */ O("div", {
@@ -88,10 +89,11 @@ var N = {
88
89
  })
89
90
  })
90
91
  });
91
- let K = R ? x.find((e) => e.id === R) : null, q = x.filter((e) => e.status !== "completed").sort((e, t) => (N[t.priority] ?? 0) - (N[e.priority] ?? 0)), J = x.filter((e) => e.status === "completed");
92
+ let J = B ? x.find((e) => e.id === B) : null, Y = x.filter((e) => e.status !== "completed").sort((e, t) => (F[t.priority] ?? 0) - (F[e.priority] ?? 0)), X = x.filter((e) => e.status === "completed");
92
93
  return /* @__PURE__ */ O(n, {
93
94
  title: "Dashboard",
94
95
  description: "Manage your tasks and assignments",
96
+ purpose: "Your shift command center — clock in, see today's assigned tasks and earnings, and pick up the next delivery or service job. Start here at the beginning of every shift and check back between jobs.",
95
97
  actions: /* @__PURE__ */ k("button", {
96
98
  type: "button",
97
99
  onClick: () => l("/worker/orders"),
@@ -127,25 +129,25 @@ var N = {
127
129
  }),
128
130
  /* @__PURE__ */ k("button", {
129
131
  type: "button",
130
- onClick: G,
131
- className: t("flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors", B ? "bg-status-error-bg-subtle/10 text-status-error-text border border-status-error-border/30 hover:bg-status-error-bg-subtle/20" : "bg-status-success-bg-subtle/10 text-status-success-text border border-status-success-border/30 hover:bg-status-success-bg-subtle/20"),
132
- children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }), B ? "Clock Out" : "Clock In"]
132
+ onClick: q,
133
+ className: t("flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors", H ? "bg-status-error-bg-subtle/10 text-status-error-text border border-status-error-border/30 hover:bg-status-error-bg-subtle/20" : "bg-status-success-bg-subtle/10 text-status-success-text border border-status-success-border/30 hover:bg-status-success-bg-subtle/20"),
134
+ children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }), H ? "Clock Out" : "Clock In"]
133
135
  })
134
136
  ]
135
137
  })] }),
136
- P && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("div", {
138
+ I && /* @__PURE__ */ k(A, { children: [/* @__PURE__ */ k("div", {
137
139
  className: "flex items-center justify-between mb-3",
138
140
  children: [/* @__PURE__ */ O("h2", {
139
141
  className: "text-base font-semibold text-text-primary",
140
142
  children: "Today's Overview"
141
- }), B && H && /* @__PURE__ */ k("div", {
143
+ }), H && W && /* @__PURE__ */ k("div", {
142
144
  className: "flex items-center gap-2 rounded-lg bg-status-success-bg-subtle/10 border border-status-success-border/20 px-3 py-1.5",
143
145
  children: [/* @__PURE__ */ k("span", {
144
146
  className: "relative flex h-2 w-2",
145
147
  children: [/* @__PURE__ */ O("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-status-success-bg-subtle opacity-75" }), /* @__PURE__ */ O("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-status-success-bg-subtle" })]
146
148
  }), /* @__PURE__ */ k("span", {
147
149
  className: "text-xs font-medium text-status-success-text",
148
- children: ["Working since ", H]
150
+ children: ["Working since ", W]
149
151
  })]
150
152
  })]
151
153
  }), /* @__PURE__ */ k("div", {
@@ -163,7 +165,7 @@ var N = {
163
165
  }),
164
166
  /* @__PURE__ */ O("p", {
165
167
  className: "text-2xl font-bold text-status-success-text",
166
- children: P.tasksCompleted
168
+ children: I.tasksCompleted
167
169
  }),
168
170
  /* @__PURE__ */ O("p", {
169
171
  className: "text-xs text-text-secondary",
@@ -183,7 +185,7 @@ var N = {
183
185
  }),
184
186
  /* @__PURE__ */ O("p", {
185
187
  className: "text-2xl font-bold text-accent-blue",
186
- children: P.tasksInProgress
188
+ children: I.tasksInProgress
187
189
  }),
188
190
  /* @__PURE__ */ O("p", {
189
191
  className: "text-xs text-text-secondary",
@@ -203,7 +205,7 @@ var N = {
203
205
  }),
204
206
  /* @__PURE__ */ O("p", {
205
207
  className: "text-2xl font-bold text-status-warning-text",
206
- children: P.tasksPending
208
+ children: I.tasksPending
207
209
  }),
208
210
  /* @__PURE__ */ O("p", {
209
211
  className: "text-xs text-text-secondary",
@@ -223,7 +225,7 @@ var N = {
223
225
  }),
224
226
  /* @__PURE__ */ k("p", {
225
227
  className: "text-2xl font-bold text-accent-purple",
226
- children: [P.hoursWorked, "h"]
228
+ children: [I.hoursWorked, "h"]
227
229
  }),
228
230
  /* @__PURE__ */ O("p", {
229
231
  className: "text-xs text-text-secondary",
@@ -243,7 +245,7 @@ var N = {
243
245
  }),
244
246
  /* @__PURE__ */ k("p", {
245
247
  className: "text-2xl font-bold text-accent-indigo",
246
- children: [P.efficiency, "%"]
248
+ children: [I.efficiency, "%"]
247
249
  }),
248
250
  /* @__PURE__ */ O("p", {
249
251
  className: "text-xs text-text-secondary",
@@ -263,7 +265,7 @@ var N = {
263
265
  }),
264
266
  /* @__PURE__ */ k("p", {
265
267
  className: "text-2xl font-bold text-status-warning-text",
266
- children: [P.rating, "/5"]
268
+ children: [I.rating, "/5"]
267
269
  }),
268
270
  /* @__PURE__ */ O("p", {
269
271
  className: "text-xs text-text-secondary",
@@ -273,7 +275,30 @@ var N = {
273
275
  })
274
276
  ]
275
277
  })] }),
276
- K && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
278
+ /* @__PURE__ */ O(j, {
279
+ storageKey: "adaptercloud-worker-dashboard",
280
+ steps: [
281
+ {
282
+ id: "orders",
283
+ label: "Pick up your next task",
284
+ description: "Browse assigned orders and start the next delivery or service job.",
285
+ onClick: () => l("/worker/orders")
286
+ },
287
+ {
288
+ id: "schedule",
289
+ label: "Check your schedule",
290
+ description: "See upcoming shifts and request changes.",
291
+ onClick: () => l("/worker/schedule")
292
+ },
293
+ {
294
+ id: "profile",
295
+ label: "Keep your profile current",
296
+ description: "Update availability, vehicle, and payout details.",
297
+ onClick: () => l("/worker/profile")
298
+ }
299
+ ]
300
+ }),
301
+ J && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
277
302
  className: "text-base font-semibold text-text-primary mb-3",
278
303
  children: "Current Task"
279
304
  }), /* @__PURE__ */ O("div", {
@@ -284,15 +309,15 @@ var N = {
284
309
  className: "flex items-start gap-3",
285
310
  children: [/* @__PURE__ */ O("div", {
286
311
  className: "flex h-10 w-10 items-center justify-center rounded-lg bg-accent-blue-subtle/10",
287
- children: /* @__PURE__ */ O(M(K.type), { className: "h-5 w-5 text-accent-blue" })
312
+ children: /* @__PURE__ */ O(P(J.type), { className: "h-5 w-5 text-accent-blue" })
288
313
  }), /* @__PURE__ */ k("div", { children: [
289
314
  /* @__PURE__ */ O("h3", {
290
315
  className: "text-lg font-semibold text-text-primary",
291
- children: K.title
316
+ children: J.title
292
317
  }),
293
318
  /* @__PURE__ */ O("p", {
294
319
  className: "text-sm text-text-secondary mt-1",
295
- children: K.description
320
+ children: J.description
296
321
  }),
297
322
  /* @__PURE__ */ k("div", {
298
323
  className: "flex flex-wrap items-center gap-3 mt-2 text-sm text-text-secondary",
@@ -301,21 +326,21 @@ var N = {
301
326
  className: "flex items-center gap-1",
302
327
  children: [
303
328
  /* @__PURE__ */ O(h, { className: "h-3.5 w-3.5" }),
304
- K.estimatedTime,
329
+ J.estimatedTime,
305
330
  " min"
306
331
  ]
307
332
  }),
308
- K.dueTime && /* @__PURE__ */ k("span", {
333
+ J.dueTime && /* @__PURE__ */ k("span", {
309
334
  className: "flex items-center gap-1",
310
335
  children: [
311
336
  /* @__PURE__ */ O(C, { className: "h-3.5 w-3.5" }),
312
337
  "Due: ",
313
- K.dueTime
338
+ J.dueTime
314
339
  ]
315
340
  }),
316
- K.location && /* @__PURE__ */ k("span", {
341
+ J.location && /* @__PURE__ */ k("span", {
317
342
  className: "flex items-center gap-1",
318
- children: [/* @__PURE__ */ O(_, { className: "h-3.5 w-3.5" }), K.location]
343
+ children: [/* @__PURE__ */ O(_, { className: "h-3.5 w-3.5" }), J.location]
319
344
  })
320
345
  ]
321
346
  })
@@ -324,12 +349,12 @@ var N = {
324
349
  className: "flex gap-2 shrink-0",
325
350
  children: [/* @__PURE__ */ k("button", {
326
351
  type: "button",
327
- onClick: () => W(K.id, "complete"),
352
+ onClick: () => K(J.id, "complete"),
328
353
  className: "inline-flex items-center gap-1.5 rounded-md bg-status-success-bg-subtle/10 px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors",
329
354
  children: [/* @__PURE__ */ O(d, { className: "h-4 w-4" }), "Complete"]
330
355
  }), /* @__PURE__ */ k("button", {
331
356
  type: "button",
332
- onClick: () => W(K.id, "pause"),
357
+ onClick: () => K(J.id, "pause"),
333
358
  className: "inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors",
334
359
  children: [/* @__PURE__ */ O(y, { className: "h-4 w-4" }), "Pause"]
335
360
  })]
@@ -341,9 +366,9 @@ var N = {
341
366
  children: "Assigned Tasks"
342
367
  }), /* @__PURE__ */ O("div", {
343
368
  className: "rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden",
344
- children: q.length > 0 ? /* @__PURE__ */ O("div", {
369
+ children: Y.length > 0 ? /* @__PURE__ */ O("div", {
345
370
  className: "divide-y divide-border",
346
- children: q.map((e) => /* @__PURE__ */ O("div", {
371
+ children: Y.map((e) => /* @__PURE__ */ O("div", {
347
372
  className: "p-4 hover:bg-bg-sunken/30 transition-colors",
348
373
  children: /* @__PURE__ */ k("div", {
349
374
  className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
@@ -351,7 +376,7 @@ var N = {
351
376
  className: "flex items-start gap-3 flex-1 min-w-0",
352
377
  children: [/* @__PURE__ */ O("div", {
353
378
  className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-bg-sunken",
354
- children: /* @__PURE__ */ O(M(e.type), { className: "h-4.5 w-4.5 text-text-secondary" })
379
+ children: /* @__PURE__ */ O(P(e.type), { className: "h-4.5 w-4.5 text-text-secondary" })
355
380
  }), /* @__PURE__ */ k("div", {
356
381
  className: "flex-1 min-w-0",
357
382
  children: [
@@ -363,11 +388,11 @@ var N = {
363
388
  children: e.title
364
389
  }),
365
390
  /* @__PURE__ */ O("span", {
366
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", A[e.priority]),
391
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", M[e.priority]),
367
392
  children: e.priority
368
393
  }),
369
394
  /* @__PURE__ */ O("span", {
370
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium", j[e.status]),
395
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium", N[e.status]),
371
396
  children: e.status.replace("_", " ")
372
397
  })
373
398
  ]
@@ -412,14 +437,14 @@ var N = {
412
437
  children: [
413
438
  e.status === "pending" && /* @__PURE__ */ k("button", {
414
439
  type: "button",
415
- onClick: () => W(e.id, "start"),
416
- disabled: R !== null,
417
- className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", R === null ? "bg-accent-blue-subtle/10 text-accent-blue hover:bg-accent-blue-subtle/20" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
440
+ onClick: () => K(e.id, "start"),
441
+ disabled: B !== null,
442
+ className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", B === null ? "bg-accent-blue-subtle/10 text-accent-blue hover:bg-accent-blue-subtle/20" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
418
443
  children: [/* @__PURE__ */ O(b, { className: "h-3.5 w-3.5" }), "Start"]
419
444
  }),
420
- e.status === "in_progress" && e.id !== R && /* @__PURE__ */ k("button", {
445
+ e.status === "in_progress" && e.id !== B && /* @__PURE__ */ k("button", {
421
446
  type: "button",
422
- onClick: () => z(e.id),
447
+ onClick: () => V(e.id),
423
448
  className: "inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors",
424
449
  children: [/* @__PURE__ */ O(b, { className: "h-3.5 w-3.5" }), "Resume"]
425
450
  }),
@@ -446,14 +471,14 @@ var N = {
446
471
  children: "Recently Completed"
447
472
  }), /* @__PURE__ */ O("div", {
448
473
  className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
449
- children: J.length > 0 ? /* @__PURE__ */ O("div", {
474
+ children: X.length > 0 ? /* @__PURE__ */ O("div", {
450
475
  className: "space-y-3",
451
- children: J.slice(0, 3).map((e) => /* @__PURE__ */ k("div", {
476
+ children: X.slice(0, 3).map((e) => /* @__PURE__ */ k("div", {
452
477
  className: "flex items-center gap-3 p-3 rounded-lg bg-status-success-bg-subtle/5 border border-status-success-border/10",
453
478
  children: [
454
479
  /* @__PURE__ */ O("div", {
455
480
  className: "flex h-8 w-8 items-center justify-center rounded-md bg-status-success-bg-subtle/10",
456
- children: /* @__PURE__ */ O(M(e.type), { className: "h-4 w-4 text-status-success-text" })
481
+ children: /* @__PURE__ */ O(P(e.type), { className: "h-4 w-4 text-status-success-text" })
457
482
  }),
458
483
  /* @__PURE__ */ k("div", {
459
484
  className: "flex-1 min-w-0",
@@ -598,28 +623,28 @@ var N = {
598
623
  children: "Total Deliveries"
599
624
  }), /* @__PURE__ */ O("p", {
600
625
  className: "text-lg font-bold text-text-primary",
601
- children: P?.totalDeliveries || 0
626
+ children: I?.totalDeliveries || 0
602
627
  })] }),
603
628
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
604
629
  className: "text-xs text-text-secondary",
605
630
  children: "Total Earnings"
606
631
  }), /* @__PURE__ */ O("p", {
607
632
  className: "text-lg font-bold text-text-primary",
608
- children: s(P?.totalEarnings || 0, { minimumFractionDigits: 0 })
633
+ children: s(I?.totalEarnings || 0, { minimumFractionDigits: 0 })
609
634
  })] }),
610
635
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
611
636
  className: "text-xs text-text-secondary",
612
637
  children: "Average Rating"
613
638
  }), /* @__PURE__ */ k("p", {
614
639
  className: "text-lg font-bold text-text-primary flex items-center gap-1",
615
- children: [P?.averageRating || 0, /* @__PURE__ */ O(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" })]
640
+ children: [I?.averageRating || 0, /* @__PURE__ */ O(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" })]
616
641
  })] }),
617
642
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
618
643
  className: "text-xs text-text-secondary",
619
644
  children: "Completion Rate"
620
645
  }), /* @__PURE__ */ k("p", {
621
646
  className: "text-lg font-bold text-text-primary",
622
- children: [P?.completionRate || 0, "%"]
647
+ children: [I?.completionRate || 0, "%"]
623
648
  })] })
624
649
  ]
625
650
  })]
@@ -629,6 +654,6 @@ var N = {
629
654
  });
630
655
  };
631
656
  //#endregion
632
- export { P as WorkerDashboard };
657
+ export { I as WorkerDashboard };
633
658
 
634
659
  //# sourceMappingURL=WorkerDashboard.js.map