@burdenoff/microfe-kadaikodi 2026.704.3 → 2026.704.5

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 (145) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +34 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +84 -6
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  65. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  66. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/admin/CartManagementPage.js +564 -729
  68. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  69. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  70. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +201 -120
  72. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  74. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +173 -194
  76. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  77. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  78. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  80. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +428 -347
  82. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +332 -0
  84. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  85. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  86. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  87. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +294 -162
  88. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  90. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  92. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  94. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  95. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  96. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +239 -156
  97. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  98. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  99. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  100. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  101. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  102. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  103. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  104. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +5 -5
  105. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  106. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  107. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  108. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +272 -230
  109. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  110. package/dist/kadaikodi/pages/customer/FavoritesPage.js +150 -413
  111. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  112. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  113. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  114. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +411 -305
  115. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  116. package/dist/kadaikodi/pages/customer/ReviewsPage.js +310 -406
  117. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  119. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  120. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  121. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  122. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  123. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  124. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  125. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  126. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  127. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  128. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  129. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  130. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  131. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  132. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  133. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  134. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  135. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +428 -431
  136. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  137. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  138. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  139. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  140. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  141. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +360 -288
  142. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  143. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +303 -281
  144. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  145. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WorkerSchedulePage.js","names":[],"sources":["../../../../src/kadaikodi/pages/worker/WorkerSchedulePage.tsx"],"sourcesContent":["/**\n * Worker Schedule Page\n *\n * The signed-in worker's shifts, hours and pay, sourced from the live backend\n * (useWorkerSchedules). No fabricated shifts, locations, requests or numbers.\n *\n * - Loading state\n * - 3 tabs: My Schedule, Shift Requests, Availability\n * - Week navigation with Previous/Next buttons and date range display\n * - Shift cards with date, time, cart, status, earnings, tasks completed\n * - Check In / Check Out wired to the worker clock-in/out mutation\n * - Shift Requests tab: honest empty state (no requests backend yet)\n * - Availability tab: local preferences editor (UI-only settings form)\n * - Stats: Hours This Week, Shifts This Week, Week Earnings, Next Shift\n *\n * @module kadaikodi/pages/worker\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Calendar,\n ShoppingCart,\n CheckCircle2,\n PlayCircle,\n ChevronLeft,\n ChevronRight,\n Loader2,\n LogIn,\n LogOut,\n CalendarDays,\n Send,\n Timer,\n Save,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useWorkerSchedules, useWorkerClockInOut } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\nimport type { WorkerSchedule } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype ScheduleTab = 'schedule' | 'requests' | 'availability';\n\ninterface DayAvailability {\n dayOfWeek: string;\n isAvailable: boolean;\n preferredStartTime: string;\n preferredEndTime: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return dateString;\n return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n}\n\nfunction formatTime(time: string): string {\n if (!time) return '';\n const [hours, minutes] = time.split(':');\n const hour = parseInt(hours, 10);\n if (Number.isNaN(hour)) return time;\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const displayHour = hour % 12 || 12;\n return `${displayHour}:${minutes ?? '00'} ${ampm}`;\n}\n\nfunction getWeekDates(weekOffset: number) {\n const today = new Date();\n const currentDay = today.getDay();\n const weekStart = new Date(today);\n weekStart.setDate(today.getDate() - currentDay + weekOffset * 7);\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n return {\n start: weekStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n end: weekEnd.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n };\n}\n\nfunction getShiftStatusStyle(status: WorkerSchedule['status']) {\n switch (status) {\n case 'scheduled':\n return 'bg-[var(--color-accent-soft)] text-text-primary';\n case 'in_progress':\n return 'bg-status-success-bg-subtle text-status-success-text';\n case 'completed':\n return 'bg-bg-sunken text-text-secondary';\n case 'cancelled':\n return 'bg-status-error-bg-subtle text-status-error-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n}\n\nfunction hoursBetween(startTime: string, endTime: string): number {\n if (!startTime || !endTime) return 0;\n const start = new Date(`2024-01-01T${startTime}`);\n const end = new Date(`2024-01-01T${endTime}`);\n if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) return 0;\n return Math.max(0, (end.getTime() - start.getTime()) / (1000 * 60 * 60));\n}\n\nconst DEFAULT_AVAILABILITY: DayAvailability[] = [\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n 'Sunday',\n].map((dayOfWeek) => ({\n dayOfWeek,\n isAvailable: dayOfWeek !== 'Sunday',\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n}));\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerSchedulePage = () => {\n const { currentUser } = useKadaikodi();\n const workerId = currentUser?.id ?? '';\n\n const { data: shifts = [], isLoading } = useWorkerSchedules(workerId);\n const clockInOut = useWorkerClockInOut();\n\n const [activeTab, setActiveTab] = useState<ScheduleTab>('schedule');\n const [selectedWeek, setSelectedWeek] = useState(0);\n const [availability, setAvailability] = useState<DayAvailability[]>(DEFAULT_AVAILABILITY);\n\n // Stats derived entirely from real shift data.\n const weekStats = useMemo(() => {\n const active = shifts.filter((s) => s.status !== 'cancelled');\n const totalHours = active.reduce((sum, s) => sum + hoursBetween(s.startTime, s.endTime), 0);\n const earnings = active.reduce((sum, s) => sum + (s.totalEarnings ?? 0), 0);\n const nextShift = shifts.find((s) => s.status === 'scheduled');\n return {\n hoursThisWeek: Math.round(totalHours * 10) / 10,\n shiftsThisWeek: active.length,\n earningsThisWeek: earnings,\n nextShift,\n };\n }, [shifts]);\n\n const weekDates = getWeekDates(selectedWeek);\n\n const handleCheckIn = (shift: WorkerSchedule) => {\n clockInOut.mutate({ workerId, action: 'CLOCK_IN' });\n void shift;\n };\n\n const handleCheckOut = (shift: WorkerSchedule) => {\n clockInOut.mutate({ workerId, action: 'CLOCK_OUT' });\n void shift;\n };\n\n const updateAvailability = (\n dayOfWeek: string,\n field: keyof DayAvailability,\n value: string | boolean\n ) => {\n setAvailability((prev) =>\n prev.map((d) => (d.dayOfWeek === dayOfWeek ? { ...d, [field]: value } : d))\n );\n };\n\n const handleSaveAvailability = () => {\n alert('Availability preferences saved');\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Schedule\" description=\"Manage your work schedule\">\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 schedule...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"Schedule\" description=\"Manage your work schedule\">\n <PagePurpose className=\"mb-6\">\n Your shifts, hours and pay in one place. Use this page to see your upcoming shifts, check in\n and out, and set the days and hours you&apos;re available — so your cart owner can roster you\n fairly and you always know when (and how much) you&apos;re working. Keep an eye on your\n weekly hours and next shift at the top.\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\">This Week</h2>\n <div className=\"grid grid-cols-2 md:grid-cols-4 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\">Hours This Week</p>\n <p className=\"text-2xl font-bold text-text-primary\">{weekStats.hoursThisWeek}h</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\">Shifts This Week</p>\n <p className=\"text-2xl font-bold text-text-primary\">{weekStats.shiftsThisWeek}</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\">Week Earnings</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(weekStats.earningsThisWeek, { 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\">Next Shift</p>\n <p className=\"text-sm font-bold text-text-primary\">\n {weekStats.nextShift\n ? `${formatDate(weekStats.nextShift.date)} ${formatTime(weekStats.nextShift.startTime)}`\n : 'None scheduled'}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden\">\n <div className=\"flex border-b border-border-subtle\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('schedule')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'schedule'\n ? 'border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <CalendarDays className=\"h-4 w-4\" />\n My Schedule\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('requests')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'requests'\n ? 'border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Send className=\"h-4 w-4\" />\n Shift Requests\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('availability')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'availability'\n ? 'border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]'\n : 'text-text-secondary hover:text-text-primary'\n )}\n >\n <Timer className=\"h-4 w-4\" />\n Availability\n </button>\n </div>\n\n <div className=\"p-5\">\n {/* ============= Schedule Tab ============= */}\n {activeTab === 'schedule' && (\n <div>\n {/* Week Navigation */}\n <div className=\"flex items-center justify-between mb-5\">\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w - 1)}\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 <ChevronLeft className=\"h-3.5 w-3.5\" />\n Previous Week\n </button>\n <h3 className=\"text-sm font-medium text-text-primary\">\n {weekDates.start} - {weekDates.end}\n </h3>\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w + 1)}\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 Next Week\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n {/* Shifts */}\n {shifts.length === 0 ? (\n <EmptyState\n icon={<Calendar className=\"h-12 w-12\" />}\n title=\"No shifts scheduled\"\n description=\"You have no shifts on the roster yet. New shifts will appear here once assigned.\"\n />\n ) : (\n <div className=\"space-y-3\">\n {shifts.map((shift) => (\n <div\n key={shift.id}\n className={cn(\n 'rounded-lg border p-4 transition-colors',\n shift.status === 'in_progress'\n ? 'border-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-border-subtle hover:bg-bg-sunken/30'\n )}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h4 className=\"text-sm font-semibold text-text-primary\">\n {formatDate(shift.date)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getShiftStatusStyle(shift.status)\n )}\n >\n {shift.status === 'in_progress' ? 'Ongoing' : shift.status}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">\n {formatTime(shift.startTime)}\n {shift.endTime ? ` - ${formatTime(shift.endTime)}` : ''}\n </p>\n </div>\n {shift.totalEarnings > 0 && (\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(shift.totalEarnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Cart</p>\n <p className=\"text-xs font-medium text-text-primary flex items-center gap-1\">\n <ShoppingCart className=\"h-3 w-3 text-text-secondary\" />\n {shift.cartName}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Tasks Completed</p>\n <p className=\"text-xs font-medium text-text-primary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3 text-text-secondary\" />\n {shift.tasksCompleted}\n </p>\n </div>\n </div>\n\n {shift.status === 'scheduled' && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={() => handleCheckIn(shift)}\n disabled={clockInOut.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-[var(--color-accent-soft)] px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors disabled:opacity-50\"\n >\n <LogIn className=\"h-3.5 w-3.5\" />\n Check In\n </button>\n </div>\n )}\n\n {shift.status === 'in_progress' && (\n <div className=\"mt-3 pt-3 border-t border-status-success-text/20 flex items-center justify-between\">\n <span className=\"text-xs font-medium text-status-success-text flex items-center gap-1\">\n <PlayCircle className=\"h-3.5 w-3.5\" />\n Shift in progress\n </span>\n <button\n type=\"button\"\n onClick={() => handleCheckOut(shift)}\n disabled={clockInOut.isPending}\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 disabled:opacity-50\"\n >\n <LogOut className=\"h-3.5 w-3.5\" />\n Check Out\n </button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* ============= Shift Requests Tab ============= */}\n {activeTab === 'requests' && (\n <EmptyState\n icon={<Send className=\"h-12 w-12\" />}\n title=\"No shift requests\"\n description=\"Shift swap and time-off requests will appear here. This feature is coming soon.\"\n />\n )}\n\n {/* ============= Availability Tab ============= */}\n {activeTab === 'availability' && (\n <div>\n <p className=\"text-xs text-text-secondary mb-5\">\n Set your preferred working hours for each day of the week\n </p>\n\n <div className=\"space-y-3\">\n {availability.map((day) => (\n <div\n key={day.dayOfWeek}\n className={cn(\n 'flex flex-col sm:flex-row sm:items-center gap-3 p-3 rounded-lg border',\n day.isAvailable\n ? 'border-border-subtle bg-bg-surface'\n : 'border-border-subtle/50 bg-bg-sunken/30'\n )}\n >\n <div className=\"w-32 shrink-0\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={day.isAvailable}\n onChange={(e) =>\n updateAvailability(day.dayOfWeek, 'isAvailable', e.target.checked)\n }\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-border-focus/40\"\n />\n <span className=\"text-sm font-medium text-text-primary\">\n {day.dayOfWeek}\n </span>\n </label>\n </div>\n\n {day.isAvailable ? (\n <div className=\"flex flex-col sm:flex-row gap-3 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary w-10\">From</span>\n <input\n type=\"time\"\n value={day.preferredStartTime}\n onChange={(e) =>\n updateAvailability(\n day.dayOfWeek,\n 'preferredStartTime',\n e.target.value\n )\n }\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-border-focus/40\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary w-10\">To</span>\n <input\n type=\"time\"\n value={day.preferredEndTime}\n onChange={(e) =>\n updateAvailability(day.dayOfWeek, 'preferredEndTime', e.target.value)\n }\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-border-focus/40\"\n />\n </div>\n </div>\n ) : (\n <span className=\"text-xs text-text-secondary\">Not available</span>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"mt-5\">\n <button\n type=\"button\"\n onClick={handleSaveAvailability}\n className=\"inline-flex items-center gap-2 rounded-md bg-[var(--color-accent-soft)] px-4 py-2 text-sm font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors\"\n >\n <Save className=\"h-4 w-4\" />\n Save Availability\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"WorkerSchedulePage.js","names":[],"sources":["../../../../src/kadaikodi/pages/worker/WorkerSchedulePage.tsx"],"sourcesContent":["/**\n * Worker Schedule Page\n *\n * The signed-in worker's shifts, hours and pay, elevated to the\n * kk-worker-03-schedule concept: a week navigator with clean shift cards\n * (date · time · cart · status · tasks · pay) and a weekly Availability editor\n * built from day toggles + a from/to window, persisted to the worker record\n * (useUpdateProviderWorker → metadata.availability).\n *\n * All data is real (useWorkerSchedules / useProviderWorkers). No fabricated\n * shifts, locations or numbers.\n *\n * @module kadaikodi/pages/worker\n */\n\nimport { useState, useMemo, useEffect } from 'react';\nimport {\n Calendar,\n CheckCircle2,\n PlayCircle,\n ChevronLeft,\n ChevronRight,\n Loader2,\n LogIn,\n LogOut,\n Truck,\n Clock,\n Wallet,\n Save,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { StatCard } from '../../components/viz';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport {\n useWorkerSchedules,\n useWorkerClockInOut,\n useProviders,\n useProviderWorkers,\n useUpdateProviderWorker,\n} from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\nimport type { WorkerSchedule } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface DayAvailability {\n dayOfWeek: string;\n isAvailable: boolean;\n preferredStartTime: string;\n preferredEndTime: string;\n}\n\n// Monday-first weekly order, matching the mockup's M T W T F S S row.\nconst WEEK_DAYS = [\n { key: 'Monday', short: 'M' },\n { key: 'Tuesday', short: 'T' },\n { key: 'Wednesday', short: 'W' },\n { key: 'Thursday', short: 'T' },\n { key: 'Friday', short: 'F' },\n { key: 'Saturday', short: 'S' },\n { key: 'Sunday', short: 'S' },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return dateString;\n return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n}\n\nfunction formatTime(time: string): string {\n if (!time) return '';\n const [hours, minutes] = time.split(':');\n const hour = parseInt(hours, 10);\n if (Number.isNaN(hour)) return time;\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const displayHour = hour % 12 || 12;\n return `${displayHour}:${minutes ?? '00'} ${ampm}`;\n}\n\nfunction getWeekDates(weekOffset: number) {\n const today = new Date();\n const currentDay = today.getDay();\n const weekStart = new Date(today);\n weekStart.setDate(today.getDate() - currentDay + weekOffset * 7);\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n return {\n start: weekStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n end: weekEnd.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n };\n}\n\nfunction getWeekRange(weekOffset: number): { start: Date; end: Date } {\n const today = new Date();\n const currentDay = today.getDay();\n const start = new Date(today);\n start.setHours(0, 0, 0, 0);\n start.setDate(today.getDate() - currentDay + weekOffset * 7);\n const end = new Date(start);\n end.setDate(start.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return { start, end };\n}\n\nfunction getShiftStatusStyle(status: WorkerSchedule['status']) {\n switch (status) {\n case 'scheduled':\n return 'bg-status-warning-bg-subtle text-status-warning-text';\n case 'in_progress':\n return 'bg-status-success-bg-subtle text-status-success-text';\n case 'completed':\n return 'bg-status-success-bg-subtle text-status-success-text';\n case 'cancelled':\n return 'bg-status-error-bg-subtle text-status-error-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n}\n\nfunction shiftStatusLabel(status: WorkerSchedule['status']): string {\n if (status === 'in_progress') return 'Ongoing';\n if (status === 'scheduled') return 'Upcoming';\n return status.charAt(0).toUpperCase() + status.slice(1);\n}\n\nfunction hoursBetween(startTime: string, endTime: string): number {\n if (!startTime || !endTime) return 0;\n const start = new Date(`2024-01-01T${startTime}`);\n const end = new Date(`2024-01-01T${endTime}`);\n if (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) return 0;\n return Math.max(0, (end.getTime() - start.getTime()) / (1000 * 60 * 60));\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerSchedulePage = () => {\n const { currentUser } = useKadaikodi();\n const workerId = currentUser?.id ?? '';\n\n const { data: shifts = [], isLoading } = useWorkerSchedules(workerId);\n const clockInOut = useWorkerClockInOut();\n\n // Resolve the signed-in user's ProviderWorker record so availability\n // preferences can be persisted through the real backend.\n const { data: providers = [] } = useProviders();\n const myProvider = useMemo(\n () => providers.find((p) => p.ownerId === currentUser?.id) ?? providers[0],\n [providers, currentUser?.id]\n );\n const { data: workers = [] } = useProviderWorkers(myProvider?.id);\n const workerRecord = useMemo(\n () => workers.find((w) => w.workerId === currentUser?.id) ?? workers[0],\n [workers, currentUser?.id]\n );\n const updateWorker = useUpdateProviderWorker();\n\n const [selectedWeek, setSelectedWeek] = useState(0);\n const [selectedDays, setSelectedDays] = useState<Set<string>>(\n () => new Set(WEEK_DAYS.slice(0, 5).map((d) => d.key))\n );\n const [fromTime, setFromTime] = useState('09:00');\n const [toTime, setToTime] = useState('18:00');\n const [availabilitySaved, setAvailabilitySaved] = useState(false);\n const [saveError, setSaveError] = useState<string | null>(null);\n\n // Seed availability from the resolved worker record's metadata (JSON) if present.\n useEffect(() => {\n const meta = (workerRecord?.metadata ?? {}) as { availability?: DayAvailability[] };\n if (Array.isArray(meta.availability) && meta.availability.length > 0) {\n const available = meta.availability.filter((d) => d.isAvailable);\n setSelectedDays(new Set(available.map((d) => d.dayOfWeek)));\n const first = available[0];\n if (first) {\n if (first.preferredStartTime) setFromTime(first.preferredStartTime);\n if (first.preferredEndTime) setToTime(first.preferredEndTime);\n }\n }\n }, [workerRecord]);\n\n const filteredShifts = useMemo(() => {\n const { start, end } = getWeekRange(selectedWeek);\n return shifts.filter((s) => {\n const d = new Date(s.date);\n if (Number.isNaN(d.getTime())) return false;\n return d >= start && d <= end;\n });\n }, [shifts, selectedWeek]);\n\n const weekStats = useMemo(() => {\n const active = filteredShifts.filter((s) => s.status !== 'cancelled');\n const totalHours = active.reduce((sum, s) => sum + hoursBetween(s.startTime, s.endTime), 0);\n const earnings = active.reduce((sum, s) => sum + (s.totalEarnings ?? 0), 0);\n const nextShift = [...shifts]\n .filter((s) => s.status === 'scheduled')\n .sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime())[0];\n return {\n hoursThisWeek: Math.round(totalHours * 10) / 10,\n shiftsThisWeek: active.length,\n earningsThisWeek: earnings,\n nextShift,\n };\n }, [filteredShifts, shifts]);\n\n const weekDates = getWeekDates(selectedWeek);\n\n const handleCheckIn = () => clockInOut.mutate({ workerId, action: 'CLOCK_IN' });\n const handleCheckOut = () => clockInOut.mutate({ workerId, action: 'CLOCK_OUT' });\n\n const toggleDay = (key: string) => {\n setAvailabilitySaved(false);\n setSelectedDays((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n };\n\n const handleSaveAvailability = () => {\n setSaveError(null);\n setAvailabilitySaved(false);\n if (!workerRecord) {\n setSaveError(\n \"We couldn't find your worker record yet, so availability can't be saved. Please try again once your cart owner has added you as a worker.\"\n );\n return;\n }\n const availability: DayAvailability[] = WEEK_DAYS.map((d) => ({\n dayOfWeek: d.key,\n isAvailable: selectedDays.has(d.key),\n preferredStartTime: fromTime,\n preferredEndTime: toTime,\n }));\n updateWorker.mutate(\n { id: workerRecord.id, metadata: { availability } },\n {\n onSuccess: () => setAvailabilitySaved(true),\n onError: (err) =>\n setSaveError(err instanceof Error ? err.message : 'Failed to save availability.'),\n }\n );\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Schedule\" description=\"Your shifts, hours and pay\">\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 schedule...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Schedule\" description=\"Your shifts, hours and pay in one place\">\n <PagePurpose className=\"mb-6\">\n See your upcoming shifts, check in and out, and set the days and hours you&apos;re available\n — so your cart owner can roster you fairly and you always know when (and how much) you&apos;re\n working.\n </PagePurpose>\n\n <div className=\"space-y-6\">\n {/* This week KPIs */}\n <div className=\"grid grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-4\">\n <StatCard\n label=\"Hours This Week\"\n value={`${weekStats.hoursThisWeek}h`}\n icon={<Clock className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Shifts This Week\"\n value={weekStats.shiftsThisWeek}\n icon={<Calendar className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Week Earnings\"\n value={formatCurrency(weekStats.earningsThisWeek, { minimumFractionDigits: 0 })}\n icon={<Wallet className=\"h-4 w-4\" />}\n />\n <StatCard\n label=\"Next Shift\"\n value={\n <span className=\"text-lg font-semibold\">\n {weekStats.nextShift\n ? formatDate(weekStats.nextShift.date)\n : 'None'}\n </span>\n }\n icon={<Truck className=\"h-4 w-4\" />}\n />\n </div>\n\n {/* Week navigation + shift cards */}\n <GlassCard className=\"p-5\">\n <div className=\"mb-5 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w - 1)}\n className=\"inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-sm font-medium text-accent-primary hover:bg-bg-sunken transition-colors\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Prev\n </button>\n <h3 className=\"text-base font-semibold text-text-primary\">\n {weekDates.start} – {weekDates.end}\n </h3>\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w + 1)}\n className=\"inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-sm font-medium text-accent-primary hover:bg-bg-sunken transition-colors\"\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {filteredShifts.length === 0 ? (\n <EmptyState\n icon={<Calendar className=\"h-12 w-12\" />}\n title=\"No shifts this week\"\n description={\n shifts.length === 0\n ? 'You have no shifts on the roster yet. New shifts will appear here once assigned.'\n : 'No shifts fall in the selected week. Use Prev / Next to browse your roster.'\n }\n />\n ) : (\n <div className=\"space-y-3\">\n {filteredShifts.map((shift) => (\n <div\n key={shift.id}\n className={cn(\n 'rounded-[var(--radius-card)] border p-4 transition-colors',\n shift.status === 'in_progress'\n ? 'border-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-border-subtle bg-bg-surface hover:bg-bg-sunken/40'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h4 className=\"text-sm font-semibold text-text-primary\">\n {formatDate(shift.date)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n getShiftStatusStyle(shift.status)\n )}\n >\n {shiftStatusLabel(shift.status)}\n </span>\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {formatTime(shift.startTime)}\n {shift.endTime ? ` – ${formatTime(shift.endTime)}` : ''}\n </p>\n <p className=\"mt-1.5 flex items-center gap-1.5 text-sm font-medium text-text-primary\">\n <Truck className=\"h-4 w-4 text-accent-primary\" />\n {shift.cartName}\n </p>\n </div>\n {shift.totalEarnings > 0 && (\n <div className=\"text-right shrink-0\">\n <p className=\"text-lg font-bold text-text-primary tabular-nums\">\n {formatCurrency(shift.totalEarnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"mt-3 flex items-center justify-between border-t border-border-subtle pt-3\">\n <span className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {shift.tasksCompleted} tasks\n </span>\n\n {shift.status === 'scheduled' && (\n <button\n type=\"button\"\n onClick={handleCheckIn}\n disabled={clockInOut.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50\"\n >\n <LogIn className=\"h-3.5 w-3.5\" />\n Check In\n </button>\n )}\n {shift.status === 'in_progress' && (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex items-center gap-1 text-xs font-medium text-status-success-text\">\n <PlayCircle className=\"h-3.5 w-3.5\" />\n In progress\n </span>\n <button\n type=\"button\"\n onClick={handleCheckOut}\n disabled={clockInOut.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-md border border-border-default bg-bg-surface px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n <LogOut className=\"h-3.5 w-3.5\" />\n Check Out\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </GlassCard>\n\n {/* Weekly availability editor */}\n <GlassCard treatment=\"insight\" className=\"p-5\">\n <h2 className=\"mb-1 text-base font-semibold text-text-primary\">Availability</h2>\n <p className=\"mb-4 text-xs text-text-secondary\">\n Tap the days you can work, then set your preferred window. Saved to your worker profile.\n </p>\n\n <div className=\"mb-5 flex flex-wrap gap-2 sm:gap-3\">\n {WEEK_DAYS.map((day, i) => {\n const active = selectedDays.has(day.key);\n return (\n <button\n key={`${day.key}-${i}`}\n type=\"button\"\n onClick={() => toggleDay(day.key)}\n aria-pressed={active}\n aria-label={day.key}\n className={cn(\n 'flex h-11 w-11 items-center justify-center rounded-full text-sm font-semibold transition-colors',\n active\n ? 'bg-action-primary-bg text-action-primary-text shadow-sm'\n : 'border border-border-default bg-bg-surface text-text-secondary hover:bg-bg-sunken'\n )}\n >\n {day.short}\n </button>\n );\n })}\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"mb-1 block text-xs font-medium text-text-secondary\">From</label>\n <div className=\"flex items-center gap-2 rounded-md border border-border-subtle bg-bg-surface px-3 py-2\">\n <Clock className=\"h-4 w-4 text-accent-primary shrink-0\" />\n <input\n type=\"time\"\n value={fromTime}\n onChange={(e) => {\n setFromTime(e.target.value);\n setAvailabilitySaved(false);\n }}\n className=\"w-full bg-transparent text-sm text-text-primary focus:outline-none\"\n />\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-xs font-medium text-text-secondary\">To</label>\n <div className=\"flex items-center gap-2 rounded-md border border-border-subtle bg-bg-surface px-3 py-2\">\n <Clock className=\"h-4 w-4 text-accent-primary shrink-0\" />\n <input\n type=\"time\"\n value={toTime}\n onChange={(e) => {\n setToTime(e.target.value);\n setAvailabilitySaved(false);\n }}\n className=\"w-full bg-transparent text-sm text-text-primary focus:outline-none\"\n />\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={handleSaveAvailability}\n disabled={updateWorker.isPending}\n className=\"mt-5 inline-flex w-full items-center justify-center gap-2 rounded-[var(--radius-card)] bg-action-primary-bg px-4 py-3 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50 sm:w-auto sm:px-8\"\n >\n {updateWorker.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"h-4 w-4\" />\n )}\n {updateWorker.isPending ? 'Saving...' : 'Save Availability'}\n </button>\n {availabilitySaved && !updateWorker.isPending && (\n <span className=\"ml-3 text-xs text-status-success-text\">Availability saved</span>\n )}\n {saveError && (\n <div className=\"mt-3 rounded-lg border border-status-error-text/20 bg-status-error-bg-subtle p-3\">\n <p className=\"text-xs text-status-error-text\">{saveError}</p>\n </div>\n )}\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-kadaikodi",
3
- "version": "2026.704.3",
3
+ "version": "2026.704.5",
4
4
  "description": "Burdenoff Kadaikodi Microfrontend - Mobile services marketplace platform for connecting service providers with customers",
5
5
  "type": "module",
6
6
  "files": [