@burdenoff/microfe-kadaikodi 2026.704.4 → 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.
- package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
- package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
- package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
- package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
- package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
- package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
- package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
- package/dist/kadaikodi/components/viz/BarChart.js +83 -0
- package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
- package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
- package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
- package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
- package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
- package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
- package/dist/kadaikodi/components/viz/LineChart.js +4 -0
- package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
- package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
- package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
- package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
- package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
- package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
- package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
- package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
- package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
- package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
- package/dist/kadaikodi/components/viz/StatCard.js +60 -0
- package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
- package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
- package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
- package/dist/kadaikodi/components/viz/Timeline.js +66 -0
- package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
- package/dist/kadaikodi/components/viz/index.js +23 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
- package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
- package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
- package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/format.js +21 -0
- package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
- package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
- package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
- package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
- package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +18 -10
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/HomePage.js +373 -631
- package/dist/kadaikodi/pages/HomePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +558 -718
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +142 -55
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +129 -164
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +379 -361
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +266 -166
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
- package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +288 -161
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +17 -34
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +270 -230
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +149 -412
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +176 -175
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +295 -438
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/shared.js +181 -0
- package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +424 -448
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +300 -296
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +284 -309
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- 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, useEffect } 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 {\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\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\n/** Absolute [start, end] Date bounds for the week at `weekOffset` (Sun–Sat). */\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-[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 // 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 [activeTab, setActiveTab] = useState<ScheduleTab>('schedule');\n const [selectedWeek, setSelectedWeek] = useState(0);\n const [availability, setAvailability] = useState<DayAvailability[]>(DEFAULT_AVAILABILITY);\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 setAvailability(\n DEFAULT_AVAILABILITY.map((def) => {\n const saved = meta.availability?.find((d) => d.dayOfWeek === def.dayOfWeek);\n return saved ? { ...def, ...saved } : def;\n })\n );\n }\n }, [workerRecord]);\n\n // Only the shifts that fall inside the currently-selected week.\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 // Hours/shifts/earnings reflect the selected week; \"Next Shift\" is the soonest\n // scheduled shift across the whole roster.\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 = (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 setAvailabilitySaved(false);\n setAvailability((prev) =>\n prev.map((d) => (d.dayOfWeek === dayOfWeek ? { ...d, [field]: value } : d))\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 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=\"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're available — so your cart owner can roster\n you fairly and you always know when (and how much) you'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 {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 Previous / Next Week 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-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(\n day.dayOfWeek,\n 'preferredEndTime',\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>\n ) : (\n <span className=\"text-xs text-text-secondary\">Not available</span>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"mt-5 flex flex-wrap items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleSaveAvailability}\n disabled={updateWorker.isPending}\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 disabled:opacity-50\"\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=\"text-xs text-status-success-text\">\n Availability preferences saved\n </span>\n )}\n </div>\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 </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're available\n — so your cart owner can roster you fairly and you always know when (and how much) you'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
|
+
"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": [
|