@burdenoff/microfe-kadaikodi 2026.704.3 → 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.
- package/dist/kadaikodi/KadaikodiRoutes.js +30 -26
- package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +76 -6
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +278 -283
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +105 -111
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +84 -70
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +202 -139
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +232 -0
- package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +84 -79
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +243 -143
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +4 -4
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +2 -2
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +4 -4
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js +5 -5
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +6 -4
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +6 -6
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +4 -4
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +409 -304
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +209 -162
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +207 -186
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +340 -272
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +122 -75
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- 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 {
|
|
6
|
-
import { formatCurrency as
|
|
7
|
-
import { useMemo as
|
|
8
|
-
import { Calendar as
|
|
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
|
|
10
|
+
import { EmphasisPanel as w, PagePurpose as ie } from "@burdenoff/fe-libs/ui";
|
|
11
11
|
//#region src/kadaikodi/pages/worker/WorkerSchedulePage.tsx
|
|
12
|
-
function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
})),
|
|
71
|
-
let { currentUser:
|
|
72
|
-
|
|
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
|
-
}, [
|
|
80
|
-
|
|
81
|
-
workerId:
|
|
105
|
+
}, [X, N]), Q = D(H), oe = (e) => {
|
|
106
|
+
F.mutate({
|
|
107
|
+
workerId: M,
|
|
82
108
|
action: "CLOCK_IN"
|
|
83
109
|
});
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
workerId:
|
|
110
|
+
}, se = (e) => {
|
|
111
|
+
F.mutate({
|
|
112
|
+
workerId: M,
|
|
87
113
|
action: "CLOCK_OUT"
|
|
88
114
|
});
|
|
89
|
-
},
|
|
90
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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: [
|
|
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:
|
|
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:
|
|
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:
|
|
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: () =>
|
|
171
|
-
className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2",
|
|
172
|
-
children: [/* @__PURE__ */ S(
|
|
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: () =>
|
|
177
|
-
className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2",
|
|
178
|
-
children: [/* @__PURE__ */ S(
|
|
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: () =>
|
|
183
|
-
className: t("flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2",
|
|
184
|
-
children: [/* @__PURE__ */ S(
|
|
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
|
-
|
|
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: () =>
|
|
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(
|
|
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
|
-
|
|
228
|
+
Q.start,
|
|
203
229
|
" - ",
|
|
204
|
-
|
|
230
|
+
Q.end
|
|
205
231
|
]
|
|
206
232
|
}),
|
|
207
233
|
/* @__PURE__ */ C("button", {
|
|
208
234
|
type: "button",
|
|
209
|
-
onClick: () =>
|
|
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(
|
|
237
|
+
children: ["Next Week", /* @__PURE__ */ S(h, { className: "h-3.5 w-3.5" })]
|
|
212
238
|
})
|
|
213
239
|
]
|
|
214
|
-
}),
|
|
215
|
-
icon: /* @__PURE__ */ S(
|
|
216
|
-
title: "No shifts
|
|
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:
|
|
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:
|
|
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: [
|
|
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:
|
|
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(
|
|
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(
|
|
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: () =>
|
|
266
|
-
disabled:
|
|
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(
|
|
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(
|
|
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: () =>
|
|
279
|
-
disabled:
|
|
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(
|
|
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
|
-
|
|
288
|
-
icon: /* @__PURE__ */ S(
|
|
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
|
-
|
|
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:
|
|
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) =>
|
|
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) =>
|
|
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) =>
|
|
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__ */
|
|
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
|
-
|
|
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
|
-
|
|
354
|
-
|
|
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 {
|
|
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're available — so your cart owner can roster you\n 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 {shifts.length === 0 ? (\n <EmptyState\n icon={<Calendar className=\"h-12 w-12\" />}\n title=\"No shifts scheduled\"\n description=\"You have no shifts on the roster yet. New shifts will appear here once assigned.\"\n />\n ) : (\n <div className=\"space-y-3\">\n {shifts.map((shift) => (\n <div\n key={shift.id}\n className={cn(\n 'rounded-lg border p-4 transition-colors',\n shift.status === 'in_progress'\n ? 'border-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-border-subtle hover:bg-bg-sunken/30'\n )}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h4 className=\"text-sm font-semibold text-text-primary\">\n {formatDate(shift.date)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getShiftStatusStyle(shift.status)\n )}\n >\n {shift.status === 'in_progress' ? 'Ongoing' : shift.status}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mt-1\">\n {formatTime(shift.startTime)}\n {shift.endTime ? ` - ${formatTime(shift.endTime)}` : ''}\n </p>\n </div>\n {shift.totalEarnings > 0 && (\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-text-primary\">\n {formatCurrency(shift.totalEarnings, { minimumFractionDigits: 0 })}\n </p>\n </div>\n )}\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm\">\n <div>\n <p className=\"text-xs text-text-secondary\">Cart</p>\n <p className=\"text-xs font-medium text-text-primary flex items-center gap-1\">\n <ShoppingCart className=\"h-3 w-3 text-text-secondary\" />\n {shift.cartName}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Tasks Completed</p>\n <p className=\"text-xs font-medium text-text-primary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3 text-text-secondary\" />\n {shift.tasksCompleted}\n </p>\n </div>\n </div>\n\n {shift.status === 'scheduled' && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={() => handleCheckIn(shift)}\n disabled={clockInOut.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-[var(--color-accent-soft)] px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors disabled:opacity-50\"\n >\n <LogIn className=\"h-3.5 w-3.5\" />\n Check In\n </button>\n </div>\n )}\n\n {shift.status === 'in_progress' && (\n <div className=\"mt-3 pt-3 border-t border-status-success-text/20 flex items-center justify-between\">\n <span className=\"text-xs font-medium text-status-success-text flex items-center gap-1\">\n <PlayCircle className=\"h-3.5 w-3.5\" />\n Shift in progress\n </span>\n <button\n type=\"button\"\n onClick={() => handleCheckOut(shift)}\n disabled={clockInOut.isPending}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent/80 transition-colors disabled:opacity-50\"\n >\n <LogOut className=\"h-3.5 w-3.5\" />\n Check Out\n </button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* ============= Shift Requests Tab ============= */}\n {activeTab === 'requests' && (\n <EmptyState\n icon={<Send className=\"h-12 w-12\" />}\n title=\"No shift requests\"\n description=\"Shift swap and time-off requests will appear here. This feature is coming soon.\"\n />\n )}\n\n {/* ============= Availability Tab ============= */}\n {activeTab === 'availability' && (\n <div>\n <p className=\"text-xs text-text-secondary mb-5\">\n Set your preferred working hours for each day of the week\n </p>\n\n <div className=\"space-y-3\">\n {availability.map((day) => (\n <div\n key={day.dayOfWeek}\n className={cn(\n 'flex flex-col sm:flex-row sm:items-center gap-3 p-3 rounded-lg border',\n day.isAvailable\n ? 'border-border-subtle bg-bg-surface'\n : 'border-border-subtle/50 bg-bg-sunken/30'\n )}\n >\n <div className=\"w-32 shrink-0\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={day.isAvailable}\n onChange={(e) =>\n updateAvailability(day.dayOfWeek, 'isAvailable', e.target.checked)\n }\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-border-focus/40\"\n />\n <span className=\"text-sm font-medium text-text-primary\">\n {day.dayOfWeek}\n </span>\n </label>\n </div>\n\n {day.isAvailable ? (\n <div className=\"flex flex-col sm:flex-row gap-3 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary w-10\">From</span>\n <input\n type=\"time\"\n value={day.preferredStartTime}\n onChange={(e) =>\n updateAvailability(\n day.dayOfWeek,\n 'preferredStartTime',\n e.target.value\n )\n }\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-border-focus/40\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary w-10\">To</span>\n <input\n type=\"time\"\n value={day.preferredEndTime}\n onChange={(e) =>\n updateAvailability(day.dayOfWeek, 'preferredEndTime', e.target.value)\n }\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-1.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-border-focus/40\"\n />\n </div>\n </div>\n ) : (\n <span className=\"text-xs text-text-secondary\">Not available</span>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"mt-5\">\n <button\n type=\"button\"\n onClick={handleSaveAvailability}\n className=\"inline-flex items-center gap-2 rounded-md bg-[var(--color-accent-soft)] px-4 py-2 text-sm font-medium text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors\"\n >\n <Save className=\"h-4 w-4\" />\n Save Availability\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkerSchedulePage.js","names":[],"sources":["../../../../src/kadaikodi/pages/worker/WorkerSchedulePage.tsx"],"sourcesContent":["/**\n * Worker Schedule Page\n *\n * The signed-in worker's shifts, hours and pay, 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/microfe-kadaikodi",
|
|
3
|
-
"version": "2026.704.
|
|
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": [
|