@burdenoff/microfe-kadaikodi 2026.704.2 → 2026.704.4

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 (77) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/hooks/useKadaikodiApi.js +76 -6
  4. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  5. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +45 -107
  6. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  7. package/dist/kadaikodi/pages/admin/AdminDashboard.js +30 -32
  8. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  9. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +137 -120
  10. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  11. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +2 -2
  12. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  13. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  14. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  15. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  16. package/dist/kadaikodi/pages/admin/CartManagementPage.js +278 -283
  17. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  18. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  19. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  20. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +105 -111
  21. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  22. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  23. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  24. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +84 -70
  25. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  26. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  27. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  29. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  30. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +202 -139
  31. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  32. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +232 -0
  33. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  34. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +84 -79
  35. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  36. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  38. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  39. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  41. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  42. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +243 -143
  43. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/CartDetailPage.js +4 -4
  45. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  46. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
  47. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  48. package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -4
  49. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  50. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +6 -6
  51. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  52. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  53. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  54. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +6 -4
  55. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  56. package/dist/kadaikodi/pages/customer/FavoritesPage.js +6 -6
  57. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +4 -4
  59. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  60. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +409 -304
  61. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/customer/ReviewsPage.js +209 -162
  63. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  65. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  66. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  68. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  69. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  70. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +207 -186
  71. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  72. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +340 -272
  74. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  75. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +122 -75
  76. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  77. package/package.json +1 -1
@@ -2,14 +2,14 @@ import { useKadaikodi as e } from "../../context/KadaikodiContext.js";
2
2
  import { cn as t } from "../../utils/cn.js";
3
3
  import { PageLayout as n } from "../../components/PageLayout.js";
4
4
  import { EmptyState as r } from "../../components/EmptyState.js";
5
- import { useWorkerClockInOut as i, useWorkerSchedules as a } from "../../hooks/useKadaikodiApi.js";
6
- import { formatCurrency as o } from "../../utils/formatters.js";
7
- import { useMemo as s, useState as c } from "react";
8
- import { Calendar as l, CalendarDays as u, CheckCircle2 as d, ChevronLeft as f, ChevronRight as p, Loader2 as m, LogIn as h, LogOut as g, PlayCircle as _, Save as v, Send as y, ShoppingCart as b, Timer as x } from "lucide-react";
5
+ import { useProviderWorkers as i, useProviders as a, useUpdateProviderWorker as o, useWorkerClockInOut as ee, useWorkerSchedules as s } from "../../hooks/useKadaikodiApi.js";
6
+ import { formatCurrency as c } from "../../utils/formatters.js";
7
+ import { useEffect as te, useMemo as l, useState as u } from "react";
8
+ import { Calendar as d, CalendarDays as f, CheckCircle2 as p, ChevronLeft as m, ChevronRight as h, Loader2 as g, LogIn as _, LogOut as v, PlayCircle as y, Save as b, Send as x, ShoppingCart as ne, Timer as re } from "lucide-react";
9
9
  import { jsx as S, jsxs as C } from "react/jsx-runtime";
10
- import { EmphasisPanel as w, PagePurpose as T } from "@burdenoff/fe-libs/ui";
10
+ import { EmphasisPanel as w, PagePurpose as ie } from "@burdenoff/fe-libs/ui";
11
11
  //#region src/kadaikodi/pages/worker/WorkerSchedulePage.tsx
12
- function E(e) {
12
+ function T(e) {
13
13
  let t = new Date(e);
14
14
  return Number.isNaN(t.getTime()) ? e : t.toLocaleDateString("en-US", {
15
15
  weekday: "short",
@@ -17,14 +17,14 @@ function E(e) {
17
17
  day: "numeric"
18
18
  });
19
19
  }
20
- function D(e) {
20
+ function E(e) {
21
21
  if (!e) return "";
22
22
  let [t, n] = e.split(":"), r = parseInt(t, 10);
23
23
  if (Number.isNaN(r)) return e;
24
24
  let i = r >= 12 ? "PM" : "AM";
25
25
  return `${r % 12 || 12}:${n ?? "00"} ${i}`;
26
26
  }
27
- function O(e) {
27
+ function D(e) {
28
28
  let t = /* @__PURE__ */ new Date(), n = t.getDay(), r = new Date(t);
29
29
  r.setDate(t.getDate() - n + e * 7);
30
30
  let i = new Date(r);
@@ -40,6 +40,15 @@ function O(e) {
40
40
  })
41
41
  };
42
42
  }
43
+ function O(e) {
44
+ let t = /* @__PURE__ */ new Date(), n = t.getDay(), r = new Date(t);
45
+ r.setHours(0, 0, 0, 0), r.setDate(t.getDate() - n + e * 7);
46
+ let i = new Date(r);
47
+ return i.setDate(r.getDate() + 6), i.setHours(23, 59, 59, 999), {
48
+ start: r,
49
+ end: i
50
+ };
51
+ }
43
52
  function k(e) {
44
53
  switch (e) {
45
54
  case "scheduled": return "bg-[var(--color-accent-soft)] text-text-primary";
@@ -49,12 +58,12 @@ function k(e) {
49
58
  default: return "bg-bg-sunken text-text-secondary";
50
59
  }
51
60
  }
52
- function A(e, t) {
61
+ function ae(e, t) {
53
62
  if (!e || !t) return 0;
54
63
  let n = /* @__PURE__ */ new Date(`2024-01-01T${e}`), r = /* @__PURE__ */ new Date(`2024-01-01T${t}`);
55
64
  return Number.isNaN(n.getTime()) || Number.isNaN(r.getTime()) ? 0 : Math.max(0, (r.getTime() - n.getTime()) / (1e3 * 60 * 60));
56
65
  }
57
- var j = [
66
+ var A = [
58
67
  "Monday",
59
68
  "Tuesday",
60
69
  "Wednesday",
@@ -67,39 +76,56 @@ var j = [
67
76
  isAvailable: e !== "Sunday",
68
77
  preferredStartTime: "09:00",
69
78
  preferredEndTime: "18:00"
70
- })), M = () => {
71
- let { currentUser: M } = e(), N = M?.id ?? "", { data: P = [], isLoading: F } = a(N), I = i(), [L, R] = c("schedule"), [z, B] = c(0), [V, H] = c(j), U = s(() => {
72
- let e = P.filter((e) => e.status !== "cancelled"), t = e.reduce((e, t) => e + A(t.startTime, t.endTime), 0), n = e.reduce((e, t) => e + (t.totalEarnings ?? 0), 0), r = P.find((e) => e.status === "scheduled");
79
+ })), j = () => {
80
+ let { currentUser: j } = e(), M = j?.id ?? "", { data: N = [], isLoading: P } = s(M), F = ee(), { data: I = [] } = a(), { data: L = [] } = i(l(() => I.find((e) => e.ownerId === j?.id) ?? I[0], [I, j?.id])?.id), R = l(() => L.find((e) => e.workerId === j?.id) ?? L[0], [L, j?.id]), z = o(), [B, V] = u("schedule"), [H, U] = u(0), [W, G] = u(A), [K, q] = u(!1), [J, Y] = u(null);
81
+ te(() => {
82
+ let e = R?.metadata ?? {};
83
+ Array.isArray(e.availability) && e.availability.length > 0 && G(A.map((t) => {
84
+ let n = e.availability?.find((e) => e.dayOfWeek === t.dayOfWeek);
85
+ return n ? {
86
+ ...t,
87
+ ...n
88
+ } : t;
89
+ }));
90
+ }, [R]);
91
+ let X = l(() => {
92
+ let { start: e, end: t } = O(H);
93
+ return N.filter((n) => {
94
+ let r = new Date(n.date);
95
+ return Number.isNaN(r.getTime()) ? !1 : r >= e && r <= t;
96
+ });
97
+ }, [N, H]), Z = l(() => {
98
+ let e = X.filter((e) => e.status !== "cancelled"), t = e.reduce((e, t) => e + ae(t.startTime, t.endTime), 0), n = e.reduce((e, t) => e + (t.totalEarnings ?? 0), 0), r = [...N].filter((e) => e.status === "scheduled").sort((e, t) => new Date(e.date).getTime() - new Date(t.date).getTime())[0];
73
99
  return {
74
100
  hoursThisWeek: Math.round(t * 10) / 10,
75
101
  shiftsThisWeek: e.length,
76
102
  earningsThisWeek: n,
77
103
  nextShift: r
78
104
  };
79
- }, [P]), W = O(z), G = (e) => {
80
- I.mutate({
81
- workerId: N,
105
+ }, [X, N]), Q = D(H), oe = (e) => {
106
+ F.mutate({
107
+ workerId: M,
82
108
  action: "CLOCK_IN"
83
109
  });
84
- }, K = (e) => {
85
- I.mutate({
86
- workerId: N,
110
+ }, se = (e) => {
111
+ F.mutate({
112
+ workerId: M,
87
113
  action: "CLOCK_OUT"
88
114
  });
89
- }, q = (e, t, n) => {
90
- H((r) => r.map((r) => r.dayOfWeek === e ? {
115
+ }, $ = (e, t, n) => {
116
+ q(!1), G((r) => r.map((r) => r.dayOfWeek === e ? {
91
117
  ...r,
92
118
  [t]: n
93
119
  } : r));
94
120
  };
95
- return F ? /* @__PURE__ */ S(n, {
121
+ return P ? /* @__PURE__ */ S(n, {
96
122
  title: "Schedule",
97
123
  description: "Manage your work schedule",
98
124
  children: /* @__PURE__ */ S("div", {
99
125
  className: "flex items-center justify-center py-24",
100
126
  children: /* @__PURE__ */ C("div", {
101
127
  className: "text-center",
102
- children: [/* @__PURE__ */ S(m, { className: "h-10 w-10 animate-spin text-text-secondary mx-auto mb-4" }), /* @__PURE__ */ S("p", {
128
+ children: [/* @__PURE__ */ S(g, { className: "h-10 w-10 animate-spin text-text-secondary mx-auto mb-4" }), /* @__PURE__ */ S("p", {
103
129
  className: "text-sm text-text-secondary",
104
130
  children: "Loading schedule..."
105
131
  })]
@@ -108,7 +134,7 @@ var j = [
108
134
  }) : /* @__PURE__ */ C(n, {
109
135
  title: "Schedule",
110
136
  description: "Manage your work schedule",
111
- children: [/* @__PURE__ */ S(T, {
137
+ children: [/* @__PURE__ */ S(ie, {
112
138
  className: "mb-6",
113
139
  children: "Your shifts, hours and pay in one place. Use this page to see your upcoming shifts, check in and out, and set the days and hours you're available — so your cart owner can roster you fairly and you always know when (and how much) you're working. Keep an eye on your weekly hours and next shift at the top."
114
140
  }), /* @__PURE__ */ C("div", {
@@ -126,7 +152,7 @@ var j = [
126
152
  children: "Hours This Week"
127
153
  }), /* @__PURE__ */ C("p", {
128
154
  className: "text-2xl font-bold text-text-primary",
129
- children: [U.hoursThisWeek, "h"]
155
+ children: [Z.hoursThisWeek, "h"]
130
156
  })]
131
157
  }),
132
158
  /* @__PURE__ */ C("div", {
@@ -136,7 +162,7 @@ var j = [
136
162
  children: "Shifts This Week"
137
163
  }), /* @__PURE__ */ S("p", {
138
164
  className: "text-2xl font-bold text-text-primary",
139
- children: U.shiftsThisWeek
165
+ children: Z.shiftsThisWeek
140
166
  })]
141
167
  }),
142
168
  /* @__PURE__ */ C("div", {
@@ -146,7 +172,7 @@ var j = [
146
172
  children: "Week Earnings"
147
173
  }), /* @__PURE__ */ S("p", {
148
174
  className: "text-2xl font-bold text-text-primary",
149
- children: o(U.earningsThisWeek, { minimumFractionDigits: 0 })
175
+ children: c(Z.earningsThisWeek, { minimumFractionDigits: 0 })
150
176
  })]
151
177
  }),
152
178
  /* @__PURE__ */ C("div", {
@@ -156,7 +182,7 @@ var j = [
156
182
  children: "Next Shift"
157
183
  }), /* @__PURE__ */ S("p", {
158
184
  className: "text-sm font-bold text-text-primary",
159
- children: U.nextShift ? `${E(U.nextShift.date)} ${D(U.nextShift.startTime)}` : "None scheduled"
185
+ children: Z.nextShift ? `${T(Z.nextShift.date)} ${E(Z.nextShift.startTime)}` : "None scheduled"
160
186
  })]
161
187
  })
162
188
  ]
@@ -167,57 +193,57 @@ var j = [
167
193
  children: [
168
194
  /* @__PURE__ */ C("button", {
169
195
  type: "button",
170
- onClick: () => R("schedule"),
171
- className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", L === "schedule" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
172
- children: [/* @__PURE__ */ S(u, { className: "h-4 w-4" }), "My Schedule"]
196
+ onClick: () => V("schedule"),
197
+ className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", B === "schedule" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
198
+ children: [/* @__PURE__ */ S(f, { className: "h-4 w-4" }), "My Schedule"]
173
199
  }),
174
200
  /* @__PURE__ */ C("button", {
175
201
  type: "button",
176
- onClick: () => R("requests"),
177
- className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", L === "requests" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
178
- children: [/* @__PURE__ */ S(y, { className: "h-4 w-4" }), "Shift Requests"]
202
+ onClick: () => V("requests"),
203
+ className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", B === "requests" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
204
+ children: [/* @__PURE__ */ S(x, { className: "h-4 w-4" }), "Shift Requests"]
179
205
  }),
180
206
  /* @__PURE__ */ C("button", {
181
207
  type: "button",
182
- onClick: () => R("availability"),
183
- className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", L === "availability" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
184
- children: [/* @__PURE__ */ S(x, { className: "h-4 w-4" }), "Availability"]
208
+ onClick: () => V("availability"),
209
+ className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2", B === "availability" ? "border-b-2 border-border-focus text-text-primary bg-[var(--color-accent-soft)]" : "text-text-secondary hover:text-text-primary"),
210
+ children: [/* @__PURE__ */ S(re, { className: "h-4 w-4" }), "Availability"]
185
211
  })
186
212
  ]
187
213
  }), /* @__PURE__ */ C("div", {
188
214
  className: "p-5",
189
215
  children: [
190
- L === "schedule" && /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ C("div", {
216
+ B === "schedule" && /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ C("div", {
191
217
  className: "flex items-center justify-between mb-5",
192
218
  children: [
193
219
  /* @__PURE__ */ C("button", {
194
220
  type: "button",
195
- onClick: () => B((e) => e - 1),
221
+ onClick: () => U((e) => e - 1),
196
222
  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",
197
- children: [/* @__PURE__ */ S(f, { className: "h-3.5 w-3.5" }), "Previous Week"]
223
+ children: [/* @__PURE__ */ S(m, { className: "h-3.5 w-3.5" }), "Previous Week"]
198
224
  }),
199
225
  /* @__PURE__ */ C("h3", {
200
226
  className: "text-sm font-medium text-text-primary",
201
227
  children: [
202
- W.start,
228
+ Q.start,
203
229
  " - ",
204
- W.end
230
+ Q.end
205
231
  ]
206
232
  }),
207
233
  /* @__PURE__ */ C("button", {
208
234
  type: "button",
209
- onClick: () => B((e) => e + 1),
235
+ onClick: () => U((e) => e + 1),
210
236
  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",
211
- children: ["Next Week", /* @__PURE__ */ S(p, { className: "h-3.5 w-3.5" })]
237
+ children: ["Next Week", /* @__PURE__ */ S(h, { className: "h-3.5 w-3.5" })]
212
238
  })
213
239
  ]
214
- }), P.length === 0 ? /* @__PURE__ */ S(r, {
215
- icon: /* @__PURE__ */ S(l, { className: "h-12 w-12" }),
216
- title: "No shifts scheduled",
217
- description: "You have no shifts on the roster yet. New shifts will appear here once assigned."
240
+ }), X.length === 0 ? /* @__PURE__ */ S(r, {
241
+ icon: /* @__PURE__ */ S(d, { className: "h-12 w-12" }),
242
+ title: "No shifts this week",
243
+ description: N.length === 0 ? "You have no shifts on the roster yet. New shifts will appear here once assigned." : "No shifts fall in the selected week. Use Previous / Next Week to browse your roster."
218
244
  }) : /* @__PURE__ */ S("div", {
219
245
  className: "space-y-3",
220
- children: P.map((e) => /* @__PURE__ */ C("div", {
246
+ children: X.map((e) => /* @__PURE__ */ C("div", {
221
247
  className: t("rounded-lg border p-4 transition-colors", e.status === "in_progress" ? "border-status-success-text/30 bg-status-success-bg-subtle" : "border-border-subtle hover:bg-bg-sunken/30"),
222
248
  children: [
223
249
  /* @__PURE__ */ C("div", {
@@ -226,19 +252,19 @@ var j = [
226
252
  className: "flex items-center gap-2 flex-wrap",
227
253
  children: [/* @__PURE__ */ S("h4", {
228
254
  className: "text-sm font-semibold text-text-primary",
229
- children: E(e.date)
255
+ children: T(e.date)
230
256
  }), /* @__PURE__ */ S("span", {
231
257
  className: t("inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize", k(e.status)),
232
258
  children: e.status === "in_progress" ? "Ongoing" : e.status
233
259
  })]
234
260
  }), /* @__PURE__ */ C("p", {
235
261
  className: "text-xs text-text-secondary mt-1",
236
- children: [D(e.startTime), e.endTime ? ` - ${D(e.endTime)}` : ""]
262
+ children: [E(e.startTime), e.endTime ? ` - ${E(e.endTime)}` : ""]
237
263
  })] }), e.totalEarnings > 0 && /* @__PURE__ */ S("div", {
238
264
  className: "text-right",
239
265
  children: /* @__PURE__ */ S("p", {
240
266
  className: "text-lg font-bold text-text-primary",
241
- children: o(e.totalEarnings, { minimumFractionDigits: 0 })
267
+ children: c(e.totalEarnings, { minimumFractionDigits: 0 })
242
268
  })
243
269
  })]
244
270
  }),
@@ -249,54 +275,54 @@ var j = [
249
275
  children: "Cart"
250
276
  }), /* @__PURE__ */ C("p", {
251
277
  className: "text-xs font-medium text-text-primary flex items-center gap-1",
252
- children: [/* @__PURE__ */ S(b, { className: "h-3 w-3 text-text-secondary" }), e.cartName]
278
+ children: [/* @__PURE__ */ S(ne, { className: "h-3 w-3 text-text-secondary" }), e.cartName]
253
279
  })] }), /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("p", {
254
280
  className: "text-xs text-text-secondary",
255
281
  children: "Tasks Completed"
256
282
  }), /* @__PURE__ */ C("p", {
257
283
  className: "text-xs font-medium text-text-primary flex items-center gap-1",
258
- children: [/* @__PURE__ */ S(d, { className: "h-3 w-3 text-text-secondary" }), e.tasksCompleted]
284
+ children: [/* @__PURE__ */ S(p, { className: "h-3 w-3 text-text-secondary" }), e.tasksCompleted]
259
285
  })] })]
260
286
  }),
261
287
  e.status === "scheduled" && /* @__PURE__ */ S("div", {
262
288
  className: "mt-3 pt-3 border-t border-border-subtle",
263
289
  children: /* @__PURE__ */ C("button", {
264
290
  type: "button",
265
- onClick: () => G(e),
266
- disabled: I.isPending,
291
+ onClick: () => oe(e),
292
+ disabled: F.isPending,
267
293
  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",
268
- children: [/* @__PURE__ */ S(h, { className: "h-3.5 w-3.5" }), "Check In"]
294
+ children: [/* @__PURE__ */ S(_, { className: "h-3.5 w-3.5" }), "Check In"]
269
295
  })
270
296
  }),
271
297
  e.status === "in_progress" && /* @__PURE__ */ C("div", {
272
298
  className: "mt-3 pt-3 border-t border-status-success-text/20 flex items-center justify-between",
273
299
  children: [/* @__PURE__ */ C("span", {
274
300
  className: "text-xs font-medium text-status-success-text flex items-center gap-1",
275
- children: [/* @__PURE__ */ S(_, { className: "h-3.5 w-3.5" }), "Shift in progress"]
301
+ children: [/* @__PURE__ */ S(y, { className: "h-3.5 w-3.5" }), "Shift in progress"]
276
302
  }), /* @__PURE__ */ C("button", {
277
303
  type: "button",
278
- onClick: () => K(e),
279
- disabled: I.isPending,
304
+ onClick: () => se(e),
305
+ disabled: F.isPending,
280
306
  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",
281
- children: [/* @__PURE__ */ S(g, { className: "h-3.5 w-3.5" }), "Check Out"]
307
+ children: [/* @__PURE__ */ S(v, { className: "h-3.5 w-3.5" }), "Check Out"]
282
308
  })]
283
309
  })
284
310
  ]
285
311
  }, e.id))
286
312
  })] }),
287
- L === "requests" && /* @__PURE__ */ S(r, {
288
- icon: /* @__PURE__ */ S(y, { className: "h-12 w-12" }),
313
+ B === "requests" && /* @__PURE__ */ S(r, {
314
+ icon: /* @__PURE__ */ S(x, { className: "h-12 w-12" }),
289
315
  title: "No shift requests",
290
316
  description: "Shift swap and time-off requests will appear here. This feature is coming soon."
291
317
  }),
292
- L === "availability" && /* @__PURE__ */ C("div", { children: [
318
+ B === "availability" && /* @__PURE__ */ C("div", { children: [
293
319
  /* @__PURE__ */ S("p", {
294
320
  className: "text-xs text-text-secondary mb-5",
295
321
  children: "Set your preferred working hours for each day of the week"
296
322
  }),
297
323
  /* @__PURE__ */ S("div", {
298
324
  className: "space-y-3",
299
- children: V.map((e) => /* @__PURE__ */ C("div", {
325
+ children: W.map((e) => /* @__PURE__ */ C("div", {
300
326
  className: t("flex flex-col sm:flex-row sm:items-center gap-3 p-3 rounded-lg border", e.isAvailable ? "border-border-subtle bg-bg-surface" : "border-border-subtle/50 bg-bg-sunken/30"),
301
327
  children: [/* @__PURE__ */ S("div", {
302
328
  className: "w-32 shrink-0",
@@ -305,7 +331,7 @@ var j = [
305
331
  children: [/* @__PURE__ */ S("input", {
306
332
  type: "checkbox",
307
333
  checked: e.isAvailable,
308
- onChange: (t) => q(e.dayOfWeek, "isAvailable", t.target.checked),
334
+ onChange: (t) => $(e.dayOfWeek, "isAvailable", t.target.checked),
309
335
  className: "h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-border-focus/40"
310
336
  }), /* @__PURE__ */ S("span", {
311
337
  className: "text-sm font-medium text-text-primary",
@@ -322,7 +348,7 @@ var j = [
322
348
  }), /* @__PURE__ */ S("input", {
323
349
  type: "time",
324
350
  value: e.preferredStartTime,
325
- onChange: (t) => q(e.dayOfWeek, "preferredStartTime", t.target.value),
351
+ onChange: (t) => $(e.dayOfWeek, "preferredStartTime", t.target.value),
326
352
  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"
327
353
  })]
328
354
  }), /* @__PURE__ */ C("div", {
@@ -333,7 +359,7 @@ var j = [
333
359
  }), /* @__PURE__ */ S("input", {
334
360
  type: "time",
335
361
  value: e.preferredEndTime,
336
- onChange: (t) => q(e.dayOfWeek, "preferredEndTime", t.target.value),
362
+ onChange: (t) => $(e.dayOfWeek, "preferredEndTime", t.target.value),
337
363
  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"
338
364
  })]
339
365
  })]
@@ -343,15 +369,36 @@ var j = [
343
369
  })]
344
370
  }, e.dayOfWeek))
345
371
  }),
346
- /* @__PURE__ */ S("div", {
347
- className: "mt-5",
348
- children: /* @__PURE__ */ C("button", {
372
+ /* @__PURE__ */ C("div", {
373
+ className: "mt-5 flex flex-wrap items-center gap-3",
374
+ children: [/* @__PURE__ */ C("button", {
349
375
  type: "button",
350
376
  onClick: () => {
351
- alert("Availability preferences saved");
377
+ if (Y(null), q(!1), !R) {
378
+ Y("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.");
379
+ return;
380
+ }
381
+ z.mutate({
382
+ id: R.id,
383
+ metadata: { availability: W }
384
+ }, {
385
+ onSuccess: () => q(!0),
386
+ onError: (e) => Y(e instanceof Error ? e.message : "Failed to save availability.")
387
+ });
352
388
  },
353
- 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",
354
- children: [/* @__PURE__ */ S(v, { className: "h-4 w-4" }), "Save Availability"]
389
+ disabled: z.isPending,
390
+ 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",
391
+ children: [z.isPending ? /* @__PURE__ */ S(g, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ S(b, { className: "h-4 w-4" }), z.isPending ? "Saving..." : "Save Availability"]
392
+ }), K && !z.isPending && /* @__PURE__ */ S("span", {
393
+ className: "text-xs text-status-success-text",
394
+ children: "Availability preferences saved"
395
+ })]
396
+ }),
397
+ J && /* @__PURE__ */ S("div", {
398
+ className: "mt-3 rounded-lg border border-status-error-text/20 bg-status-error-bg-subtle p-3",
399
+ children: /* @__PURE__ */ S("p", {
400
+ className: "text-xs text-status-error-text",
401
+ children: J
355
402
  })
356
403
  })
357
404
  ] })
@@ -362,6 +409,6 @@ var j = [
362
409
  });
363
410
  };
364
411
  //#endregion
365
- export { M as WorkerSchedulePage };
412
+ export { j as WorkerSchedulePage };
366
413
 
367
414
  //# sourceMappingURL=WorkerSchedulePage.js.map
@@ -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":";;;;;;;;;;;AA4DA,SAAS,EAAW,GAA4B;CAC9C,IAAM,IAAO,IAAI,KAAK,EAAW;AAEjC,QADI,OAAO,MAAM,EAAK,SAAS,CAAC,GAAS,IAClC,EAAK,mBAAmB,SAAS;EAAE,SAAS;EAAS,OAAO;EAAS,KAAK;EAAW,CAAC;;AAG/F,SAAS,EAAW,GAAsB;AACxC,KAAI,CAAC,EAAM,QAAO;CAClB,IAAM,CAAC,GAAO,KAAW,EAAK,MAAM,IAAI,EAClC,IAAO,SAAS,GAAO,GAAG;AAChC,KAAI,OAAO,MAAM,EAAK,CAAE,QAAO;CAC/B,IAAM,IAAO,KAAQ,KAAK,OAAO;AAEjC,QAAO,GADa,IAAO,MAAM,GACX,GAAG,KAAW,KAAK,GAAG;;AAG9C,SAAS,EAAa,GAAoB;CACxC,IAAM,oBAAQ,IAAI,MAAM,EAClB,IAAa,EAAM,QAAQ,EAC3B,IAAY,IAAI,KAAK,EAAM;AACjC,GAAU,QAAQ,EAAM,SAAS,GAAG,IAAa,IAAa,EAAE;CAChE,IAAM,IAAU,IAAI,KAAK,EAAU;AAEnC,QADA,EAAQ,QAAQ,EAAU,SAAS,GAAG,EAAE,EACjC;EACL,OAAO,EAAU,mBAAmB,SAAS;GAAE,OAAO;GAAS,KAAK;GAAW,CAAC;EAChF,KAAK,EAAQ,mBAAmB,SAAS;GAAE,OAAO;GAAS,KAAK;GAAW,MAAM;GAAW,CAAC;EAC9F;;AAGH,SAAS,EAAoB,GAAkC;AAC7D,SAAQ,GAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,cACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAS,EAAa,GAAmB,GAAyB;AAChE,KAAI,CAAC,KAAa,CAAC,EAAS,QAAO;CACnC,IAAM,oBAAQ,IAAI,KAAK,cAAc,IAAY,EAC3C,oBAAM,IAAI,KAAK,cAAc,IAAU;AAE7C,QADI,OAAO,MAAM,EAAM,SAAS,CAAC,IAAI,OAAO,MAAM,EAAI,SAAS,CAAC,GAAS,IAClE,KAAK,IAAI,IAAI,EAAI,SAAS,GAAG,EAAM,SAAS,KAAK,MAAO,KAAK,IAAI;;AAG1E,IAAM,IAA0C;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,KAAK,OAAe;CACpB;CACA,aAAa,MAAc;CAC3B,oBAAoB;CACpB,kBAAkB;CACnB,EAAE,EAMU,UAA2B;CACtC,IAAM,EAAE,mBAAgB,GAAc,EAChC,IAAW,GAAa,MAAM,IAE9B,EAAE,MAAM,IAAS,EAAE,EAAE,iBAAc,EAAmB,EAAS,EAC/D,IAAa,GAAqB,EAElC,CAAC,GAAW,KAAgB,EAAsB,WAAW,EAC7D,CAAC,GAAc,KAAmB,EAAS,EAAE,EAC7C,CAAC,GAAc,KAAmB,EAA4B,EAAqB,EAGnF,IAAY,QAAc;EAC9B,IAAM,IAAS,EAAO,QAAQ,MAAM,EAAE,WAAW,YAAY,EACvD,IAAa,EAAO,QAAQ,GAAK,MAAM,IAAM,EAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EACrF,IAAW,EAAO,QAAQ,GAAK,MAAM,KAAO,EAAE,iBAAiB,IAAI,EAAE,EACrE,IAAY,EAAO,MAAM,MAAM,EAAE,WAAW,YAAY;AAC9D,SAAO;GACL,eAAe,KAAK,MAAM,IAAa,GAAG,GAAG;GAC7C,gBAAgB,EAAO;GACvB,kBAAkB;GAClB;GACD;IACA,CAAC,EAAO,CAAC,EAEN,IAAY,EAAa,EAAa,EAEtC,KAAiB,MAA0B;AAC/C,IAAW,OAAO;GAAE;GAAU,QAAQ;GAAY,CAAC;IAI/C,KAAkB,MAA0B;AAChD,IAAW,OAAO;GAAE;GAAU,QAAQ;GAAa,CAAC;IAIhD,KACJ,GACA,GACA,MACG;AACH,KAAiB,MACf,EAAK,KAAK,MAAO,EAAE,cAAc,IAAY;GAAE,GAAG;IAAI,IAAQ;GAAO,GAAG,EAAG,CAC5E;;AAoBH,QAbI,IAEA,kBAAC,GAAD;EAAY,OAAM;EAAW,aAAY;YACvC,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAS,WAAU,2DAA4D,CAAA,EAC/E,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAuB,CAAA,CAC9D;;GACF,CAAA;EACK,CAAA,GAKf,kBAAC,GAAD;EAAY,OAAM;EAAW,aAAY;YAAzC,CACE,kBAAC,GAAD;GAAa,WAAU;aAAO;GAKhB,CAAA,EAEd,kBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAiD;IAAc,CAAA,EAC7E,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAmB,CAAA,EAC9D,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAAqD,EAAU,eAAc,IAAK;SAC9E;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAoB,CAAA,EAC/D,kBAAC,KAAD;OAAG,WAAU;iBAAwC,EAAU;OAAmB,CAAA,CAC9E;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAiB,CAAA,EAC5D,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAe,EAAU,kBAAkB,EAAE,uBAAuB,GAAG,CAAC;OACvE,CAAA,CACA;;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAc,CAAA,EACzD,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAU,YACP,GAAG,EAAW,EAAU,UAAU,KAAK,CAAC,GAAG,EAAW,EAAU,UAAU,UAAU,KACpF;OACF,CAAA,CACA;;KACF;MACQ,EAAA,CAAA,EAGhB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAa,WAAW;OACvC,WAAW,EACT,iGACA,MAAc,aACV,mFACA,8CACL;iBARH,CAUE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,cAE7B;;MACT,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAa,WAAW;OACvC,WAAW,EACT,iGACA,MAAc,aACV,mFACA,8CACL;iBARH,CAUE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,iBAErB;;MACT,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAa,eAAe;OAC3C,WAAW,EACT,iGACA,MAAc,iBACV,mFACA,8CACL;iBARH,CAUE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,eAEtB;;MACL;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf;MAEG,MAAc,cACb,kBAAC,OAAD,EAAA,UAAA,CAEE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,GAAiB,MAAM,IAAI,EAAE;SAC5C,WAAU;mBAHZ,CAKE,kBAAC,GAAD,EAAa,WAAU,eAAgB,CAAA,EAAA,gBAEhC;;QACT,kBAAC,MAAD;SAAI,WAAU;mBAAd;UACG,EAAU;UAAM;UAAI,EAAU;UAC5B;;QACL,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,GAAiB,MAAM,IAAI,EAAE;SAC5C,WAAU;mBAHZ,CAIC,aAEC,kBAAC,GAAD,EAAc,WAAU,eAAgB,CAAA,CACjC;;QACL;UAGL,EAAO,WAAW,IACjB,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;OACxC,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAO,KAAK,MACX,kBAAC,OAAD;QAEE,WAAW,EACT,2CACA,EAAM,WAAW,gBACb,8DACA,6CACL;kBAPH;SASE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAW,EAAM,KAAK;YACpB,CAAA,EACL,kBAAC,QAAD;YACE,WAAW,EACT,wFACA,EAAoB,EAAM,OAAO,CAClC;sBAEA,EAAM,WAAW,gBAAgB,YAAY,EAAM;YAC/C,CAAA,CACH;cACN,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACG,EAAW,EAAM,UAAU,EAC3B,EAAM,UAAU,MAAM,EAAW,EAAM,QAAQ,KAAK,GACnD;aACA,EAAA,CAAA,EACL,EAAM,gBAAgB,KACrB,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAe,EAAM,eAAe,EAAE,uBAAuB,GAAG,CAAC;YAChE,CAAA;WACA,CAAA,CAEJ;;SAEN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAQ,CAAA,EACnD,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EACvD,EAAM,SACL;aACA,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBAA8B;WAAmB,CAAA,EAC9D,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA,EACvD,EAAM,eACL;aACA,EAAA,CAAA,CACF;;SAEL,EAAM,WAAW,eAChB,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,UAAD;WACE,MAAK;WACL,eAAe,EAAc,EAAM;WACnC,UAAU,EAAW;WACrB,WAAU;qBAJZ,CAME,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA,EAAA,WAE1B;;UACL,CAAA;SAGP,EAAM,WAAW,iBAChB,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAY,WAAU,eAAgB,CAAA,EAAA,oBAEjC;cACP,kBAAC,UAAD;WACE,MAAK;WACL,eAAe,EAAe,EAAM;WACpC,UAAU,EAAW;WACrB,WAAU;qBAJZ,CAME,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA,EAAA,YAE3B;aACL;;SAEJ;UArFC,EAAM,GAqFP,CACN;OACE,CAAA,CAEJ,EAAA,CAAA;MAIP,MAAc,cACb,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAM,WAAU,aAAc,CAAA;OACpC,OAAM;OACN,aAAY;OACZ,CAAA;MAIH,MAAc,kBACb,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAE5C,CAAA;OAEJ,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAa,KAAK,MACjB,kBAAC,OAAD;SAEE,WAAW,EACT,yEACA,EAAI,cACA,uCACA,0CACL;mBAPH,CASE,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,SAAD;WAAO,WAAU;qBAAjB,CACE,kBAAC,SAAD;YACE,MAAK;YACL,SAAS,EAAI;YACb,WAAW,MACT,EAAmB,EAAI,WAAW,eAAe,EAAE,OAAO,QAAQ;YAEpE,WAAU;YACV,CAAA,EACF,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAI;YACA,CAAA,CACD;;UACJ,CAAA,EAEL,EAAI,cACH,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAmC;YAAW,CAAA,EAC9D,kBAAC,SAAD;YACE,MAAK;YACL,OAAO,EAAI;YACX,WAAW,MACT,EACE,EAAI,WACJ,sBACA,EAAE,OAAO,MACV;YAEH,WAAU;YACV,CAAA,CACE;cACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,QAAD;YAAM,WAAU;sBAAmC;YAAS,CAAA,EAC5D,kBAAC,SAAD;YACE,MAAK;YACL,OAAO,EAAI;YACX,WAAW,MACT,EAAmB,EAAI,WAAW,oBAAoB,EAAE,OAAO,MAAM;YAEvE,WAAU;YACV,CAAA,CACE;aACF;cAEN,kBAAC,QAAD;UAAM,WAAU;oBAA8B;UAAoB,CAAA,CAEhE;WAxDC,EAAI,UAwDL,CACN;QACE,CAAA;OAEN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,UAAD;SACE,MAAK;SACL,eAxTmB;AACnC,gBAAM,iCAAiC;;SAwTvB,WAAU;mBAHZ,CAKE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,oBAErB;;QACL,CAAA;OACF,EAAA,CAAA;MAEJ;OACF;MACF;KACK"}
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&apos;re available — so your cart owner can roster\n you 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 {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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-kadaikodi",
3
- "version": "2026.704.2",
3
+ "version": "2026.704.4",
4
4
  "description": "Burdenoff Kadaikodi Microfrontend - Mobile services marketplace platform for connecting service providers with customers",
5
5
  "type": "module",
6
6
  "files": [