@burdenoff/microfe-atheletebridge 2026.624.1 → 2026.625.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.
- package/dist/atheletebridge/components/EmptyState.js +18 -11
- package/dist/atheletebridge/components/EmptyState.js.map +1 -1
- package/dist/atheletebridge/components/InvestmentCard.js +7 -7
- package/dist/atheletebridge/components/InvestmentCard.js.map +1 -1
- package/dist/atheletebridge/components/MetricsCard.js +20 -14
- package/dist/atheletebridge/components/MetricsCard.js.map +1 -1
- package/dist/atheletebridge/components/PageLayout.js +30 -19
- package/dist/atheletebridge/components/PageLayout.js.map +1 -1
- package/dist/atheletebridge/pages/HomePage.js +218 -207
- package/dist/atheletebridge/pages/HomePage.js.map +1 -1
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js +1 -0
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js +1 -0
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/CartDetailPage.js +1 -0
- package/dist/atheletebridge/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js +1 -0
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js +1 -0
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/FavoritesPage.js +1 -0
- package/dist/atheletebridge/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js +1 -0
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js +1 -0
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js +1 -0
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/ReviewsPage.js +1 -0
- package/dist/atheletebridge/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js +1 -0
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js +1 -0
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js +1 -0
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js +1 -0
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js +1 -0
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js +2 -0
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskDetailsPage.js","names":[],"sources":["../../../../src/atheletebridge/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 atheletebridge/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 { useAthleteBridge } from '../../context/AthleteBridgeContext';\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-red-500/20 text-red-600 dark:text-red-400';\n case 'high':\n return 'bg-orange-500/20 text-orange-600 dark:text-orange-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\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 } = useAthleteBridge();\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 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-subtle 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-yellow-500/10 border border-yellow-500/20 p-3\">\n <div className=\"flex items-center gap-2\">\n <Timer className=\"h-4 w-4 text-yellow-600 dark:text-yellow-400 shrink-0\" />\n <span className=\"text-xs font-medium text-yellow-600 dark:text-yellow-400\">\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-subtle bg-bg-surface p-6\">\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-subtle 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-subtle 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-yellow-500/10 border border-yellow-500/20 p-4\">\n <p className=\"text-sm text-yellow-700 dark:text-yellow-300 flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 shrink-0 mt-0.5 text-yellow-600 dark:text-yellow-400\" />\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-subtle 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-subtle\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Task Notes */}\n <div className=\"rounded-lg border border-border-subtle 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-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-blue-500/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-subtle 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\">{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-green-600 dark:text-green-400\">\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-subtle 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-green-500/10 text-green-600 dark:text-green-400'\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-green-500/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-blue-500/10 px-4 py-3 text-sm font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-500/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-green-500/10 px-4 py-3 text-sm font-medium text-green-600 dark:text-green-400 hover:bg-green-500/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/atheletebridge/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 atheletebridge/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 { useAthleteBridge } from '../../context/AthleteBridgeContext';\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-red-500/20 text-red-600 dark:text-red-400';\n case 'high':\n return 'bg-orange-500/20 text-orange-600 dark:text-orange-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\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 } = useAthleteBridge();\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-subtle 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-yellow-500/10 border border-yellow-500/20 p-3\">\n <div className=\"flex items-center gap-2\">\n <Timer className=\"h-4 w-4 text-yellow-600 dark:text-yellow-400 shrink-0\" />\n <span className=\"text-xs font-medium text-yellow-600 dark:text-yellow-400\">\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-subtle 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-subtle 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-subtle 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-yellow-500/10 border border-yellow-500/20 p-4\">\n <p className=\"text-sm text-yellow-700 dark:text-yellow-300 flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 shrink-0 mt-0.5 text-yellow-600 dark:text-yellow-400\" />\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-subtle 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-subtle\"\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Task Notes */}\n <div className=\"rounded-lg border border-border-subtle 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-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-blue-500/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-subtle 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-green-600 dark:text-green-400\">\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-subtle 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-green-500/10 text-green-600 dark:text-green-400'\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-green-500/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-blue-500/10 px-4 py-3 text-sm font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-500/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-green-500/10 px-4 py-3 text-sm font-medium text-green-600 dark:text-green-400 hover:bg-green-500/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerOrdersPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/worker/WorkerOrdersPage.tsx"],"sourcesContent":["/**\n * Worker Orders Page\n *\n * Full-featured worker orders page with:\n * - Loading state\n * - 6 stat cards (Today's Tasks, Completed, Pending, Avg Time, Earnings, Rating)\n * - Current Task section with timer, items, customer info, special instructions\n * - Filters bar with 4 dropdowns (Status, Type, Priority, Sort By)\n * - Real-time countdown timer\n * - Payment info per task (amount, COD/Paid status)\n * - Task type badges with icons\n * - Distance info per task\n * - Call Customer and Navigate buttons per task\n *\n * @module atheletebridge/pages/worker\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n ClipboardList,\n Package,\n MapPin,\n CheckCircle2,\n PlayCircle,\n ArrowRight,\n Phone,\n Navigation,\n Loader2,\n Truck,\n ChefHat,\n ShoppingBag,\n Star,\n AlertTriangle,\n CreditCard,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface TaskItem {\n name: string;\n quantity: number;\n}\n\ninterface TaskAddress {\n addressLine1: string;\n addressLine2?: string;\n landmark?: string;\n city: string;\n pincode: string;\n}\n\ninterface TaskPayment {\n method: string;\n amount: number;\n status: 'pending' | 'completed';\n}\n\ninterface WorkerTask {\n id: string;\n orderId: string;\n cartId: string;\n cartName: string;\n type: 'pickup' | 'delivery' | 'preparation';\n status: 'pending' | 'in_progress' | 'completed';\n priority: 'low' | 'medium' | 'high' | 'urgent';\n customerName: string;\n customerPhone: string;\n items: TaskItem[];\n address?: TaskAddress;\n estimatedTime: string;\n assignedTime: string;\n distance?: number;\n specialInstructions?: string;\n payment: TaskPayment;\n}\n\ninterface TaskFilters {\n status: string;\n type: string;\n priority: string;\n sortBy: string;\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockTasksData: WorkerTask[] = [\n {\n id: 'task-001',\n orderId: 'ORD-2024-001',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'delivery',\n status: 'pending',\n priority: 'high',\n customerName: 'Rahul Sharma',\n customerPhone: '+91-98765-43210',\n items: [\n { name: 'Masala Dosa', quantity: 2 },\n { name: 'Filter Coffee', quantity: 2 },\n ],\n address: {\n addressLine1: '123, MG Road',\n addressLine2: 'Near Central Mall',\n landmark: 'Opposite SBI Bank',\n city: 'Bangalore',\n pincode: '560001',\n },\n estimatedTime: new Date(Date.now() + 30 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 5 * 60 * 1000).toISOString(),\n distance: 3.5,\n specialInstructions: 'Please call before delivery',\n payment: { method: 'Cash', amount: 295, status: 'pending' },\n },\n {\n id: 'task-002',\n orderId: 'ORD-2024-002',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'pickup',\n status: 'in_progress',\n priority: 'medium',\n customerName: 'Priya Patel',\n customerPhone: '+91-98765-43211',\n items: [{ name: 'Idli Sambar', quantity: 3 }],\n estimatedTime: new Date(Date.now() + 15 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 10 * 60 * 1000).toISOString(),\n specialInstructions: '',\n payment: { method: 'Online', amount: 198, status: 'completed' },\n },\n {\n id: 'task-003',\n orderId: 'ORD-2024-003',\n cartId: 'cart-002',\n cartName: 'Chaat Corner',\n type: 'preparation',\n status: 'pending',\n priority: 'urgent',\n customerName: 'Amit Kumar',\n customerPhone: '+91-98765-43212',\n items: [\n { name: 'Pani Puri', quantity: 2 },\n { name: 'Bhel Puri', quantity: 1 },\n ],\n estimatedTime: new Date(Date.now() + 20 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 2 * 60 * 1000).toISOString(),\n specialInstructions: 'Extra spicy',\n payment: { method: 'UPI', amount: 150, status: 'completed' },\n },\n {\n id: 'task-004',\n orderId: 'ORD-2024-004',\n cartId: 'cart-003',\n cartName: 'Biryani Pot',\n type: 'delivery',\n status: 'completed',\n priority: 'medium',\n customerName: 'Deepa Nair',\n customerPhone: '+91-98765-43213',\n items: [\n { name: 'Chicken Biryani', quantity: 1 },\n { name: 'Raita', quantity: 1 },\n ],\n address: {\n addressLine1: '456, Brigade Road',\n city: 'Bangalore',\n pincode: '560025',\n },\n estimatedTime: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 90 * 60 * 1000).toISOString(),\n distance: 2.1,\n payment: { method: 'Online', amount: 340, status: 'completed' },\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatTimeRemaining(estimatedTime: string): string {\n const now = new Date();\n const target = new Date(estimatedTime);\n const diffInMinutes = Math.floor((target.getTime() - now.getTime()) / (1000 * 60));\n if (diffInMinutes < 0) return 'Overdue';\n if (diffInMinutes < 60) return `${diffInMinutes} min`;\n return `${Math.floor(diffInMinutes / 60)}h ${diffInMinutes % 60}m`;\n}\n\nfunction getTaskTypeConfig(type: WorkerTask['type']) {\n switch (type) {\n case 'delivery':\n return {\n icon: Truck,\n label: 'Delivery',\n style: 'bg-purple-500/20 text-purple-600 dark:text-purple-400',\n };\n case 'pickup':\n return {\n icon: ShoppingBag,\n label: 'Pickup',\n style: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n };\n case 'preparation':\n return {\n icon: ChefHat,\n label: 'Preparation',\n style: 'bg-green-500/20 text-green-600 dark:text-green-400',\n };\n default:\n return { icon: Package, label: type, style: 'bg-secondary text-secondary-foreground' };\n }\n}\n\nfunction getPriorityStyle(priority: WorkerTask['priority']): string {\n switch (priority) {\n case 'urgent':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n case 'high':\n return 'bg-orange-500/20 text-orange-600 dark:text-orange-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerOrdersPage = () => {\n const { navigateTo } = useAthleteBridge();\n const [loading, setLoading] = useState(true);\n const [tasks, setTasks] = useState<WorkerTask[]>([]);\n const [currentTask, setCurrentTask] = useState<WorkerTask | null>(null);\n const [filters, setFilters] = useState<TaskFilters>({\n status: '',\n type: '',\n priority: '',\n sortBy: 'priority',\n });\n const [stats, setStats] = useState({\n totalTasks: 0,\n completedToday: 0,\n pendingTasks: 0,\n averageTime: 0,\n earnings: 0,\n rating: 4.8,\n });\n const [, setTick] = useState(0);\n\n // Refresh timer display\n useEffect(() => {\n const interval = setInterval(() => setTick((t) => t + 1), 60000);\n return () => clearInterval(interval);\n }, []);\n\n const loadTasks = useCallback(() => {\n setLoading(true);\n setTimeout(() => {\n let filtered = [...mockTasksData];\n\n if (filters.status) {\n filtered = filtered.filter((t) => t.status === filters.status);\n }\n if (filters.type) {\n filtered = filtered.filter((t) => t.type === filters.type);\n }\n if (filters.priority) {\n filtered = filtered.filter((t) => t.priority === filters.priority);\n }\n\n const priorityWeight: Record<string, number> = { urgent: 0, high: 1, medium: 2, low: 3 };\n switch (filters.sortBy) {\n case 'priority':\n filtered.sort(\n (a, b) => (priorityWeight[a.priority] ?? 4) - (priorityWeight[b.priority] ?? 4)\n );\n break;\n case 'time':\n filtered.sort(\n (a, b) => new Date(a.estimatedTime).getTime() - new Date(b.estimatedTime).getTime()\n );\n break;\n case 'distance':\n filtered.sort((a, b) => (a.distance ?? 999) - (b.distance ?? 999));\n break;\n }\n\n setTasks(filtered);\n const inProgress = mockTasksData.find((t) => t.status === 'in_progress');\n setCurrentTask(inProgress ?? null);\n\n setStats({\n totalTasks: 45,\n completedToday: 12,\n pendingTasks: 3,\n averageTime: 22,\n earnings: 2450,\n rating: 4.8,\n });\n\n setLoading(false);\n }, 600);\n }, [filters]);\n\n useEffect(() => {\n loadTasks();\n }, [loadTasks]);\n\n const handleFilterChange = (key: keyof TaskFilters, value: string) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const handleStartTask = (taskId: string) => {\n const task = mockTasksData.find((t) => t.id === taskId);\n if (!task) return;\n task.status = 'in_progress';\n setCurrentTask(task);\n loadTasks();\n };\n\n const handleCompleteTask = (taskId: string) => {\n const task = mockTasksData.find((t) => t.id === taskId);\n if (task) task.status = 'completed';\n setCurrentTask(null);\n loadTasks();\n alert('Task completed successfully');\n };\n\n const handleCallCustomer = (phone: string) => {\n window.location.href = `tel:${phone.replace(/\\s/g, '')}`;\n };\n\n const handleNavigateToCustomer = (task: WorkerTask) => {\n if (task.address) {\n const addr = encodeURIComponent(`${task.address.addressLine1}, ${task.address.city}`);\n window.open(`https://maps.google.com?q=${addr}`, '_blank');\n }\n };\n\n if (loading) {\n return (\n <PageLayout title=\"My Orders\" description=\"Manage your assigned orders\">\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 tasks...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Orders\" description=\"Manage your assigned orders\">\n <div className=\"space-y-6\">\n {/* Stats Overview */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Today's Tasks</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalTasks}</p>\n </div>\n <div className=\"rounded-lg border border-green-500/20 bg-green-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-green-600 dark:text-green-400\">Completed</p>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {stats.completedToday}\n </p>\n </div>\n <div className=\"rounded-lg border border-yellow-500/20 bg-yellow-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-yellow-600 dark:text-yellow-400\">Pending</p>\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {stats.pendingTasks}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Avg Time</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.averageTime} min</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Today's Earnings</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.earnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Rating</p>\n <p className=\"text-2xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n {stats.rating}\n </p>\n </div>\n </div>\n\n {/* Current Task */}\n {currentTask && (\n <div className=\"rounded-lg border-2 border-blue-500/30 bg-blue-500/5 p-5\">\n <h2 className=\"text-base font-semibold text-blue-600 dark:text-blue-400 mb-4\">\n Current Task\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Order #{currentTask.orderId}\n </h3>\n {(() => {\n const cfg = getTaskTypeConfig(currentTask.type);\n const TypeIcon = cfg.icon;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium',\n cfg.style\n )}\n >\n <TypeIcon className=\"h-3 w-3\" />\n {cfg.label}\n </span>\n );\n })()}\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getPriorityStyle(currentTask.priority)\n )}\n >\n {currentTask.priority}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">{currentTask.cartName}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xl font-bold text-blue-600 dark:text-blue-400\">\n {formatTimeRemaining(currentTask.estimatedTime)}\n </p>\n <p className=\"text-xs text-text-secondary\">Time remaining</p>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"border-t border-border-subtle pt-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">Customer</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {currentTask.customerName}\n </p>\n {currentTask.address && (\n <p className=\"text-xs text-text-secondary mt-1\">\n {currentTask.address.addressLine1}, {currentTask.address.city}\n </p>\n )}\n </div>\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">Items</p>\n <div className=\"space-y-0.5\">\n {currentTask.items.map((item, i) => (\n <p key={i} className=\"text-xs text-text-primary\">\n {item.quantity}x {item.name}\n </p>\n ))}\n </div>\n </div>\n </div>\n\n {currentTask.specialInstructions && (\n <div className=\"mt-3 p-3 rounded-md bg-yellow-500/10 border border-yellow-500/20\">\n <p className=\"text-xs font-medium text-yellow-600 dark:text-yellow-400 flex items-center gap-1\">\n <AlertTriangle className=\"h-3 w-3\" />\n Special Instructions:\n </p>\n <p className=\"text-xs text-yellow-700 dark:text-yellow-300 mt-0.5\">\n {currentTask.specialInstructions}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={() => handleCallCustomer(currentTask.customerPhone)}\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 {currentTask.type === 'delivery' && currentTask.address && (\n <button\n type=\"button\"\n onClick={() => handleNavigateToCustomer(currentTask)}\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 )}\n <button\n type=\"button\"\n onClick={() => handleCompleteTask(currentTask.id)}\n className=\"ml-auto inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-2 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete Task\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <select\n value={filters.status}\n onChange={(e) => handleFilterChange('status', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Tasks</option>\n <option value=\"pending\">Pending Tasks</option>\n <option value=\"in_progress\">In Progress</option>\n <option value=\"completed\">Completed</option>\n </select>\n <select\n value={filters.type}\n onChange={(e) => handleFilterChange('type', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Types</option>\n <option value=\"delivery\">Delivery</option>\n <option value=\"pickup\">Pickup</option>\n <option value=\"preparation\">Preparation</option>\n </select>\n <select\n value={filters.priority}\n onChange={(e) => handleFilterChange('priority', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Priorities</option>\n <option value=\"urgent\">Urgent</option>\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n <option value=\"low\">Low</option>\n </select>\n <select\n value={filters.sortBy}\n onChange={(e) => handleFilterChange('sortBy', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"priority\">Sort by Priority</option>\n <option value=\"time\">Sort by Time</option>\n <option value=\"distance\">Sort by Distance</option>\n </select>\n </div>\n </div>\n\n {/* Task List */}\n {tasks.length === 0 ? (\n <EmptyState\n icon={<ClipboardList className=\"h-12 w-12\" />}\n title=\"No tasks available\"\n description=\"Check back later for new tasks\"\n />\n ) : (\n <div className=\"space-y-3\">\n {tasks.map((task) => {\n const typeConfig = getTaskTypeConfig(task.type);\n const TypeIcon = typeConfig.icon;\n return (\n <div\n key={task.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm hover:shadow-md transition-shadow\"\n >\n {/* Task Header */}\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Order #{task.orderId}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium',\n typeConfig.style\n )}\n >\n <TypeIcon className=\"h-3 w-3\" />\n {typeConfig.label}\n </span>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getPriorityStyle(task.priority)\n )}\n >\n {task.priority}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">\n {task.cartName} · {task.customerName}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(task.payment.amount, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n task.payment.status === 'completed'\n ? 'text-green-600 dark:text-green-400'\n : 'text-yellow-600 dark:text-yellow-400'\n )}\n >\n <span className=\"flex items-center gap-1 justify-end\">\n <CreditCard className=\"h-3 w-3\" />\n {task.payment.status === 'completed' ? 'Paid' : 'COD'}\n </span>\n </p>\n </div>\n </div>\n\n {/* Task Body */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3 mb-3 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Items</p>\n <div className=\"text-xs text-text-primary\">\n {task.items.map((item, i) => (\n <span key={i}>\n {item.quantity}x {item.name}\n {i < task.items.length - 1 && ', '}\n </span>\n ))}\n </div>\n </div>\n {task.address && (\n <div>\n <p className=\"text-xs text-text-secondary\">Delivery Address</p>\n <p className=\"text-xs text-text-primary\">{task.address.addressLine1}</p>\n </div>\n )}\n <div>\n <p className=\"text-xs text-text-secondary\">Time</p>\n <p\n className={cn(\n 'text-xs font-medium',\n formatTimeRemaining(task.estimatedTime) === 'Overdue'\n ? 'text-red-600 dark:text-red-400'\n : 'text-text-primary'\n )}\n >\n {formatTimeRemaining(task.estimatedTime)}\n </p>\n </div>\n </div>\n\n {/* Task Footer */}\n {task.status === 'pending' && (\n <div className=\"flex items-center flex-wrap gap-2 border-t border-border-subtle pt-3\">\n <button\n type=\"button\"\n onClick={() => handleStartTask(task.id)}\n disabled={currentTask !== null}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors',\n currentTask !== null\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-blue-500/10 text-blue-600 dark:text-blue-400 hover:bg-blue-500/20'\n )}\n >\n <PlayCircle className=\"h-3.5 w-3.5\" />\n {currentTask ? 'Complete current first' : 'Start Task'}\n </button>\n <button\n type=\"button\"\n onClick={() => handleCallCustomer(task.customerPhone)}\n 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\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Call\n </button>\n {task.type === 'delivery' && task.distance != null && (\n <span className=\"ml-auto text-xs text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {task.distance} km away\n </span>\n )}\n </div>\n )}\n {task.status === 'in_progress' && task.id !== currentTask?.id && (\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <button\n type=\"button\"\n onClick={() => handleCompleteTask(task.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-1.5 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n 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\"\n >\n Details\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n {task.status === 'completed' && (\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <StatusBadge status=\"completed\" />\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n className=\"ml-auto 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 Details\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkerOrdersPage.js","names":[],"sources":["../../../../src/atheletebridge/pages/worker/WorkerOrdersPage.tsx"],"sourcesContent":["/**\n * Worker Orders Page\n *\n * Full-featured worker orders page with:\n * - Loading state\n * - 6 stat cards (Today's Tasks, Completed, Pending, Avg Time, Earnings, Rating)\n * - Current Task section with timer, items, customer info, special instructions\n * - Filters bar with 4 dropdowns (Status, Type, Priority, Sort By)\n * - Real-time countdown timer\n * - Payment info per task (amount, COD/Paid status)\n * - Task type badges with icons\n * - Distance info per task\n * - Call Customer and Navigate buttons per task\n *\n * @module atheletebridge/pages/worker\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n ClipboardList,\n Package,\n MapPin,\n CheckCircle2,\n PlayCircle,\n ArrowRight,\n Phone,\n Navigation,\n Loader2,\n Truck,\n ChefHat,\n ShoppingBag,\n Star,\n AlertTriangle,\n CreditCard,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAthleteBridge } from '../../context/AthleteBridgeContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface TaskItem {\n name: string;\n quantity: number;\n}\n\ninterface TaskAddress {\n addressLine1: string;\n addressLine2?: string;\n landmark?: string;\n city: string;\n pincode: string;\n}\n\ninterface TaskPayment {\n method: string;\n amount: number;\n status: 'pending' | 'completed';\n}\n\ninterface WorkerTask {\n id: string;\n orderId: string;\n cartId: string;\n cartName: string;\n type: 'pickup' | 'delivery' | 'preparation';\n status: 'pending' | 'in_progress' | 'completed';\n priority: 'low' | 'medium' | 'high' | 'urgent';\n customerName: string;\n customerPhone: string;\n items: TaskItem[];\n address?: TaskAddress;\n estimatedTime: string;\n assignedTime: string;\n distance?: number;\n specialInstructions?: string;\n payment: TaskPayment;\n}\n\ninterface TaskFilters {\n status: string;\n type: string;\n priority: string;\n sortBy: string;\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockTasksData: WorkerTask[] = [\n {\n id: 'task-001',\n orderId: 'ORD-2024-001',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'delivery',\n status: 'pending',\n priority: 'high',\n customerName: 'Rahul Sharma',\n customerPhone: '+91-98765-43210',\n items: [\n { name: 'Masala Dosa', quantity: 2 },\n { name: 'Filter Coffee', quantity: 2 },\n ],\n address: {\n addressLine1: '123, MG Road',\n addressLine2: 'Near Central Mall',\n landmark: 'Opposite SBI Bank',\n city: 'Bangalore',\n pincode: '560001',\n },\n estimatedTime: new Date(Date.now() + 30 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 5 * 60 * 1000).toISOString(),\n distance: 3.5,\n specialInstructions: 'Please call before delivery',\n payment: { method: 'Cash', amount: 295, status: 'pending' },\n },\n {\n id: 'task-002',\n orderId: 'ORD-2024-002',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n type: 'pickup',\n status: 'in_progress',\n priority: 'medium',\n customerName: 'Priya Patel',\n customerPhone: '+91-98765-43211',\n items: [{ name: 'Idli Sambar', quantity: 3 }],\n estimatedTime: new Date(Date.now() + 15 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 10 * 60 * 1000).toISOString(),\n specialInstructions: '',\n payment: { method: 'Online', amount: 198, status: 'completed' },\n },\n {\n id: 'task-003',\n orderId: 'ORD-2024-003',\n cartId: 'cart-002',\n cartName: 'Chaat Corner',\n type: 'preparation',\n status: 'pending',\n priority: 'urgent',\n customerName: 'Amit Kumar',\n customerPhone: '+91-98765-43212',\n items: [\n { name: 'Pani Puri', quantity: 2 },\n { name: 'Bhel Puri', quantity: 1 },\n ],\n estimatedTime: new Date(Date.now() + 20 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 2 * 60 * 1000).toISOString(),\n specialInstructions: 'Extra spicy',\n payment: { method: 'UPI', amount: 150, status: 'completed' },\n },\n {\n id: 'task-004',\n orderId: 'ORD-2024-004',\n cartId: 'cart-003',\n cartName: 'Biryani Pot',\n type: 'delivery',\n status: 'completed',\n priority: 'medium',\n customerName: 'Deepa Nair',\n customerPhone: '+91-98765-43213',\n items: [\n { name: 'Chicken Biryani', quantity: 1 },\n { name: 'Raita', quantity: 1 },\n ],\n address: {\n addressLine1: '456, Brigade Road',\n city: 'Bangalore',\n pincode: '560025',\n },\n estimatedTime: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n assignedTime: new Date(Date.now() - 90 * 60 * 1000).toISOString(),\n distance: 2.1,\n payment: { method: 'Online', amount: 340, status: 'completed' },\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatTimeRemaining(estimatedTime: string): string {\n const now = new Date();\n const target = new Date(estimatedTime);\n const diffInMinutes = Math.floor((target.getTime() - now.getTime()) / (1000 * 60));\n if (diffInMinutes < 0) return 'Overdue';\n if (diffInMinutes < 60) return `${diffInMinutes} min`;\n return `${Math.floor(diffInMinutes / 60)}h ${diffInMinutes % 60}m`;\n}\n\nfunction getTaskTypeConfig(type: WorkerTask['type']) {\n switch (type) {\n case 'delivery':\n return {\n icon: Truck,\n label: 'Delivery',\n style: 'bg-purple-500/20 text-purple-600 dark:text-purple-400',\n };\n case 'pickup':\n return {\n icon: ShoppingBag,\n label: 'Pickup',\n style: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n };\n case 'preparation':\n return {\n icon: ChefHat,\n label: 'Preparation',\n style: 'bg-green-500/20 text-green-600 dark:text-green-400',\n };\n default:\n return { icon: Package, label: type, style: 'bg-secondary text-secondary-foreground' };\n }\n}\n\nfunction getPriorityStyle(priority: WorkerTask['priority']): string {\n switch (priority) {\n case 'urgent':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n case 'high':\n return 'bg-orange-500/20 text-orange-600 dark:text-orange-400';\n case 'medium':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'low':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerOrdersPage = () => {\n const { navigateTo } = useAthleteBridge();\n const [loading, setLoading] = useState(true);\n const [tasks, setTasks] = useState<WorkerTask[]>([]);\n const [currentTask, setCurrentTask] = useState<WorkerTask | null>(null);\n const [filters, setFilters] = useState<TaskFilters>({\n status: '',\n type: '',\n priority: '',\n sortBy: 'priority',\n });\n const [stats, setStats] = useState({\n totalTasks: 0,\n completedToday: 0,\n pendingTasks: 0,\n averageTime: 0,\n earnings: 0,\n rating: 4.8,\n });\n const [, setTick] = useState(0);\n\n // Refresh timer display\n useEffect(() => {\n const interval = setInterval(() => setTick((t) => t + 1), 60000);\n return () => clearInterval(interval);\n }, []);\n\n const loadTasks = useCallback(() => {\n setLoading(true);\n setTimeout(() => {\n let filtered = [...mockTasksData];\n\n if (filters.status) {\n filtered = filtered.filter((t) => t.status === filters.status);\n }\n if (filters.type) {\n filtered = filtered.filter((t) => t.type === filters.type);\n }\n if (filters.priority) {\n filtered = filtered.filter((t) => t.priority === filters.priority);\n }\n\n const priorityWeight: Record<string, number> = { urgent: 0, high: 1, medium: 2, low: 3 };\n switch (filters.sortBy) {\n case 'priority':\n filtered.sort(\n (a, b) => (priorityWeight[a.priority] ?? 4) - (priorityWeight[b.priority] ?? 4)\n );\n break;\n case 'time':\n filtered.sort(\n (a, b) => new Date(a.estimatedTime).getTime() - new Date(b.estimatedTime).getTime()\n );\n break;\n case 'distance':\n filtered.sort((a, b) => (a.distance ?? 999) - (b.distance ?? 999));\n break;\n }\n\n setTasks(filtered);\n const inProgress = mockTasksData.find((t) => t.status === 'in_progress');\n setCurrentTask(inProgress ?? null);\n\n setStats({\n totalTasks: 45,\n completedToday: 12,\n pendingTasks: 3,\n averageTime: 22,\n earnings: 2450,\n rating: 4.8,\n });\n\n setLoading(false);\n }, 600);\n }, [filters]);\n\n useEffect(() => {\n loadTasks();\n }, [loadTasks]);\n\n const handleFilterChange = (key: keyof TaskFilters, value: string) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const handleStartTask = (taskId: string) => {\n const task = mockTasksData.find((t) => t.id === taskId);\n if (!task) return;\n task.status = 'in_progress';\n setCurrentTask(task);\n loadTasks();\n };\n\n const handleCompleteTask = (taskId: string) => {\n const task = mockTasksData.find((t) => t.id === taskId);\n if (task) task.status = 'completed';\n setCurrentTask(null);\n loadTasks();\n alert('Task completed successfully');\n };\n\n const handleCallCustomer = (phone: string) => {\n window.location.href = `tel:${phone.replace(/\\s/g, '')}`;\n };\n\n const handleNavigateToCustomer = (task: WorkerTask) => {\n if (task.address) {\n const addr = encodeURIComponent(`${task.address.addressLine1}, ${task.address.city}`);\n window.open(`https://maps.google.com?q=${addr}`, '_blank');\n }\n };\n\n if (loading) {\n return (\n <PageLayout title=\"My Orders\" description=\"Manage your assigned orders\">\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 tasks...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Orders\" description=\"Manage your assigned orders\">\n <div className=\"space-y-6\">\n {/* Stats Overview */}\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Today's Tasks</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalTasks}</p>\n </div>\n <div className=\"rounded-lg border border-green-500/20 bg-green-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-green-600 dark:text-green-400\">Completed</p>\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">\n {stats.completedToday}\n </p>\n </div>\n <div className=\"rounded-lg border border-yellow-500/20 bg-yellow-500/5 p-4 shadow-sm\">\n <p className=\"text-xs text-yellow-600 dark:text-yellow-400\">Pending</p>\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {stats.pendingTasks}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Avg Time</p>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.averageTime} min</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Today's Earnings</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.earnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-xs text-text-secondary\">Rating</p>\n <p className=\"text-2xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n {stats.rating}\n </p>\n </div>\n </div>\n\n {/* Current Task */}\n {currentTask && (\n <div className=\"rounded-lg border-2 border-blue-500/30 bg-blue-500/5 p-5\">\n <h2 className=\"text-base font-semibold text-blue-600 dark:text-blue-400 mb-4\">\n Current Task\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n {/* Header */}\n <div className=\"flex items-center justify-between mb-4\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Order #{currentTask.orderId}\n </h3>\n {(() => {\n const cfg = getTaskTypeConfig(currentTask.type);\n const TypeIcon = cfg.icon;\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium',\n cfg.style\n )}\n >\n <TypeIcon className=\"h-3 w-3\" />\n {cfg.label}\n </span>\n );\n })()}\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getPriorityStyle(currentTask.priority)\n )}\n >\n {currentTask.priority}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">{currentTask.cartName}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xl font-bold text-blue-600 dark:text-blue-400\">\n {formatTimeRemaining(currentTask.estimatedTime)}\n </p>\n <p className=\"text-xs text-text-secondary\">Time remaining</p>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"border-t border-border-subtle pt-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">Customer</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {currentTask.customerName}\n </p>\n {currentTask.address && (\n <p className=\"text-xs text-text-secondary mt-1\">\n {currentTask.address.addressLine1}, {currentTask.address.city}\n </p>\n )}\n </div>\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">Items</p>\n <div className=\"space-y-0.5\">\n {currentTask.items.map((item, i) => (\n <p key={i} className=\"text-xs text-text-primary\">\n {item.quantity}x {item.name}\n </p>\n ))}\n </div>\n </div>\n </div>\n\n {currentTask.specialInstructions && (\n <div className=\"mt-3 p-3 rounded-md bg-yellow-500/10 border border-yellow-500/20\">\n <p className=\"text-xs font-medium text-yellow-600 dark:text-yellow-400 flex items-center gap-1\">\n <AlertTriangle className=\"h-3 w-3\" />\n Special Instructions:\n </p>\n <p className=\"text-xs text-yellow-700 dark:text-yellow-300 mt-0.5\">\n {currentTask.specialInstructions}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={() => handleCallCustomer(currentTask.customerPhone)}\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 {currentTask.type === 'delivery' && currentTask.address && (\n <button\n type=\"button\"\n onClick={() => handleNavigateToCustomer(currentTask)}\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 )}\n <button\n type=\"button\"\n onClick={() => handleCompleteTask(currentTask.id)}\n className=\"ml-auto inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-2 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete Task\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-3\">\n <select\n value={filters.status}\n onChange={(e) => handleFilterChange('status', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Tasks</option>\n <option value=\"pending\">Pending Tasks</option>\n <option value=\"in_progress\">In Progress</option>\n <option value=\"completed\">Completed</option>\n </select>\n <select\n value={filters.type}\n onChange={(e) => handleFilterChange('type', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Types</option>\n <option value=\"delivery\">Delivery</option>\n <option value=\"pickup\">Pickup</option>\n <option value=\"preparation\">Preparation</option>\n </select>\n <select\n value={filters.priority}\n onChange={(e) => handleFilterChange('priority', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"\">All Priorities</option>\n <option value=\"urgent\">Urgent</option>\n <option value=\"high\">High</option>\n <option value=\"medium\">Medium</option>\n <option value=\"low\">Low</option>\n </select>\n <select\n value={filters.sortBy}\n onChange={(e) => handleFilterChange('sortBy', e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n >\n <option value=\"priority\">Sort by Priority</option>\n <option value=\"time\">Sort by Time</option>\n <option value=\"distance\">Sort by Distance</option>\n </select>\n </div>\n </div>\n\n {/* Task List */}\n {tasks.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<ClipboardList className=\"h-12 w-12\" />}\n title=\"No tasks available\"\n description=\"Check back later for new tasks\"\n />\n ) : (\n <div className=\"space-y-3\">\n {tasks.map((task) => {\n const typeConfig = getTaskTypeConfig(task.type);\n const TypeIcon = typeConfig.icon;\n return (\n <div\n key={task.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm hover:shadow-md transition-shadow\"\n >\n {/* Task Header */}\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Order #{task.orderId}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium',\n typeConfig.style\n )}\n >\n <TypeIcon className=\"h-3 w-3\" />\n {typeConfig.label}\n </span>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getPriorityStyle(task.priority)\n )}\n >\n {task.priority}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">\n {task.cartName} · {task.customerName}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(task.payment.amount, { minimumFractionDigits: 0 })}\n </p>\n <p\n className={cn(\n 'text-xs',\n task.payment.status === 'completed'\n ? 'text-green-600 dark:text-green-400'\n : 'text-yellow-600 dark:text-yellow-400'\n )}\n >\n <span className=\"flex items-center gap-1 justify-end\">\n <CreditCard className=\"h-3 w-3\" />\n {task.payment.status === 'completed' ? 'Paid' : 'COD'}\n </span>\n </p>\n </div>\n </div>\n\n {/* Task Body */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3 mb-3 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Items</p>\n <div className=\"text-xs text-text-primary\">\n {task.items.map((item, i) => (\n <span key={i}>\n {item.quantity}x {item.name}\n {i < task.items.length - 1 && ', '}\n </span>\n ))}\n </div>\n </div>\n {task.address && (\n <div>\n <p className=\"text-xs text-text-secondary\">Delivery Address</p>\n <p className=\"text-xs text-text-primary\">{task.address.addressLine1}</p>\n </div>\n )}\n <div>\n <p className=\"text-xs text-text-secondary\">Time</p>\n <p\n className={cn(\n 'text-xs font-medium',\n formatTimeRemaining(task.estimatedTime) === 'Overdue'\n ? 'text-red-600 dark:text-red-400'\n : 'text-text-primary'\n )}\n >\n {formatTimeRemaining(task.estimatedTime)}\n </p>\n </div>\n </div>\n\n {/* Task Footer */}\n {task.status === 'pending' && (\n <div className=\"flex items-center flex-wrap gap-2 border-t border-border-subtle pt-3\">\n <button\n type=\"button\"\n onClick={() => handleStartTask(task.id)}\n disabled={currentTask !== null}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors',\n currentTask !== null\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-blue-500/10 text-blue-600 dark:text-blue-400 hover:bg-blue-500/20'\n )}\n >\n <PlayCircle className=\"h-3.5 w-3.5\" />\n {currentTask ? 'Complete current first' : 'Start Task'}\n </button>\n <button\n type=\"button\"\n onClick={() => handleCallCustomer(task.customerPhone)}\n 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\"\n >\n <Phone className=\"h-3.5 w-3.5\" />\n Call\n </button>\n {task.type === 'delivery' && task.distance != null && (\n <span className=\"ml-auto text-xs text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {task.distance} km away\n </span>\n )}\n </div>\n )}\n {task.status === 'in_progress' && task.id !== currentTask?.id && (\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <button\n type=\"button\"\n onClick={() => handleCompleteTask(task.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-1.5 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Complete\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n 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\"\n >\n Details\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n {task.status === 'completed' && (\n <div className=\"flex items-center gap-2 border-t border-border-subtle pt-3\">\n <StatusBadge status=\"completed\" />\n <button\n type=\"button\"\n onClick={() => navigateTo(`/worker/task/${task.id}`)}\n className=\"ml-auto 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 Details\n <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -340,6 +340,7 @@ var A = () => {
|
|
|
340
340
|
})
|
|
341
341
|
]
|
|
342
342
|
}), L.length === 0 ? /* @__PURE__ */ C(r, {
|
|
343
|
+
illustration: "empty-data",
|
|
343
344
|
icon: /* @__PURE__ */ C(c, { className: "h-12 w-12" }),
|
|
344
345
|
title: "No shifts scheduled",
|
|
345
346
|
description: "No shifts scheduled for this week"
|
|
@@ -428,6 +429,7 @@ var A = () => {
|
|
|
428
429
|
}, e.id))
|
|
429
430
|
})] }),
|
|
430
431
|
N === "requests" && /* @__PURE__ */ C("div", { children: z.length === 0 ? /* @__PURE__ */ C(r, {
|
|
432
|
+
illustration: "empty-notifications",
|
|
431
433
|
icon: /* @__PURE__ */ C(y, { className: "h-12 w-12" }),
|
|
432
434
|
title: "No shift requests",
|
|
433
435
|
description: "No shift requests available"
|