@burdenoff/microfe-kadaikodi 2026.704.1 → 2026.704.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/kadaikodi/hooks/useKadaikodiApi.js +77 -26
  2. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  3. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +341 -461
  4. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminDashboard.js +115 -399
  6. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +140 -283
  8. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +282 -453
  10. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminProfilePage.js +115 -242
  12. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +2 -2
  14. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  16. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  17. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +503 -627
  18. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  19. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +339 -282
  20. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  21. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +323 -422
  22. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  23. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +374 -383
  24. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  25. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +249 -208
  26. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  27. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +1 -1
  30. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +171 -627
  32. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  33. package/dist/kadaikodi/pages/common/HelpSupportPage.js +331 -415
  34. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/common/NotificationCenterPage.js +18 -670
  36. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  38. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -2
  39. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +191 -369
  41. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  42. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +233 -389
  43. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  45. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  46. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  47. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +76 -118
  48. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
  49. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  50. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +135 -213
  51. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  52. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +272 -774
  53. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  54. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +232 -343
  55. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  56. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +112 -600
  57. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +127 -294
  59. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +204 -290
  61. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +159 -500
  63. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +399 -487
  65. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  66. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +13 -13
  67. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +192 -296
  69. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  70. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +245 -397
  71. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +85 -117
  73. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  74. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +177 -395
  75. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  76. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerOrdersPage.js","names":[],"sources":["../../../../src/kadaikodi/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 kadaikodi/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 { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\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-accent-purple-subtle text-text-primary',\n };\n case 'pickup':\n return {\n icon: ShoppingBag,\n label: 'Pickup',\n style: 'bg-[var(--color-accent-soft)] text-text-primary',\n };\n case 'preparation':\n return {\n icon: ChefHat,\n label: 'Preparation',\n style: 'bg-status-success-bg-subtle text-status-success-text',\n };\n default:\n return { icon: Package, label: type, style: 'bg-bg-sunken text-text-secondary' };\n }\n}\n\nfunction getPriorityStyle(priority: WorkerTask['priority']): string {\n switch (priority) {\n case 'urgent':\n return 'bg-status-error-bg-subtle text-status-error-text';\n case 'high':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'medium':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'low':\n return 'bg-status-success-bg-subtle text-status-success-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerOrdersPage = () => {\n const { navigateTo } = useKadaikodi();\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 <PagePurpose className=\"mb-6\">\n Your work for the day, task by task. Use this page to see what&apos;s assigned to you, focus on\n your current task, and move jobs from pending to completed — while keeping an eye on your\n hours, earnings and rating. Open any task for full details and customer info so you can get it\n done right.\n </PagePurpose>\n\n <div className=\"space-y-6\">\n {/* Stats Overview — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Today at a Glance</h2>\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-status-success-text/20 bg-status-success-bg-subtle p-4 shadow-sm\">\n <p className=\"text-xs text-status-success-text\">Completed</p>\n <p className=\"text-2xl font-bold text-status-success-text\">{stats.completedToday}</p>\n </div>\n <div className=\"rounded-lg border border-status-warning-text/20 bg-status-warning-bg-subtle p-4 shadow-sm\">\n <p className=\"text-xs text-status-warning-text\">Pending</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">{stats.pendingTasks}</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-status-warning-text text-status-warning-text\" />\n {stats.rating}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Current Task */}\n {currentTask && (\n <div className=\"rounded-lg border-2 border-border-focus/30 bg-[var(--color-accent-soft)] p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Current Task</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-text-primary\">\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-status-warning-bg-subtle border border-status-warning-text/20\">\n <p className=\"text-xs font-medium text-status-warning-text flex items-center gap-1\">\n <AlertTriangle className=\"h-3 w-3\" />\n Special Instructions:\n </p>\n <p className=\"text-xs text-status-warning-text 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-status-success-bg-subtle px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle 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-border-focus/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-border-focus/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-border-focus/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-border-focus/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} &middot; {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-status-success-text'\n : 'text-status-warning-text'\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-status-error-text'\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-[var(--color-accent-soft)] text-text-primary hover:bg-[var(--color-accent-soft)]'\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-status-success-bg-subtle px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle 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/kadaikodi/pages/worker/WorkerOrdersPage.tsx"],"sourcesContent":["/**\n * Worker Orders Page\n *\n * Lists the tasks assigned to the signed-in worker, sourced entirely from the\n * live backend (useWorkerTasks / useWorkerStats). No fabricated tasks, customers,\n * locations or numbers — empty/loading states are honest.\n *\n * - Loading state\n * - Stat cards (Today's Tasks, Completed, Pending, Today's Earnings, Rating) from real stats\n * - Current Task section for the in-progress task\n * - Filters bar (Status, Type, Priority, Sort By) applied client-side to real tasks\n * - Start / Complete actions wired to the updateWorkerTaskStatus mutation\n * - Call Customer and Navigate buttons per task\n *\n * @module kadaikodi/pages/worker\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n ClipboardList,\n MapPin,\n CheckCircle2,\n PlayCircle,\n ArrowRight,\n Phone,\n Navigation,\n Loader2,\n Truck,\n ShoppingBag,\n Package,\n Star,\n AlertTriangle,\n IndianRupee,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useWorkerTasks,\n useWorkerStats,\n useUpdateWorkerTaskStatus,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\nimport type { WorkerTask } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface TaskFilters {\n status: string;\n type: string;\n priority: string;\n sortBy: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatTimeRemaining(dueAt: string): string | null {\n if (!dueAt) return null;\n const target = new Date(dueAt);\n if (Number.isNaN(target.getTime())) return null;\n const diffInMinutes = Math.floor((target.getTime() - Date.now()) / (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-accent-purple-subtle text-text-primary',\n };\n case 'pickup':\n return {\n icon: ShoppingBag,\n label: 'Pickup',\n style: 'bg-[var(--color-accent-soft)] text-text-primary',\n };\n case 'service':\n return {\n icon: Package,\n label: 'Service',\n style: 'bg-status-success-bg-subtle text-status-success-text',\n };\n default:\n return { icon: Package, label: type, style: 'bg-bg-sunken text-text-secondary' };\n }\n}\n\nfunction getPriorityStyle(priority: WorkerTask['priority']): string {\n switch (priority) {\n case 'urgent':\n return 'bg-status-error-bg-subtle text-status-error-text';\n case 'high':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'medium':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'low':\n return 'bg-status-success-bg-subtle text-status-success-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n}\n\nfunction formatAddress(task: WorkerTask): string {\n if (!task.deliveryAddress) return '';\n const a = task.deliveryAddress;\n return [a.street, a.area, a.city, a.pincode].filter(Boolean).join(', ');\n}\n\nconst priorityWeight: Record<string, number> = { urgent: 0, high: 1, medium: 2, low: 3 };\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerOrdersPage = () => {\n const { navigateTo, currentUser } = useKadaikodi();\n const workerId = currentUser?.id ?? '';\n\n const { data: tasks = [], isLoading: isLoadingTasks } = useWorkerTasks(workerId);\n const { data: stats, isLoading: isLoadingStats } = useWorkerStats(workerId);\n const updateTaskStatus = useUpdateWorkerTaskStatus();\n\n const [filters, setFilters] = useState<TaskFilters>({\n status: '',\n type: '',\n priority: '',\n sortBy: 'priority',\n });\n const [, setTick] = useState(0);\n\n // Refresh the relative time display periodically.\n useEffect(() => {\n const interval = setInterval(() => setTick((t) => t + 1), 60000);\n return () => clearInterval(interval);\n }, []);\n\n const currentTask = useMemo(\n () => tasks.find((t) => t.status === 'in_progress') ?? null,\n [tasks]\n );\n\n const filteredTasks = useMemo(() => {\n let list = [...tasks];\n if (filters.status) list = list.filter((t) => t.status === filters.status);\n if (filters.type) list = list.filter((t) => t.type === filters.type);\n if (filters.priority) list = list.filter((t) => t.priority === filters.priority);\n\n switch (filters.sortBy) {\n case 'priority':\n list.sort((a, b) => (priorityWeight[a.priority] ?? 4) - (priorityWeight[b.priority] ?? 4));\n break;\n case 'time':\n list.sort((a, b) => new Date(a.dueAt).getTime() - new Date(b.dueAt).getTime());\n break;\n case 'distance':\n list.sort((a, b) => (a.distance ?? 999) - (b.distance ?? 999));\n break;\n }\n return list;\n }, [tasks, filters]);\n\n const completedCount = useMemo(\n () => tasks.filter((t) => t.status === 'completed').length,\n [tasks]\n );\n const pendingCount = useMemo(() => tasks.filter((t) => t.status === 'pending').length, [tasks]);\n\n const handleFilterChange = (key: keyof TaskFilters, value: string) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const handleStartTask = (taskId: string) => {\n updateTaskStatus.mutate({ taskId, status: 'IN_PROGRESS' });\n };\n\n const handleCompleteTask = (taskId: string) => {\n updateTaskStatus.mutate({ taskId, status: 'COMPLETED' });\n };\n\n const handleCallCustomer = (phone: string) => {\n if (!phone) return;\n window.location.href = `tel:${phone.replace(/\\s/g, '')}`;\n };\n\n const handleNavigateToCustomer = (task: WorkerTask) => {\n const addr = formatAddress(task);\n if (addr) {\n window.open(`https://maps.google.com?q=${encodeURIComponent(addr)}`, '_blank');\n }\n };\n\n if (isLoadingTasks || isLoadingStats) {\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 <PagePurpose className=\"mb-6\">\n Your work for the day, task by task. Use this page to see what&apos;s assigned to you, focus\n on your current task, and move jobs from pending to completed — while keeping an eye on your\n tasks, earnings and rating. Open any task for full details and customer info so you can get\n it done right.\n </PagePurpose>\n\n <div className=\"space-y-6\">\n {/* Stats Overview — the one emphasis zone for this page */}\n <EmphasisPanel>\n <h2 className=\"mb-4 text-base font-semibold text-text-primary\">Today at a Glance</h2>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 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?.todayTasks ?? 0}</p>\n </div>\n <div className=\"rounded-lg border border-status-success-text/20 bg-status-success-bg-subtle p-4 shadow-sm\">\n <p className=\"text-xs text-status-success-text\">Completed</p>\n <p className=\"text-2xl font-bold text-status-success-text\">{completedCount}</p>\n </div>\n <div className=\"rounded-lg border border-status-warning-text/20 bg-status-warning-bg-subtle p-4 shadow-sm\">\n <p className=\"text-xs text-status-warning-text\">Pending</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">{pendingCount}</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?.todayEarnings ?? 0, { 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-status-warning-text text-status-warning-text\" />\n {stats?.averageRating ?? 0}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Current Task */}\n {currentTask && (\n <div className=\"rounded-lg border-2 border-border-focus/30 bg-[var(--color-accent-soft)] p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Current Task</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 {currentTask.orderId ? `Order #${currentTask.orderId}` : currentTask.cartName}\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 {formatTimeRemaining(currentTask.dueAt) && (\n <div className=\"text-right\">\n <p className=\"text-xl font-bold text-text-primary\">\n {formatTimeRemaining(currentTask.dueAt)}\n </p>\n <p className=\"text-xs text-text-secondary\">Time remaining</p>\n </div>\n )}\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 {formatAddress(currentTask) && (\n <p className=\"text-xs text-text-secondary mt-1\">\n {formatAddress(currentTask)}\n </p>\n )}\n </div>\n {currentTask.description && (\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">Task</p>\n <p className=\"text-xs text-text-primary\">{currentTask.description}</p>\n </div>\n )}\n </div>\n\n {currentTask.notes && (\n <div className=\"mt-3 p-3 rounded-md bg-status-warning-bg-subtle border border-status-warning-text/20\">\n <p className=\"text-xs font-medium text-status-warning-text flex items-center gap-1\">\n <AlertTriangle className=\"h-3 w-3\" />\n Notes:\n </p>\n <p className=\"text-xs text-status-warning-text mt-0.5\">{currentTask.notes}</p>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-2 mt-4\">\n {currentTask.customerPhone && (\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 )}\n {currentTask.type === 'delivery' && formatAddress(currentTask) && (\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-status-success-bg-subtle px-3 py-2 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle 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-border-focus/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-border-focus/40\"\n >\n <option value=\"\">All Types</option>\n <option value=\"delivery\">Delivery</option>\n <option value=\"pickup\">Pickup</option>\n <option value=\"service\">Service</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-border-focus/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-border-focus/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 {filteredTasks.length === 0 ? (\n <EmptyState\n icon={<ClipboardList className=\"h-12 w-12\" />}\n title=\"No tasks assigned\"\n description=\"You have no tasks matching this view. New assignments will appear here.\"\n />\n ) : (\n <div className=\"space-y-3\">\n {filteredTasks.map((task) => {\n const typeConfig = getTaskTypeConfig(task.type);\n const TypeIcon = typeConfig.icon;\n const timeRemaining = formatTimeRemaining(task.dueAt);\n const address = formatAddress(task);\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 {task.orderId ? `Order #${task.orderId}` : task.cartName}\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}\n {task.customerName ? ` · ${task.customerName}` : ''}\n </p>\n </div>\n {task.earnings > 0 && (\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-text-primary flex items-center gap-0.5 justify-end\">\n <IndianRupee className=\"h-4 w-4\" />\n {formatCurrency(task.earnings, {\n minimumFractionDigits: 0,\n style: 'decimal',\n })}\n </p>\n <p className=\"text-xs text-text-secondary\">Earnings</p>\n </div>\n )}\n </div>\n\n {/* Task Body */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3 mb-3 text-sm\">\n {task.description && (\n <div>\n <p className=\"text-xs text-text-secondary\">Task</p>\n <p className=\"text-xs text-text-primary line-clamp-2\">{task.description}</p>\n </div>\n )}\n {address && (\n <div>\n <p className=\"text-xs text-text-secondary\">Delivery Address</p>\n <p className=\"text-xs text-text-primary\">{address}</p>\n </div>\n )}\n {timeRemaining && (\n <div>\n <p className=\"text-xs text-text-secondary\">Time</p>\n <p\n className={cn(\n 'text-xs font-medium',\n timeRemaining === 'Overdue'\n ? 'text-status-error-text'\n : 'text-text-primary'\n )}\n >\n {timeRemaining}\n </p>\n </div>\n )}\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-[var(--color-accent-soft)] text-text-primary hover:bg-[var(--color-accent-soft)]'\n )}\n >\n <PlayCircle className=\"h-3.5 w-3.5\" />\n {currentTask ? 'Complete current first' : 'Start Task'}\n </button>\n {task.customerPhone && (\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 )}\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-status-success-bg-subtle px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle 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,9 +1,10 @@
1
1
  import { useKadaikodi as e } from "../../context/KadaikodiContext.js";
2
2
  import { cn as t } from "../../utils/cn.js";
3
3
  import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { useWorkerStats as r } from "../../hooks/useKadaikodiApi.js";
5
- import { useState as i } from "react";
6
- import { Award as a, Bell as o, Briefcase as s, Camera as c, Clock as l, CreditCard as u, Loader2 as d, MapPin as f, Pencil as p, Save as m, Shield as h, User as g, X as _ } from "lucide-react";
4
+ import { EmptyState as r } from "../../components/EmptyState.js";
5
+ import { useWorkerStats as i } from "../../hooks/useKadaikodiApi.js";
6
+ import { useState as a } from "react";
7
+ import { Award as o, Bell as s, Briefcase as c, Camera as l, CreditCard as u, Loader2 as d, MapPin as f, Pencil as p, Save as m, Shield as h, User as g, X as _ } from "lucide-react";
7
8
  import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
8
9
  import { EmphasisPanel as x, PagePurpose as S } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/kadaikodi/pages/worker/WorkerProfilePage.tsx
@@ -16,7 +17,7 @@ var C = [
16
17
  {
17
18
  id: "work",
18
19
  label: "Work Details",
19
- icon: s
20
+ icon: c
20
21
  },
21
22
  {
22
23
  id: "address",
@@ -31,42 +32,42 @@ var C = [
31
32
  {
32
33
  id: "achievements",
33
34
  label: "Achievements",
34
- icon: a
35
+ icon: o
35
36
  },
36
37
  {
37
38
  id: "notifications",
38
39
  label: "Notifications",
39
- icon: o
40
+ icon: s
40
41
  }
41
42
  ], w = () => {
42
- let { navigateTo: o, currentUser: s } = e(), { data: u } = r(s?.id ?? ""), [f, w] = i("personal"), [T, E] = i(!1), [D, O] = i(!1), [k, A] = i({
43
- firstName: s?.firstName ?? s?.name?.split(" ")[0] ?? "",
44
- lastName: s?.lastName ?? s?.name?.split(" ").slice(1).join(" ") ?? "",
45
- email: s?.email ?? "",
46
- phone: s?.phone ?? "",
47
- profileImage: s?.avatar ?? s?.profilePicture ?? "",
48
- dateOfBirth: "1990-05-15",
49
- employeeId: "EMP-2024-001",
50
- designation: "Delivery Executive",
51
- department: "Operations",
52
- workLocation: "Koramangala Zone",
53
- joiningDate: "2023-01-10",
54
- employmentType: "Full Time",
55
- currentAddress: "45, 2nd Main, BTM Layout",
56
- city: "Bangalore",
57
- state: "Karnataka",
58
- pincode: "560076",
43
+ let { navigateTo: s, currentUser: c } = e(), { data: u } = i(c?.id ?? ""), [f, w] = a("personal"), [T, E] = a(!1), [D, O] = a(!1), [k, A] = a({
44
+ firstName: c?.firstName ?? c?.name?.split(" ")[0] ?? "",
45
+ lastName: c?.lastName ?? c?.name?.split(" ").slice(1).join(" ") ?? "",
46
+ email: c?.email ?? "",
47
+ phone: c?.phone ?? "",
48
+ profileImage: c?.avatar ?? c?.profilePicture ?? "",
49
+ dateOfBirth: "",
50
+ employeeId: "",
51
+ designation: "",
52
+ department: "",
53
+ workLocation: "",
54
+ joiningDate: "",
55
+ employmentType: "",
56
+ currentAddress: "",
57
+ city: "",
58
+ state: "",
59
+ pincode: "",
59
60
  permanentAddress: "",
60
61
  sameAsCurrent: !0,
61
- emergencyContactName: "Lakshmi Kumar",
62
- emergencyContactPhone: "+91-98765-12345",
63
- emergencyContactRelation: "Spouse",
64
- bankName: "HDFC Bank",
65
- accountNumber: "****5678",
66
- ifscCode: "HDFC0001234",
67
- panNumber: "ABCDE****F",
68
- aadharNumber: "****5678"
69
- }), [j, M] = i([
62
+ emergencyContactName: "",
63
+ emergencyContactPhone: "",
64
+ emergencyContactRelation: "",
65
+ bankName: "",
66
+ accountNumber: "",
67
+ ifscCode: "",
68
+ panNumber: "",
69
+ aadharNumber: ""
70
+ }), [j, M] = a([
70
71
  {
71
72
  id: "orders",
72
73
  label: "New Order Assignments",
@@ -170,7 +171,7 @@ var C = [
170
171
  })
171
172
  }), T && /* @__PURE__ */ b("label", {
172
173
  className: "absolute bottom-0 right-0 flex h-7 w-7 items-center justify-center rounded-full bg-[var(--color-accent-soft)] text-text-primary cursor-pointer hover:bg-[var(--color-accent-soft)] transition-colors",
173
- children: [/* @__PURE__ */ y(c, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ y("input", {
174
+ children: [/* @__PURE__ */ y(l, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ y("input", {
174
175
  type: "file",
175
176
  accept: "image/*",
176
177
  onChange: F,
@@ -178,19 +179,15 @@ var C = [
178
179
  })]
179
180
  })]
180
181
  }),
181
- /* @__PURE__ */ b("h3", {
182
+ /* @__PURE__ */ y("h3", {
182
183
  className: "mt-3 text-sm font-semibold text-text-primary",
183
- children: [
184
- k.firstName,
185
- " ",
186
- k.lastName
187
- ]
184
+ children: k.firstName || k.lastName ? `${k.firstName} ${k.lastName}`.trim() : "Your profile"
188
185
  }),
189
- /* @__PURE__ */ y("p", {
186
+ k.designation && /* @__PURE__ */ y("p", {
190
187
  className: "text-xs text-text-secondary",
191
188
  children: k.designation
192
189
  }),
193
- /* @__PURE__ */ y("p", {
190
+ k.employeeId && /* @__PURE__ */ y("p", {
194
191
  className: "text-[10px] text-text-secondary mt-0.5",
195
192
  children: k.employeeId
196
193
  })
@@ -329,7 +326,8 @@ var C = [
329
326
  type: "text",
330
327
  value: k.employeeId,
331
328
  disabled: !0,
332
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
329
+ placeholder: "Assigned by Kadaikodi",
330
+ className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary cursor-not-allowed"
333
331
  })] }),
334
332
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
335
333
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -337,8 +335,10 @@ var C = [
337
335
  }), /* @__PURE__ */ y("input", {
338
336
  type: "text",
339
337
  value: k.designation,
340
- disabled: !0,
341
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
338
+ onChange: (e) => N("designation", e.target.value),
339
+ disabled: !T,
340
+ placeholder: "e.g. Delivery Executive",
341
+ 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 disabled:bg-bg-sunken disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-border-focus/40"
342
342
  })] }),
343
343
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
344
344
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -346,8 +346,10 @@ var C = [
346
346
  }), /* @__PURE__ */ y("input", {
347
347
  type: "text",
348
348
  value: k.department,
349
- disabled: !0,
350
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
349
+ onChange: (e) => N("department", e.target.value),
350
+ disabled: !T,
351
+ placeholder: "e.g. Operations",
352
+ 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 disabled:bg-bg-sunken disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-border-focus/40"
351
353
  })] }),
352
354
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
353
355
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -355,8 +357,10 @@ var C = [
355
357
  }), /* @__PURE__ */ y("input", {
356
358
  type: "text",
357
359
  value: k.workLocation,
358
- disabled: !0,
359
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
360
+ onChange: (e) => N("workLocation", e.target.value),
361
+ disabled: !T,
362
+ placeholder: "Your primary work area",
363
+ 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 disabled:bg-bg-sunken disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-border-focus/40"
360
364
  })] }),
361
365
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
362
366
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -373,8 +377,10 @@ var C = [
373
377
  }), /* @__PURE__ */ y("input", {
374
378
  type: "text",
375
379
  value: k.employmentType,
376
- disabled: !0,
377
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
380
+ onChange: (e) => N("employmentType", e.target.value),
381
+ disabled: !T,
382
+ placeholder: "e.g. Full Time",
383
+ 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 disabled:bg-bg-sunken disabled:cursor-not-allowed focus:outline-none focus:ring-2 focus:ring-border-focus/40"
378
384
  })] })
379
385
  ]
380
386
  }),
@@ -521,7 +527,8 @@ var C = [
521
527
  type: "text",
522
528
  value: k.panNumber,
523
529
  disabled: !0,
524
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
530
+ placeholder: "Not on file",
531
+ className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary cursor-not-allowed"
525
532
  })] }),
526
533
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
527
534
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -530,7 +537,8 @@ var C = [
530
537
  type: "text",
531
538
  value: k.aadharNumber,
532
539
  disabled: !0,
533
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
540
+ placeholder: "Not on file",
541
+ className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary cursor-not-allowed"
534
542
  })] }),
535
543
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
536
544
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -549,7 +557,8 @@ var C = [
549
557
  type: "text",
550
558
  value: k.accountNumber,
551
559
  disabled: !0,
552
- className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary cursor-not-allowed"
560
+ placeholder: "Not on file",
561
+ className: "w-full rounded-md border border-border-subtle bg-bg-sunken px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary cursor-not-allowed"
553
562
  })] }),
554
563
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
555
564
  className: "block text-xs font-medium text-text-secondary mb-1",
@@ -570,91 +579,50 @@ var C = [
570
579
  children: "Achievements & Recognition"
571
580
  }),
572
581
  /* @__PURE__ */ b("div", {
573
- className: "grid sm:grid-cols-2 gap-4 mb-7",
574
- children: [/* @__PURE__ */ b("div", {
575
- className: "rounded-lg bg-status-warning-bg-subtle border border-status-warning-text/20 p-5 text-center",
576
- children: [
577
- /* @__PURE__ */ y(a, { className: "h-10 w-10 text-status-warning-text mx-auto mb-2" }),
578
- /* @__PURE__ */ y("h3", {
579
- className: "text-sm font-semibold text-text-primary",
580
- children: "Employee of the Month"
581
- }),
582
- /* @__PURE__ */ y("p", {
583
- className: "text-xs text-text-secondary mt-1",
584
- children: "December 2023"
585
- })
586
- ]
582
+ className: "mb-7",
583
+ children: [/* @__PURE__ */ y("h3", {
584
+ className: "text-sm font-semibold text-text-primary mb-4",
585
+ children: "Performance Metrics"
587
586
  }), /* @__PURE__ */ b("div", {
588
- className: "rounded-lg bg-[var(--color-accent-soft)] border border-border-focus/20 p-5 text-center",
589
- children: [
590
- /* @__PURE__ */ y(l, { className: "h-10 w-10 text-text-primary mx-auto mb-2" }),
591
- /* @__PURE__ */ y("h3", {
592
- className: "text-sm font-semibold text-text-primary",
593
- children: "Perfect Attendance"
594
- }),
595
- /* @__PURE__ */ y("p", {
596
- className: "text-xs text-text-secondary mt-1",
597
- children: "Q3 2023"
598
- })
599
- ]
600
- })]
601
- }),
602
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h3", {
603
- className: "text-sm font-semibold text-text-primary mb-4",
604
- children: "Performance Metrics"
605
- }), /* @__PURE__ */ b("div", {
606
- className: "space-y-4",
607
- children: [
608
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
587
+ className: "space-y-4",
588
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
609
589
  className: "flex justify-between items-center mb-1.5",
610
590
  children: [/* @__PURE__ */ y("span", {
611
591
  className: "text-xs text-text-secondary",
612
- children: "Delivery Success Rate"
613
- }), /* @__PURE__ */ y("span", {
592
+ children: "On-Time Completion Rate"
593
+ }), /* @__PURE__ */ b("span", {
614
594
  className: "text-xs font-medium text-text-primary",
615
- children: "98%"
595
+ children: [u?.completionRate ?? 0, "%"]
616
596
  })]
617
597
  }), /* @__PURE__ */ y("div", {
618
598
  className: "w-full h-2 rounded-full bg-bg-sunken overflow-hidden",
619
599
  children: /* @__PURE__ */ y("div", {
620
600
  className: "h-full rounded-full bg-status-success-text transition-all",
621
- style: { width: "98%" }
601
+ style: { width: `${u?.completionRate ?? 0}%` }
622
602
  })
623
- })] }),
624
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
603
+ })] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
625
604
  className: "flex justify-between items-center mb-1.5",
626
605
  children: [/* @__PURE__ */ y("span", {
627
606
  className: "text-xs text-text-secondary",
628
- children: "Customer Satisfaction"
629
- }), /* @__PURE__ */ y("span", {
607
+ children: "Average Customer Rating"
608
+ }), /* @__PURE__ */ b("span", {
630
609
  className: "text-xs font-medium text-text-primary",
631
- children: "95%"
610
+ children: [u?.averageRating ?? 0, "/5"]
632
611
  })]
633
612
  }), /* @__PURE__ */ y("div", {
634
613
  className: "w-full h-2 rounded-full bg-bg-sunken overflow-hidden",
635
614
  children: /* @__PURE__ */ y("div", {
636
615
  className: "h-full rounded-full bg-action-primary-bg transition-all",
637
- style: { width: "95%" }
638
- })
639
- })] }),
640
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("div", {
641
- className: "flex justify-between items-center mb-1.5",
642
- children: [/* @__PURE__ */ y("span", {
643
- className: "text-xs text-text-secondary",
644
- children: "Punctuality"
645
- }), /* @__PURE__ */ y("span", {
646
- className: "text-xs font-medium text-text-primary",
647
- children: "92%"
648
- })]
649
- }), /* @__PURE__ */ y("div", {
650
- className: "w-full h-2 rounded-full bg-bg-sunken overflow-hidden",
651
- children: /* @__PURE__ */ y("div", {
652
- className: "h-full rounded-full bg-accent-purple transition-all",
653
- style: { width: "92%" }
616
+ style: { width: `${(u?.averageRating ?? 0) / 5 * 100}%` }
654
617
  })
655
- })] })
656
- ]
657
- })] })
618
+ })] })]
619
+ })]
620
+ }),
621
+ /* @__PURE__ */ y(r, {
622
+ icon: /* @__PURE__ */ y(o, { className: "h-12 w-12" }),
623
+ title: "No badges yet",
624
+ description: "Earn recognition as you complete deliveries and hit milestones. Achievement badges are coming soon."
625
+ })
658
626
  ] }),
659
627
  f === "notifications" && /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h2", {
660
628
  className: "text-lg font-semibold text-text-primary mb-5",