@burdenoff/microfe-adaptercloud 2026.614.1 → 2026.625.1
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/adaptercloud/components/EmptyState.js +17 -21
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +30 -28
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +21 -15
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +38 -19
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +36 -16
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +286 -275
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +87 -87
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +101 -101
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +48 -48
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +95 -95
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +34 -34
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +40 -40
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +107 -107
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +98 -98
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +117 -117
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +33 -33
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +112 -109
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +115 -115
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +85 -85
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +106 -106
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +88 -88
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +94 -94
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +142 -142
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +67 -66
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +115 -115
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +74 -73
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +87 -86
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +66 -65
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +80 -80
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +88 -88
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +84 -84
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +92 -91
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +34 -33
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +44 -43
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +61 -60
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +58 -57
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +48 -47
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +46 -45
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +128 -128
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +88 -87
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +88 -88
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +62 -62
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +39 -38
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +66 -66
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +153 -153
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +81 -80
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +106 -106
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +73 -72
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +107 -107
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +71 -69
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/adaptercloud/utils/cn.js +2 -2
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +3 -3
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -192,9 +192,10 @@ function D() {
|
|
|
192
192
|
if (!A) return /* @__PURE__ */ C(n, {
|
|
193
193
|
title: "Booking Not Found",
|
|
194
194
|
children: /* @__PURE__ */ C(i, {
|
|
195
|
+
illustration: "empty-generic",
|
|
195
196
|
icon: /* @__PURE__ */ C(f, { className: "h-12 w-12" }),
|
|
196
197
|
title: "Booking not found",
|
|
197
|
-
description: `No booking found with ID
|
|
198
|
+
description: `No booking found with ID"${T}".`,
|
|
198
199
|
action: /* @__PURE__ */ C("button", {
|
|
199
200
|
type: "button",
|
|
200
201
|
onClick: () => D("/customer/dashboard"),
|
|
@@ -210,15 +211,15 @@ function D() {
|
|
|
210
211
|
children: [/* @__PURE__ */ C("button", {
|
|
211
212
|
type: "button",
|
|
212
213
|
onClick: () => D("/customer/dashboard"),
|
|
213
|
-
className: "rounded-md p-1 text-
|
|
214
|
+
className: "rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
|
|
214
215
|
children: /* @__PURE__ */ C(u, { className: "h-5 w-5" })
|
|
215
216
|
}), /* @__PURE__ */ w("span", { children: ["Booking #", A.id] })]
|
|
216
217
|
}),
|
|
217
218
|
actions: /* @__PURE__ */ C(r, { status: A.status }),
|
|
218
219
|
children: [O && /* @__PURE__ */ w("div", {
|
|
219
|
-
className: "mb-4 rounded-lg border border-
|
|
220
|
-
children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-
|
|
221
|
-
className: "text-sm text-
|
|
220
|
+
className: "mb-4 rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-3 flex items-center gap-2",
|
|
221
|
+
children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-status-success-text shrink-0" }), /* @__PURE__ */ C("p", {
|
|
222
|
+
className: "text-sm text-status-success-text",
|
|
222
223
|
children: O
|
|
223
224
|
})]
|
|
224
225
|
}), /* @__PURE__ */ w("div", {
|
|
@@ -227,18 +228,18 @@ function D() {
|
|
|
227
228
|
className: "lg:col-span-2 space-y-6",
|
|
228
229
|
children: [
|
|
229
230
|
/* @__PURE__ */ w("div", {
|
|
230
|
-
className: "rounded-lg border border-border bg-
|
|
231
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
|
|
231
232
|
children: [
|
|
232
233
|
/* @__PURE__ */ C("h2", {
|
|
233
|
-
className: "text-lg font-semibold text-
|
|
234
|
+
className: "text-lg font-semibold text-text-primary",
|
|
234
235
|
children: A.serviceName
|
|
235
236
|
}),
|
|
236
237
|
/* @__PURE__ */ C("p", {
|
|
237
|
-
className: "mt-1 text-sm text-
|
|
238
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
238
239
|
children: A.serviceDescription
|
|
239
240
|
}),
|
|
240
241
|
/* @__PURE__ */ w("div", {
|
|
241
|
-
className: "mt-4 flex flex-wrap gap-4 text-sm text-
|
|
242
|
+
className: "mt-4 flex flex-wrap gap-4 text-sm text-text-secondary",
|
|
242
243
|
children: [
|
|
243
244
|
/* @__PURE__ */ w("div", {
|
|
244
245
|
className: "flex items-center gap-1.5",
|
|
@@ -255,59 +256,59 @@ function D() {
|
|
|
255
256
|
]
|
|
256
257
|
}),
|
|
257
258
|
A.notes && /* @__PURE__ */ w("div", {
|
|
258
|
-
className: "mt-4 rounded-md bg-
|
|
259
|
+
className: "mt-4 rounded-md bg-bg-sunken p-3",
|
|
259
260
|
children: [/* @__PURE__ */ C("p", {
|
|
260
|
-
className: "text-xs text-
|
|
261
|
+
className: "text-xs text-text-secondary mb-1",
|
|
261
262
|
children: "Notes"
|
|
262
263
|
}), /* @__PURE__ */ C("p", {
|
|
263
|
-
className: "text-sm text-
|
|
264
|
+
className: "text-sm text-text-primary",
|
|
264
265
|
children: A.notes
|
|
265
266
|
})]
|
|
266
267
|
}),
|
|
267
268
|
A.cancellationReason && /* @__PURE__ */ w("div", {
|
|
268
|
-
className: "mt-4 rounded-md bg-
|
|
269
|
+
className: "mt-4 rounded-md bg-status-error-bg-subtle/5 border border-status-error-border/20 p-3",
|
|
269
270
|
children: [/* @__PURE__ */ w("div", {
|
|
270
271
|
className: "flex items-center gap-2 mb-1",
|
|
271
|
-
children: [/* @__PURE__ */ C(l, { className: "h-3.5 w-3.5 text-
|
|
272
|
-
className: "text-xs font-medium text-
|
|
272
|
+
children: [/* @__PURE__ */ C(l, { className: "h-3.5 w-3.5 text-status-error-text" }), /* @__PURE__ */ C("p", {
|
|
273
|
+
className: "text-xs font-medium text-status-error-text",
|
|
273
274
|
children: "Cancellation Reason"
|
|
274
275
|
})]
|
|
275
276
|
}), /* @__PURE__ */ C("p", {
|
|
276
|
-
className: "text-sm text-
|
|
277
|
+
className: "text-sm text-text-primary",
|
|
277
278
|
children: A.cancellationReason
|
|
278
279
|
})]
|
|
279
280
|
})
|
|
280
281
|
]
|
|
281
282
|
}),
|
|
282
283
|
/* @__PURE__ */ w("div", {
|
|
283
|
-
className: "rounded-lg border border-border bg-
|
|
284
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
|
|
284
285
|
children: [
|
|
285
286
|
/* @__PURE__ */ C("h2", {
|
|
286
|
-
className: "text-base font-semibold text-
|
|
287
|
+
className: "text-base font-semibold text-text-primary mb-4",
|
|
287
288
|
children: "Service Provider"
|
|
288
289
|
}),
|
|
289
290
|
/* @__PURE__ */ w("div", {
|
|
290
291
|
className: "flex items-center gap-4",
|
|
291
292
|
children: [
|
|
292
293
|
/* @__PURE__ */ C("div", {
|
|
293
|
-
className: "flex h-12 w-12 items-center justify-center rounded-full bg-
|
|
294
|
+
className: "flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary",
|
|
294
295
|
children: /* @__PURE__ */ C(y, { className: "h-6 w-6" })
|
|
295
296
|
}),
|
|
296
297
|
/* @__PURE__ */ w("div", {
|
|
297
298
|
className: "flex-1 min-w-0",
|
|
298
299
|
children: [
|
|
299
300
|
/* @__PURE__ */ C("p", {
|
|
300
|
-
className: "text-sm font-semibold text-
|
|
301
|
+
className: "text-sm font-semibold text-text-primary",
|
|
301
302
|
children: A.provider.name
|
|
302
303
|
}),
|
|
303
304
|
/* @__PURE__ */ C("p", {
|
|
304
|
-
className: "text-xs text-
|
|
305
|
+
className: "text-xs text-text-secondary",
|
|
305
306
|
children: A.provider.category
|
|
306
307
|
}),
|
|
307
308
|
/* @__PURE__ */ w("div", {
|
|
308
309
|
className: "flex items-center gap-1 mt-1",
|
|
309
|
-
children: [/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-
|
|
310
|
-
className: "text-xs font-medium text-
|
|
310
|
+
children: [/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ C("span", {
|
|
311
|
+
className: "text-xs font-medium text-text-primary",
|
|
311
312
|
children: A.provider.rating
|
|
312
313
|
})]
|
|
313
314
|
})
|
|
@@ -315,21 +316,21 @@ function D() {
|
|
|
315
316
|
}),
|
|
316
317
|
/* @__PURE__ */ C("a", {
|
|
317
318
|
href: `tel:${A.provider.phone}`,
|
|
318
|
-
className: "flex h-10 w-10 items-center justify-center rounded-full bg-
|
|
319
|
+
className: "flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
|
|
319
320
|
children: /* @__PURE__ */ C(v, { className: "h-4 w-4" })
|
|
320
321
|
})
|
|
321
322
|
]
|
|
322
323
|
}),
|
|
323
324
|
/* @__PURE__ */ w("div", {
|
|
324
|
-
className: "mt-3 flex items-center gap-2 text-sm text-
|
|
325
|
+
className: "mt-3 flex items-center gap-2 text-sm text-text-secondary",
|
|
325
326
|
children: [/* @__PURE__ */ C(v, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ C("span", { children: A.provider.phone })]
|
|
326
327
|
})
|
|
327
328
|
]
|
|
328
329
|
}),
|
|
329
330
|
/* @__PURE__ */ w("div", {
|
|
330
|
-
className: "rounded-lg border border-border bg-
|
|
331
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
|
|
331
332
|
children: [/* @__PURE__ */ C("h2", {
|
|
332
|
-
className: "text-base font-semibold text-
|
|
333
|
+
className: "text-base font-semibold text-text-primary mb-5",
|
|
333
334
|
children: "Booking Timeline"
|
|
334
335
|
}), /* @__PURE__ */ C("div", {
|
|
335
336
|
className: "relative",
|
|
@@ -340,16 +341,16 @@ function D() {
|
|
|
340
341
|
children: [/* @__PURE__ */ w("div", {
|
|
341
342
|
className: "flex flex-col items-center",
|
|
342
343
|
children: [/* @__PURE__ */ C("div", {
|
|
343
|
-
className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full", i ? "bg-
|
|
344
|
+
className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full", i ? "bg-status-error-bg-subtle/10 text-status-error-text" : e.completed ? "bg-status-success-bg-subtle/10 text-status-success-text" : "bg-bg-sunken text-text-secondary"),
|
|
344
345
|
children: /* @__PURE__ */ C(a, { className: "h-4 w-4" })
|
|
345
|
-
}), !r && /* @__PURE__ */ C("div", { className: t("w-0.5 flex-1 my-1", e.completed ? "bg-
|
|
346
|
+
}), !r && /* @__PURE__ */ C("div", { className: t("w-0.5 flex-1 my-1", e.completed ? "bg-status-success-bg-subtle/30" : "bg-border") })]
|
|
346
347
|
}), /* @__PURE__ */ w("div", {
|
|
347
348
|
className: t("pb-6", r && "pb-0"),
|
|
348
349
|
children: [/* @__PURE__ */ C("p", {
|
|
349
|
-
className: "text-sm font-medium text-
|
|
350
|
+
className: "text-sm font-medium text-text-primary",
|
|
350
351
|
children: e.label
|
|
351
352
|
}), /* @__PURE__ */ C("p", {
|
|
352
|
-
className: "mt-0.5 text-xs text-
|
|
353
|
+
className: "mt-0.5 text-xs text-text-secondary",
|
|
353
354
|
children: e.timestamp ? o(e.timestamp) : "Pending"
|
|
354
355
|
})]
|
|
355
356
|
})]
|
|
@@ -364,7 +365,7 @@ function D() {
|
|
|
364
365
|
onClick: () => {
|
|
365
366
|
j("Support team will contact you shortly.");
|
|
366
367
|
},
|
|
367
|
-
className: "flex-1 flex items-center justify-center gap-2 rounded-lg border border-border px-4 py-3 text-sm font-medium text-
|
|
368
|
+
className: "flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
368
369
|
children: [/* @__PURE__ */ C(g, { className: "h-4 w-4" }), "Contact Support"]
|
|
369
370
|
}), N && /* @__PURE__ */ w("button", {
|
|
370
371
|
type: "button",
|
|
@@ -380,10 +381,10 @@ function D() {
|
|
|
380
381
|
className: "space-y-6",
|
|
381
382
|
children: [
|
|
382
383
|
/* @__PURE__ */ w("div", {
|
|
383
|
-
className: "rounded-lg border border-border bg-
|
|
384
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
384
385
|
children: [
|
|
385
386
|
/* @__PURE__ */ C("h3", {
|
|
386
|
-
className: "text-base font-semibold text-
|
|
387
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
387
388
|
children: "Cart Information"
|
|
388
389
|
}),
|
|
389
390
|
/* @__PURE__ */ w("div", {
|
|
@@ -396,23 +397,23 @@ function D() {
|
|
|
396
397
|
className: "min-w-0",
|
|
397
398
|
children: [
|
|
398
399
|
/* @__PURE__ */ C("p", {
|
|
399
|
-
className: "text-sm font-semibold text-
|
|
400
|
+
className: "text-sm font-semibold text-text-primary",
|
|
400
401
|
children: A.provider.name
|
|
401
402
|
}),
|
|
402
403
|
/* @__PURE__ */ C("p", {
|
|
403
|
-
className: "text-xs text-
|
|
404
|
+
className: "text-xs text-text-secondary",
|
|
404
405
|
children: A.provider.category
|
|
405
406
|
}),
|
|
406
407
|
/* @__PURE__ */ w("div", {
|
|
407
408
|
className: "flex items-center gap-1 mt-0.5",
|
|
408
409
|
children: [
|
|
409
|
-
/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-
|
|
410
|
+
/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }),
|
|
410
411
|
/* @__PURE__ */ C("span", {
|
|
411
|
-
className: "text-xs font-medium text-
|
|
412
|
+
className: "text-xs font-medium text-text-primary",
|
|
412
413
|
children: A.provider.rating
|
|
413
414
|
}),
|
|
414
415
|
/* @__PURE__ */ w("span", {
|
|
415
|
-
className: "text-xs text-
|
|
416
|
+
className: "text-xs text-text-secondary",
|
|
416
417
|
children: [
|
|
417
418
|
"(",
|
|
418
419
|
A.provider.reviewCount,
|
|
@@ -428,8 +429,8 @@ function D() {
|
|
|
428
429
|
className: "space-y-2 text-sm mb-4",
|
|
429
430
|
children: /* @__PURE__ */ w("div", {
|
|
430
431
|
className: "flex items-start gap-2",
|
|
431
|
-
children: [/* @__PURE__ */ C(_, { className: "h-4 w-4 text-
|
|
432
|
-
className: "text-
|
|
432
|
+
children: [/* @__PURE__ */ C(_, { className: "h-4 w-4 text-text-secondary shrink-0 mt-0.5" }), /* @__PURE__ */ C("span", {
|
|
433
|
+
className: "text-text-secondary",
|
|
433
434
|
children: A.provider.location
|
|
434
435
|
})]
|
|
435
436
|
})
|
|
@@ -437,25 +438,25 @@ function D() {
|
|
|
437
438
|
/* @__PURE__ */ C("button", {
|
|
438
439
|
type: "button",
|
|
439
440
|
onClick: () => D(`/customer/carts/${A.provider.id}`),
|
|
440
|
-
className: "w-full rounded-lg border border-border px-4 py-2.5 text-sm font-medium text-
|
|
441
|
+
className: "w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
441
442
|
children: "View Cart Menu"
|
|
442
443
|
})
|
|
443
444
|
]
|
|
444
445
|
}),
|
|
445
446
|
/* @__PURE__ */ w("div", {
|
|
446
|
-
className: "rounded-lg border border-border bg-
|
|
447
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
447
448
|
children: [/* @__PURE__ */ C("h3", {
|
|
448
|
-
className: "text-base font-semibold text-
|
|
449
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
449
450
|
children: "Service Location"
|
|
450
451
|
}), /* @__PURE__ */ w("div", {
|
|
451
452
|
className: "flex items-start gap-3",
|
|
452
|
-
children: [/* @__PURE__ */ C(_, { className: "mt-0.5 h-5 w-5 shrink-0 text-
|
|
453
|
+
children: [/* @__PURE__ */ C(_, { className: "mt-0.5 h-5 w-5 shrink-0 text-text-secondary" }), /* @__PURE__ */ w("div", { children: [
|
|
453
454
|
/* @__PURE__ */ C("p", {
|
|
454
|
-
className: "text-sm text-
|
|
455
|
+
className: "text-sm text-text-primary",
|
|
455
456
|
children: A.location.street
|
|
456
457
|
}),
|
|
457
458
|
/* @__PURE__ */ w("p", {
|
|
458
|
-
className: "text-sm text-
|
|
459
|
+
className: "text-sm text-text-secondary",
|
|
459
460
|
children: [
|
|
460
461
|
A.location.area,
|
|
461
462
|
", ",
|
|
@@ -465,16 +466,16 @@ function D() {
|
|
|
465
466
|
]
|
|
466
467
|
}),
|
|
467
468
|
A.location.landmark && /* @__PURE__ */ w("p", {
|
|
468
|
-
className: "text-xs text-
|
|
469
|
+
className: "text-xs text-text-secondary mt-1",
|
|
469
470
|
children: ["Landmark: ", A.location.landmark]
|
|
470
471
|
})
|
|
471
472
|
] })]
|
|
472
473
|
})]
|
|
473
474
|
}),
|
|
474
475
|
/* @__PURE__ */ w("div", {
|
|
475
|
-
className: "rounded-lg border border-border bg-
|
|
476
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
476
477
|
children: [/* @__PURE__ */ C("h3", {
|
|
477
|
-
className: "text-base font-semibold text-
|
|
478
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
478
479
|
children: "Price Breakdown"
|
|
479
480
|
}), /* @__PURE__ */ w("div", {
|
|
480
481
|
className: "space-y-2.5 text-sm",
|
|
@@ -482,50 +483,50 @@ function D() {
|
|
|
482
483
|
/* @__PURE__ */ w("div", {
|
|
483
484
|
className: "flex justify-between",
|
|
484
485
|
children: [/* @__PURE__ */ C("span", {
|
|
485
|
-
className: "text-
|
|
486
|
+
className: "text-text-secondary",
|
|
486
487
|
children: "Service Charge"
|
|
487
488
|
}), /* @__PURE__ */ C("span", {
|
|
488
|
-
className: "text-
|
|
489
|
+
className: "text-text-primary",
|
|
489
490
|
children: a(A.pricing.serviceCharge, { minimumFractionDigits: 0 })
|
|
490
491
|
})]
|
|
491
492
|
}),
|
|
492
493
|
/* @__PURE__ */ w("div", {
|
|
493
494
|
className: "flex justify-between",
|
|
494
495
|
children: [/* @__PURE__ */ C("span", {
|
|
495
|
-
className: "text-
|
|
496
|
+
className: "text-text-secondary",
|
|
496
497
|
children: "Convenience Fee"
|
|
497
498
|
}), /* @__PURE__ */ C("span", {
|
|
498
|
-
className: "text-
|
|
499
|
+
className: "text-text-primary",
|
|
499
500
|
children: a(A.pricing.convenienceFee, { minimumFractionDigits: 0 })
|
|
500
501
|
})]
|
|
501
502
|
}),
|
|
502
503
|
/* @__PURE__ */ w("div", {
|
|
503
504
|
className: "flex justify-between",
|
|
504
505
|
children: [/* @__PURE__ */ C("span", {
|
|
505
|
-
className: "text-
|
|
506
|
+
className: "text-text-secondary",
|
|
506
507
|
children: "Tax"
|
|
507
508
|
}), /* @__PURE__ */ C("span", {
|
|
508
|
-
className: "text-
|
|
509
|
+
className: "text-text-primary",
|
|
509
510
|
children: a(A.pricing.tax, { minimumFractionDigits: 0 })
|
|
510
511
|
})]
|
|
511
512
|
}),
|
|
512
513
|
A.pricing.discount > 0 && /* @__PURE__ */ w("div", {
|
|
513
514
|
className: "flex justify-between",
|
|
514
515
|
children: [/* @__PURE__ */ C("span", {
|
|
515
|
-
className: "text-
|
|
516
|
+
className: "text-status-success-text",
|
|
516
517
|
children: "Discount"
|
|
517
518
|
}), /* @__PURE__ */ w("span", {
|
|
518
|
-
className: "text-
|
|
519
|
+
className: "text-status-success-text",
|
|
519
520
|
children: ["-", a(A.pricing.discount, { minimumFractionDigits: 0 })]
|
|
520
521
|
})]
|
|
521
522
|
}),
|
|
522
523
|
/* @__PURE__ */ w("div", {
|
|
523
|
-
className: "flex justify-between border-t border-border pt-2.5",
|
|
524
|
+
className: "flex justify-between border-t border-border-subtle pt-2.5",
|
|
524
525
|
children: [/* @__PURE__ */ C("span", {
|
|
525
|
-
className: "font-semibold text-
|
|
526
|
+
className: "font-semibold text-text-primary",
|
|
526
527
|
children: "Total"
|
|
527
528
|
}), /* @__PURE__ */ C("span", {
|
|
528
|
-
className: "font-bold text-
|
|
529
|
+
className: "font-bold text-text-primary",
|
|
529
530
|
children: a(A.pricing.total, { minimumFractionDigits: 0 })
|
|
530
531
|
})]
|
|
531
532
|
})
|
|
@@ -533,30 +534,30 @@ function D() {
|
|
|
533
534
|
})]
|
|
534
535
|
}),
|
|
535
536
|
/* @__PURE__ */ w("div", {
|
|
536
|
-
className: "rounded-lg border border-border bg-
|
|
537
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
|
|
537
538
|
children: [/* @__PURE__ */ C("h3", {
|
|
538
|
-
className: "text-base font-semibold text-
|
|
539
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
539
540
|
children: "Booking Info"
|
|
540
541
|
}), /* @__PURE__ */ w("div", {
|
|
541
542
|
className: "space-y-3",
|
|
542
543
|
children: [
|
|
543
544
|
/* @__PURE__ */ w("div", {
|
|
544
545
|
className: "flex items-center gap-2",
|
|
545
|
-
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-
|
|
546
|
-
className: "text-xs text-
|
|
546
|
+
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
547
|
+
className: "text-xs text-text-secondary",
|
|
547
548
|
children: "Booked On"
|
|
548
549
|
}), /* @__PURE__ */ C("p", {
|
|
549
|
-
className: "text-sm text-
|
|
550
|
+
className: "text-sm text-text-primary",
|
|
550
551
|
children: o(A.createdAt)
|
|
551
552
|
})] })]
|
|
552
553
|
}),
|
|
553
554
|
/* @__PURE__ */ w("div", {
|
|
554
555
|
className: "flex items-center gap-2",
|
|
555
|
-
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-
|
|
556
|
-
className: "text-xs text-
|
|
556
|
+
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
557
|
+
className: "text-xs text-text-secondary",
|
|
557
558
|
children: "Scheduled"
|
|
558
559
|
}), /* @__PURE__ */ w("p", {
|
|
559
|
-
className: "text-sm text-
|
|
560
|
+
className: "text-sm text-text-primary",
|
|
560
561
|
children: [
|
|
561
562
|
A.scheduledDate,
|
|
562
563
|
" at ",
|
|
@@ -566,11 +567,11 @@ function D() {
|
|
|
566
567
|
}),
|
|
567
568
|
/* @__PURE__ */ w("div", {
|
|
568
569
|
className: "flex items-center gap-2",
|
|
569
|
-
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-
|
|
570
|
-
className: "text-xs text-
|
|
570
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
571
|
+
className: "text-xs text-text-secondary",
|
|
571
572
|
children: "Duration"
|
|
572
573
|
}), /* @__PURE__ */ w("p", {
|
|
573
|
-
className: "text-sm text-
|
|
574
|
+
className: "text-sm text-text-primary",
|
|
574
575
|
children: [A.duration, " minutes"]
|
|
575
576
|
})] })]
|
|
576
577
|
})
|
|
@@ -579,7 +580,7 @@ function D() {
|
|
|
579
580
|
}),
|
|
580
581
|
P && /* @__PURE__ */ w("button", {
|
|
581
582
|
type: "button",
|
|
582
|
-
className: "w-full inline-flex items-center justify-center gap-2 rounded-lg border border-
|
|
583
|
+
className: "w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/5 px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle/10 transition-colors",
|
|
583
584
|
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4" }), "Cancel Booking"]
|
|
584
585
|
})
|
|
585
586
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module adaptercloud/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-green-500/30 bg-green-500/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400 shrink-0\" />\n <p className=\"text-sm text-green-600 dark:text-green-400\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <h2 className=\"text-lg font-semibold text-foreground\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-muted-foreground\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-muted p-3\">\n <p className=\"text-xs text-muted-foreground mb-1\">Notes</p>\n <p className=\"text-sm text-foreground\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-red-500/5 border border-red-500/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n <p className=\"text-xs font-medium text-red-600 dark:text-red-400\">\n Cancellation Reason\n </p>\n </div>\n <p className=\"text-sm text-foreground\">{booking.cancellationReason}</p>\n </div>\n )}\n </div>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <h2 className=\"text-base font-semibold text-foreground mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted text-muted-foreground\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{booking.provider.name}</p>\n <p className=\"text-xs text-muted-foreground\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-foreground\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted text-muted-foreground hover:bg-accent hover:text-foreground transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-muted-foreground\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border bg-card p-6\">\n <h2 className=\"text-base font-semibold text-foreground mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-red-500/10 text-red-600 dark:text-red-400'\n : event.completed\n ? 'bg-green-500/10 text-green-600 dark:text-green-400'\n : 'bg-muted text-muted-foreground'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-green-500/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-foreground\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border px-4 py-3 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border bg-card p-5\">\n <h3 className=\"text-base font-semibold text-foreground mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{booking.provider.name}</p>\n <p className=\"text-xs text-muted-foreground\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-foreground\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-muted-foreground shrink-0 mt-0.5\" />\n <span className=\"text-muted-foreground\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border px-4 py-2.5 text-sm font-medium text-foreground hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border bg-card p-5\">\n <h3 className=\"text-base font-semibold text-foreground mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-muted-foreground\" />\n <div>\n <p className=\"text-sm text-foreground\">{booking.location.street}</p>\n <p className=\"text-sm text-muted-foreground\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-muted-foreground mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border bg-card p-5\">\n <h3 className=\"text-base font-semibold text-foreground mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Service Charge</span>\n <span className=\"text-foreground\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Convenience Fee</span>\n <span className=\"text-foreground\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Tax</span>\n <span className=\"text-foreground\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border pt-2.5\">\n <span className=\"font-semibold text-foreground\">Total</span>\n <span className=\"font-bold text-foreground\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border bg-card p-5\">\n <h3 className=\"text-base font-semibold text-foreground mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <p className=\"text-xs text-muted-foreground\">Booked On</p>\n <p className=\"text-sm text-foreground\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <p className=\"text-xs text-muted-foreground\">Scheduled</p>\n <p className=\"text-sm text-foreground\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <p className=\"text-xs text-muted-foreground\">Duration</p>\n <p className=\"text-sm text-foreground\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-red-500/30 bg-red-500/5 px-4 py-3 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-500/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module adaptercloud/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from'react';\nimport { useParams } from'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { StatusBadge } from'../../components/StatusBadge';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID\"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n <p className=\"text-sm text-status-success-text\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary mb-1\">Notes</p>\n <p className=\"text-sm text-text-primary\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-status-error-bg-subtle/5 border border-status-error-border/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-status-error-text\" />\n <p className=\"text-xs font-medium text-status-error-text\">\n Cancellation Reason\n </p>\n </div>\n <p className=\"text-sm text-text-primary\">{booking.cancellationReason}</p>\n </div>\n )}\n </div>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-text-secondary\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-status-error-bg-subtle/10 text-status-error-text'\n : event.completed\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg-subtle/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-text-secondary\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <span className=\"text-text-secondary\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm text-text-primary\">{booking.location.street}</p>\n <p className=\"text-sm text-text-secondary\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service Charge</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Convenience Fee</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Scheduled</p>\n <p className=\"text-sm text-text-primary\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n <p className=\"text-sm text-text-primary\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/5 px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|