@burdenoff/microfe-subscriberbot 2026.625.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 (91) hide show
  1. package/dist/subscriberbot/pages/HomePage.js +19 -14
  2. package/dist/subscriberbot/pages/HomePage.js.map +1 -1
  3. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +66 -60
  4. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/subscriberbot/pages/admin/AdminDashboard.js +83 -44
  6. package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +38 -32
  8. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +226 -221
  10. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/subscriberbot/pages/admin/AdminProfilePage.js +127 -125
  12. package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/subscriberbot/pages/admin/CartManagementPage.js +267 -262
  16. package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/subscriberbot/pages/admin/UserManagementPage.js +267 -262
  18. package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +46 -41
  20. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +231 -194
  24. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +167 -162
  26. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +128 -126
  28. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +297 -300
  30. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +220 -223
  32. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +250 -245
  34. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/subscriberbot/pages/common/HelpSupportPage.js +94 -96
  36. package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/subscriberbot/pages/common/NotificationCenterPage.js +48 -42
  38. package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/subscriberbot/pages/common/SettingsPage.js +745 -736
  40. package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +353 -321
  42. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/subscriberbot/pages/customer/CartDetailPage.js +258 -225
  44. package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +82 -76
  46. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/subscriberbot/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/subscriberbot/pages/customer/CustomerDashboard.js +416 -381
  50. package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +488 -479
  52. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +521 -512
  54. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/subscriberbot/pages/customer/FavoritesPage.js +57 -51
  56. package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +56 -50
  58. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +65 -60
  60. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +79 -73
  62. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/subscriberbot/pages/customer/ReviewsPage.js +68 -62
  64. package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +60 -54
  66. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +292 -255
  68. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +237 -231
  70. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +60 -54
  72. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/subscriberbot/pages/investor/InvestorDashboard.js +350 -319
  74. package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +106 -100
  76. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +51 -45
  78. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +387 -382
  80. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +320 -282
  82. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/subscriberbot/pages/worker/WorkerDashboard.js +92 -61
  84. package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +82 -77
  86. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +348 -340
  90. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailsPage.js","names":[],"sources":["../../../../src/subscriberbot/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 subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\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/20 text-status-error-text';\n case 'high':\n return 'bg-status-warning-bg/20 text-status-warning-text';\n case 'medium':\n return 'bg-status-warning-bg/20 text-status-warning-text';\n case 'low':\n return 'bg-status-success-bg/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 } = useSubscriberBot();\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 shadow-sm\">\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/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\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">\n Customer Information\n </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\">\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\">\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/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\">\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-seam\"\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\">\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-seam bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-status-info-border/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\">\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\">\n {task.orderId}\n </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\">\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/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/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-status-info-bg/10 px-4 py-3 text-sm font-medium text-status-info-text hover:bg-status-info-bg/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/10 px-4 py-3 text-sm font-medium text-status-success-text hover:bg-status-success-bg/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/subscriberbot/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 subscriberbot/pages/worker\n */\n\nimport { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n ClipboardList,\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 { PagePurpose, NextSteps, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\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/20 text-status-error-text';\n case 'high':\n return 'bg-status-warning-bg/20 text-status-warning-text';\n case 'medium':\n return 'bg-status-warning-bg/20 text-status-warning-text';\n case 'low':\n return 'bg-status-success-bg/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 } = useSubscriberBot();\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 <PagePurpose icon={<ClipboardList className=\"h-4 w-4\" />}>\n Everything you need to complete one assigned task. See what's being asked, where\n to go and who to contact, then work it through its stages — start it when you\n begin, log notes as you go, and mark it complete when you're done. Keeping the\n status current lets the customer and your cart owner track progress in real time.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"subscriberbot-task-details\"\n steps={[\n {\n id: 'start-task',\n label: 'Start this task',\n description: 'Mark it in progress so everyone knows you are on it.',\n icon: <PlayCircle className=\"h-4 w-4\" />,\n onClick: handleStartTask,\n },\n {\n id: 'navigate',\n label: 'Navigate to the location',\n description: 'Get directions to the customer or pickup point.',\n icon: <Navigation className=\"h-4 w-4\" />,\n onClick: handleNavigateToLocation,\n },\n {\n id: 'call-customer',\n label: 'Call the customer',\n description: 'Confirm details or let them know your ETA.',\n icon: <Phone className=\"h-4 w-4\" />,\n onClick: handleCallCustomer,\n },\n {\n id: 'complete-task',\n label: 'Mark it complete',\n description: 'Wrap up and log the task once finished.',\n icon: <CheckCircle2 className=\"h-4 w-4\" />,\n onClick: handleCompleteTask,\n },\n ]}\n />\n\n {/* Task Header Card — the ONE emphasis zone */}\n <EmphasisPanel>\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/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 <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\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">\n Customer Information\n </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\">\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\">\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/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\">\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-seam\"\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\">\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-seam bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-status-info-border/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\">\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\">\n {task.orderId}\n </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\">\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/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/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-status-info-bg/10 px-4 py-3 text-sm font-medium text-status-info-text hover:bg-status-info-bg/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/10 px-4 py-3 text-sm font-medium text-status-success-text hover:bg-status-success-bg/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, PagePurpose as M } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/subscriberbot/pages/worker/WorkerDashboard.tsx
10
- var A = {
11
+ var N = {
11
12
  high: "bg-status-error-bg/20 text-status-error-text",
12
13
  medium: "bg-status-warning-bg/20 text-status-warning-text",
13
14
  low: "bg-status-success-bg/20 text-status-success-text"
14
- }, j = {
15
+ }, P = {
15
16
  pending: "bg-secondary text-secondary-foreground",
16
17
  in_progress: "bg-status-info-bg/20 text-status-info-text",
17
18
  completed: "bg-status-success-bg/20 text-status-success-text"
18
19
  };
19
- function M(e) {
20
+ function F(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 I = {
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
+ }, L = () => {
34
+ let { navigateTo: l, currentUser: f } = e(), x = f?.id || "", { data: T = [], isLoading: L } = o(x), { data: R, isLoading: z } = a(x), B = r(), V = i(), [H, U] = c(null), [W, G] = c(!1), [K, q] = c(null), J = 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", U(e);
38
39
  break;
39
40
  case "complete":
40
- n = "COMPLETED", R === e && z(null);
41
+ n = "COMPLETED", H === e && U(null);
41
42
  break;
42
43
  case "pause":
43
- n = "PENDING", R === e && z(null);
44
+ n = "PENDING", H === e && U(null);
44
45
  break;
45
46
  }
46
47
  try {
47
- await I.mutateAsync({
48
+ await B.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
+ }, Y = async () => {
56
+ let e = W ? "CLOCK_OUT" : "CLOCK_IN";
56
57
  try {
57
- let t = await L.mutateAsync({
58
- workerId: m,
58
+ let t = await V.mutateAsync({
59
+ workerId: x,
59
60
  action: e
60
61
  });
61
62
  if (t.success) {
62
- if (B) V(!1), U(null);
63
+ if (W) G(!1), q(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
+ G(!0), q(e);
70
71
  }
71
- alert(t.message || `${B ? "Clocked out" : "Clocked in"} successfully`);
72
+ alert(t.message || `${W ? "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 (L || z) return /* @__PURE__ */ O(n, {
78
79
  title: "Dashboard",
79
80
  description: "Your work overview for today",
80
81
  children: /* @__PURE__ */ O("div", {
@@ -88,7 +89,7 @@ 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 X = H ? T.find((e) => e.id === H) : null, Z = T.filter((e) => e.status !== "completed").sort((e, t) => (I[t.priority] ?? 0) - (I[e.priority] ?? 0)), Q = T.filter((e) => e.status === "completed");
92
93
  return /* @__PURE__ */ O(n, {
93
94
  title: "Dashboard",
94
95
  description: "Manage your tasks and assignments",
@@ -102,6 +103,36 @@ var N = {
102
103
  children: /* @__PURE__ */ k("div", {
103
104
  className: "space-y-6",
104
105
  children: [
106
+ /* @__PURE__ */ O(M, {
107
+ icon: /* @__PURE__ */ O(m, { className: "h-4 w-4" }),
108
+ children: "Your shift at a glance. Clock in to start earning, see the tasks and orders assigned to you today, and track how many you've completed along with your earnings and rating. Jump to your current task to keep things moving, and check your schedule so you never miss a shift."
109
+ }),
110
+ /* @__PURE__ */ O(j, {
111
+ storageKey: "subscriberbot-worker-dashboard",
112
+ steps: [
113
+ {
114
+ id: "view-orders",
115
+ label: "See your assigned orders",
116
+ description: "Pick up and work through the orders waiting on you.",
117
+ icon: /* @__PURE__ */ O(v, { className: "h-4 w-4" }),
118
+ onClick: () => l("/worker/orders")
119
+ },
120
+ {
121
+ id: "check-schedule",
122
+ label: "Check your schedule",
123
+ description: "Know your upcoming shifts and request changes if needed.",
124
+ icon: /* @__PURE__ */ O(u, { className: "h-4 w-4" }),
125
+ onClick: () => l("/worker/schedule")
126
+ },
127
+ {
128
+ id: "update-profile",
129
+ label: "Keep your profile current",
130
+ description: "Update your availability and contact details.",
131
+ icon: /* @__PURE__ */ O(E, { className: "h-4 w-4" }),
132
+ onClick: () => l("/worker/profile")
133
+ }
134
+ ]
135
+ }),
105
136
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
106
137
  className: "text-base font-semibold text-text-primary mb-3",
107
138
  children: "Quick Actions"
@@ -128,28 +159,28 @@ var N = {
128
159
  }),
129
160
  /* @__PURE__ */ k("button", {
130
161
  type: "button",
131
- onClick: G,
132
- 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/10 text-status-error-text border border-status-error-border/30 hover:bg-status-error-bg/20" : "bg-status-success-bg/10 text-status-success-text border border-status-success-border/30 hover:bg-status-success-bg/20"),
133
- children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }), B ? "Clock Out" : "Clock In"]
162
+ onClick: Y,
163
+ className: t("flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors", W ? "bg-status-error-bg/10 text-status-error-text border border-status-error-border/30 hover:bg-status-error-bg/20" : "bg-status-success-bg/10 text-status-success-text border border-status-success-border/30 hover:bg-status-success-bg/20"),
164
+ children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }), W ? "Clock Out" : "Clock In"]
134
165
  })
135
166
  ]
136
167
  })] }),
137
- P && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("div", {
168
+ R && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("div", {
138
169
  className: "flex items-center justify-between mb-3",
139
170
  children: [/* @__PURE__ */ O("h2", {
140
171
  className: "text-base font-semibold text-text-primary",
141
172
  children: "Today's Overview"
142
- }), B && H && /* @__PURE__ */ k("div", {
173
+ }), W && K && /* @__PURE__ */ k("div", {
143
174
  className: "flex items-center gap-2 rounded-lg bg-status-success-bg/10 border border-status-success-border/20 px-3 py-1.5",
144
175
  children: [/* @__PURE__ */ k("span", {
145
176
  className: "relative flex h-2 w-2",
146
177
  children: [/* @__PURE__ */ O("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-status-success-bg opacity-75" }), /* @__PURE__ */ O("span", { className: "relative inline-flex rounded-full h-2 w-2 bg-status-success-text" })]
147
178
  }), /* @__PURE__ */ k("span", {
148
179
  className: "text-xs font-medium text-status-success-text",
149
- children: ["Working since ", H]
180
+ children: ["Working since ", K]
150
181
  })]
151
182
  })]
152
- }), /* @__PURE__ */ k("div", {
183
+ }), /* @__PURE__ */ k(A, {
153
184
  className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3",
154
185
  children: [
155
186
  /* @__PURE__ */ k("div", {
@@ -164,7 +195,7 @@ var N = {
164
195
  }),
165
196
  /* @__PURE__ */ O("p", {
166
197
  className: "text-2xl font-bold text-status-success-text",
167
- children: P.tasksCompleted
198
+ children: R.tasksCompleted
168
199
  }),
169
200
  /* @__PURE__ */ O("p", {
170
201
  className: "text-xs text-text-secondary",
@@ -184,7 +215,7 @@ var N = {
184
215
  }),
185
216
  /* @__PURE__ */ O("p", {
186
217
  className: "text-2xl font-bold text-status-info-text",
187
- children: P.tasksInProgress
218
+ children: R.tasksInProgress
188
219
  }),
189
220
  /* @__PURE__ */ O("p", {
190
221
  className: "text-xs text-text-secondary",
@@ -204,7 +235,7 @@ var N = {
204
235
  }),
205
236
  /* @__PURE__ */ O("p", {
206
237
  className: "text-2xl font-bold text-status-warning-text",
207
- children: P.tasksPending
238
+ children: R.tasksPending
208
239
  }),
209
240
  /* @__PURE__ */ O("p", {
210
241
  className: "text-xs text-text-secondary",
@@ -224,7 +255,7 @@ var N = {
224
255
  }),
225
256
  /* @__PURE__ */ k("p", {
226
257
  className: "text-2xl font-bold text-accent-purple",
227
- children: [P.hoursWorked, "h"]
258
+ children: [R.hoursWorked, "h"]
228
259
  }),
229
260
  /* @__PURE__ */ O("p", {
230
261
  className: "text-xs text-text-secondary",
@@ -244,7 +275,7 @@ var N = {
244
275
  }),
245
276
  /* @__PURE__ */ k("p", {
246
277
  className: "text-2xl font-bold text-accent-indigo",
247
- children: [P.efficiency, "%"]
278
+ children: [R.efficiency, "%"]
248
279
  }),
249
280
  /* @__PURE__ */ O("p", {
250
281
  className: "text-xs text-text-secondary",
@@ -264,7 +295,7 @@ var N = {
264
295
  }),
265
296
  /* @__PURE__ */ k("p", {
266
297
  className: "text-2xl font-bold text-status-warning-text",
267
- children: [P.rating, "/5"]
298
+ children: [R.rating, "/5"]
268
299
  }),
269
300
  /* @__PURE__ */ O("p", {
270
301
  className: "text-xs text-text-secondary",
@@ -274,7 +305,7 @@ var N = {
274
305
  })
275
306
  ]
276
307
  })] }),
277
- K && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
308
+ X && /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("h2", {
278
309
  className: "text-base font-semibold text-text-primary mb-3",
279
310
  children: "Current Task"
280
311
  }), /* @__PURE__ */ O("div", {
@@ -285,15 +316,15 @@ var N = {
285
316
  className: "flex items-start gap-3",
286
317
  children: [/* @__PURE__ */ O("div", {
287
318
  className: "flex h-10 w-10 items-center justify-center rounded-lg bg-status-info-bg/10",
288
- children: /* @__PURE__ */ O(M(K.type), { className: "h-5 w-5 text-status-info-text" })
319
+ children: /* @__PURE__ */ O(F(X.type), { className: "h-5 w-5 text-status-info-text" })
289
320
  }), /* @__PURE__ */ k("div", { children: [
290
321
  /* @__PURE__ */ O("h3", {
291
322
  className: "text-lg font-semibold text-text-primary",
292
- children: K.title
323
+ children: X.title
293
324
  }),
294
325
  /* @__PURE__ */ O("p", {
295
326
  className: "text-sm text-text-secondary mt-1",
296
- children: K.description
327
+ children: X.description
297
328
  }),
298
329
  /* @__PURE__ */ k("div", {
299
330
  className: "flex flex-wrap items-center gap-3 mt-2 text-sm text-text-secondary",
@@ -302,21 +333,21 @@ var N = {
302
333
  className: "flex items-center gap-1",
303
334
  children: [
304
335
  /* @__PURE__ */ O(h, { className: "h-3.5 w-3.5" }),
305
- K.estimatedTime,
336
+ X.estimatedTime,
306
337
  " min"
307
338
  ]
308
339
  }),
309
- K.dueTime && /* @__PURE__ */ k("span", {
340
+ X.dueTime && /* @__PURE__ */ k("span", {
310
341
  className: "flex items-center gap-1",
311
342
  children: [
312
343
  /* @__PURE__ */ O(C, { className: "h-3.5 w-3.5" }),
313
344
  "Due: ",
314
- K.dueTime
345
+ X.dueTime
315
346
  ]
316
347
  }),
317
- K.location && /* @__PURE__ */ k("span", {
348
+ X.location && /* @__PURE__ */ k("span", {
318
349
  className: "flex items-center gap-1",
319
- children: [/* @__PURE__ */ O(_, { className: "h-3.5 w-3.5" }), K.location]
350
+ children: [/* @__PURE__ */ O(_, { className: "h-3.5 w-3.5" }), X.location]
320
351
  })
321
352
  ]
322
353
  })
@@ -325,12 +356,12 @@ var N = {
325
356
  className: "flex gap-2 shrink-0",
326
357
  children: [/* @__PURE__ */ k("button", {
327
358
  type: "button",
328
- onClick: () => W(K.id, "complete"),
359
+ onClick: () => J(X.id, "complete"),
329
360
  className: "inline-flex items-center gap-1.5 rounded-md bg-status-success-bg/10 px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg/20 transition-colors",
330
361
  children: [/* @__PURE__ */ O(d, { className: "h-4 w-4" }), "Complete"]
331
362
  }), /* @__PURE__ */ k("button", {
332
363
  type: "button",
333
- onClick: () => W(K.id, "pause"),
364
+ onClick: () => J(X.id, "pause"),
334
365
  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",
335
366
  children: [/* @__PURE__ */ O(y, { className: "h-4 w-4" }), "Pause"]
336
367
  })]
@@ -342,9 +373,9 @@ var N = {
342
373
  children: "Assigned Tasks"
343
374
  }), /* @__PURE__ */ O("div", {
344
375
  className: "rounded-lg border border-border-seam bg-bg-surface shadow-sm overflow-hidden",
345
- children: q.length > 0 ? /* @__PURE__ */ O("div", {
376
+ children: Z.length > 0 ? /* @__PURE__ */ O("div", {
346
377
  className: "divide-y divide-border",
347
- children: q.map((e) => /* @__PURE__ */ O("div", {
378
+ children: Z.map((e) => /* @__PURE__ */ O("div", {
348
379
  className: "p-4 hover:bg-bg-sunken/30 transition-colors",
349
380
  children: /* @__PURE__ */ k("div", {
350
381
  className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
@@ -352,7 +383,7 @@ var N = {
352
383
  className: "flex items-start gap-3 flex-1 min-w-0",
353
384
  children: [/* @__PURE__ */ O("div", {
354
385
  className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-bg-sunken",
355
- children: /* @__PURE__ */ O(M(e.type), { className: "h-4.5 w-4.5 text-text-secondary" })
386
+ children: /* @__PURE__ */ O(F(e.type), { className: "h-4.5 w-4.5 text-text-secondary" })
356
387
  }), /* @__PURE__ */ k("div", {
357
388
  className: "flex-1 min-w-0",
358
389
  children: [
@@ -364,11 +395,11 @@ var N = {
364
395
  children: e.title
365
396
  }),
366
397
  /* @__PURE__ */ O("span", {
367
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", A[e.priority]),
398
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", N[e.priority]),
368
399
  children: e.priority
369
400
  }),
370
401
  /* @__PURE__ */ O("span", {
371
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium", j[e.status]),
402
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium", P[e.status]),
372
403
  children: e.status.replace("_", " ")
373
404
  })
374
405
  ]
@@ -413,14 +444,14 @@ var N = {
413
444
  children: [
414
445
  e.status === "pending" && /* @__PURE__ */ k("button", {
415
446
  type: "button",
416
- onClick: () => W(e.id, "start"),
417
- disabled: R !== null,
418
- 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-status-info-bg/10 text-status-info-text hover:bg-status-info-bg/20" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
447
+ onClick: () => J(e.id, "start"),
448
+ disabled: H !== null,
449
+ className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", H === null ? "bg-status-info-bg/10 text-status-info-text hover:bg-status-info-bg/20" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
419
450
  children: [/* @__PURE__ */ O(b, { className: "h-3.5 w-3.5" }), "Start"]
420
451
  }),
421
- e.status === "in_progress" && e.id !== R && /* @__PURE__ */ k("button", {
452
+ e.status === "in_progress" && e.id !== H && /* @__PURE__ */ k("button", {
422
453
  type: "button",
423
- onClick: () => z(e.id),
454
+ onClick: () => U(e.id),
424
455
  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",
425
456
  children: [/* @__PURE__ */ O(b, { className: "h-3.5 w-3.5" }), "Resume"]
426
457
  }),
@@ -447,14 +478,14 @@ var N = {
447
478
  children: "Recently Completed"
448
479
  }), /* @__PURE__ */ O("div", {
449
480
  className: "rounded-lg border border-border-seam bg-bg-surface p-5 shadow-sm",
450
- children: J.length > 0 ? /* @__PURE__ */ O("div", {
481
+ children: Q.length > 0 ? /* @__PURE__ */ O("div", {
451
482
  className: "space-y-3",
452
- children: J.slice(0, 3).map((e) => /* @__PURE__ */ k("div", {
483
+ children: Q.slice(0, 3).map((e) => /* @__PURE__ */ k("div", {
453
484
  className: "flex items-center gap-3 p-3 rounded-lg bg-status-success-bg/5 border border-status-success-border/10",
454
485
  children: [
455
486
  /* @__PURE__ */ O("div", {
456
487
  className: "flex h-8 w-8 items-center justify-center rounded-md bg-status-success-bg/10",
457
- children: /* @__PURE__ */ O(M(e.type), { className: "h-4 w-4 text-status-success-text" })
488
+ children: /* @__PURE__ */ O(F(e.type), { className: "h-4 w-4 text-status-success-text" })
458
489
  }),
459
490
  /* @__PURE__ */ k("div", {
460
491
  className: "flex-1 min-w-0",
@@ -599,28 +630,28 @@ var N = {
599
630
  children: "Total Deliveries"
600
631
  }), /* @__PURE__ */ O("p", {
601
632
  className: "text-lg font-bold text-text-primary",
602
- children: P?.totalDeliveries || 0
633
+ children: R?.totalDeliveries || 0
603
634
  })] }),
604
635
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
605
636
  className: "text-xs text-text-secondary",
606
637
  children: "Total Earnings"
607
638
  }), /* @__PURE__ */ O("p", {
608
639
  className: "text-lg font-bold text-text-primary",
609
- children: s(P?.totalEarnings || 0, { minimumFractionDigits: 0 })
640
+ children: s(R?.totalEarnings || 0, { minimumFractionDigits: 0 })
610
641
  })] }),
611
642
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
612
643
  className: "text-xs text-text-secondary",
613
644
  children: "Average Rating"
614
645
  }), /* @__PURE__ */ k("p", {
615
646
  className: "text-lg font-bold text-text-primary flex items-center gap-1",
616
- children: [P?.averageRating || 0, /* @__PURE__ */ O(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" })]
647
+ children: [R?.averageRating || 0, /* @__PURE__ */ O(S, { className: "h-4 w-4 fill-status-warning-text text-status-warning-text" })]
617
648
  })] }),
618
649
  /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
619
650
  className: "text-xs text-text-secondary",
620
651
  children: "Completion Rate"
621
652
  }), /* @__PURE__ */ k("p", {
622
653
  className: "text-lg font-bold text-text-primary",
623
- children: [P?.completionRate || 0, "%"]
654
+ children: [R?.completionRate || 0, "%"]
624
655
  })] })
625
656
  ]
626
657
  })]
@@ -630,6 +661,6 @@ var N = {
630
661
  });
631
662
  };
632
663
  //#endregion
633
- export { P as WorkerDashboard };
664
+ export { L as WorkerDashboard };
634
665
 
635
666
  //# sourceMappingURL=WorkerDashboard.js.map