@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.
- package/dist/subscriberbot/pages/HomePage.js +19 -14
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +66 -60
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +83 -44
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +38 -32
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +226 -221
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +127 -125
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +235 -230
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +267 -262
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +267 -262
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +46 -41
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +257 -252
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +231 -194
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +167 -162
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +128 -126
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +297 -300
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +220 -223
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +250 -245
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +94 -96
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +48 -42
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +745 -736
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +353 -321
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +258 -225
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +82 -76
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +212 -215
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +416 -381
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +488 -479
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +521 -512
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +57 -51
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +56 -50
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +65 -60
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +79 -73
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +68 -62
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +60 -54
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +292 -255
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +237 -231
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +60 -54
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +350 -319
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +106 -100
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +51 -45
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +387 -382
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +320 -282
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +92 -61
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +82 -77
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +82 -77
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +348 -340
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- 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
|
|
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
|
-
},
|
|
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
|
|
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
|
|
29
|
+
var I = {
|
|
29
30
|
high: 3,
|
|
30
31
|
medium: 2,
|
|
31
32
|
low: 1
|
|
32
|
-
},
|
|
33
|
-
let { navigateTo: l, currentUser: f } = e(),
|
|
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",
|
|
38
|
+
n = "IN_PROGRESS", U(e);
|
|
38
39
|
break;
|
|
39
40
|
case "complete":
|
|
40
|
-
n = "COMPLETED",
|
|
41
|
+
n = "COMPLETED", H === e && U(null);
|
|
41
42
|
break;
|
|
42
43
|
case "pause":
|
|
43
|
-
n = "PENDING",
|
|
44
|
+
n = "PENDING", H === e && U(null);
|
|
44
45
|
break;
|
|
45
46
|
}
|
|
46
47
|
try {
|
|
47
|
-
await
|
|
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
|
-
},
|
|
55
|
-
let e =
|
|
55
|
+
}, Y = async () => {
|
|
56
|
+
let e = W ? "CLOCK_OUT" : "CLOCK_IN";
|
|
56
57
|
try {
|
|
57
|
-
let t = await
|
|
58
|
-
workerId:
|
|
58
|
+
let t = await V.mutateAsync({
|
|
59
|
+
workerId: x,
|
|
59
60
|
action: e
|
|
60
61
|
});
|
|
61
62
|
if (t.success) {
|
|
62
|
-
if (
|
|
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
|
-
|
|
70
|
+
G(!0), q(e);
|
|
70
71
|
}
|
|
71
|
-
alert(t.message || `${
|
|
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 (
|
|
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
|
|
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:
|
|
132
|
-
className: t("flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-colors",
|
|
133
|
-
children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }),
|
|
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
|
-
|
|
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
|
-
}),
|
|
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 ",
|
|
180
|
+
children: ["Working since ", K]
|
|
150
181
|
})]
|
|
151
182
|
})]
|
|
152
|
-
}), /* @__PURE__ */ k(
|
|
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:
|
|
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:
|
|
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:
|
|
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: [
|
|
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: [
|
|
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: [
|
|
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
|
-
|
|
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(
|
|
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:
|
|
323
|
+
children: X.title
|
|
293
324
|
}),
|
|
294
325
|
/* @__PURE__ */ O("p", {
|
|
295
326
|
className: "text-sm text-text-secondary mt-1",
|
|
296
|
-
children:
|
|
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
|
-
|
|
336
|
+
X.estimatedTime,
|
|
306
337
|
" min"
|
|
307
338
|
]
|
|
308
339
|
}),
|
|
309
|
-
|
|
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
|
-
|
|
345
|
+
X.dueTime
|
|
315
346
|
]
|
|
316
347
|
}),
|
|
317
|
-
|
|
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" }),
|
|
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: () =>
|
|
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: () =>
|
|
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:
|
|
376
|
+
children: Z.length > 0 ? /* @__PURE__ */ O("div", {
|
|
346
377
|
className: "divide-y divide-border",
|
|
347
|
-
children:
|
|
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(
|
|
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",
|
|
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",
|
|
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: () =>
|
|
417
|
-
disabled:
|
|
418
|
-
className: t("inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
|
|
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 !==
|
|
452
|
+
e.status === "in_progress" && e.id !== H && /* @__PURE__ */ k("button", {
|
|
422
453
|
type: "button",
|
|
423
|
-
onClick: () =>
|
|
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:
|
|
481
|
+
children: Q.length > 0 ? /* @__PURE__ */ O("div", {
|
|
451
482
|
className: "space-y-3",
|
|
452
|
-
children:
|
|
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(
|
|
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:
|
|
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(
|
|
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: [
|
|
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: [
|
|
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 {
|
|
664
|
+
export { L as WorkerDashboard };
|
|
634
665
|
|
|
635
666
|
//# sourceMappingURL=WorkerDashboard.js.map
|