@burdenoff/microfe-adaptercloud 2026.614.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/README.md +12 -0
- package/dist/adaptercloud/AdapterCloudRoot.js +177 -0
- package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -0
- package/dist/adaptercloud/AdapterCloudRoutes.js +215 -0
- package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -0
- package/dist/adaptercloud/components/EmptyState.js +28 -0
- package/dist/adaptercloud/components/EmptyState.js.map +1 -0
- package/dist/adaptercloud/components/InvestmentCard.js +96 -0
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -0
- package/dist/adaptercloud/components/MetricsCard.js +46 -0
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -0
- package/dist/adaptercloud/components/PageLayout.js +26 -0
- package/dist/adaptercloud/components/PageLayout.js.map +1 -0
- package/dist/adaptercloud/components/RatingDisplay.js +35 -0
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -0
- package/dist/adaptercloud/components/StatusBadge.js +45 -0
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -0
- package/dist/adaptercloud/context/AdapterCloudContext.js +93 -0
- package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -0
- package/dist/adaptercloud/context/index.js +1 -0
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js +223 -0
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -0
- package/dist/adaptercloud/index.js +7 -0
- package/dist/adaptercloud/mocks/data.js +1517 -0
- package/dist/adaptercloud/mocks/data.js.map +1 -0
- package/dist/adaptercloud/mocks/users.js +34 -0
- package/dist/adaptercloud/mocks/users.js.map +1 -0
- package/dist/adaptercloud/pages/HomePage.js +921 -0
- package/dist/adaptercloud/pages/HomePage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +645 -0
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +639 -0
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +421 -0
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +660 -0
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +259 -0
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +649 -0
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +869 -0
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +893 -0
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +834 -0
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +700 -0
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +760 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +886 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +631 -0
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +913 -0
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +881 -0
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +833 -0
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +1325 -0
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +665 -0
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/SettingsPage.js +964 -0
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +593 -0
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +620 -0
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +547 -0
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +532 -0
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +496 -0
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +621 -0
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +623 -0
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +477 -0
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +438 -0
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +388 -0
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +488 -0
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +606 -0
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +443 -0
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +849 -0
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +939 -0
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +681 -0
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +419 -0
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +399 -0
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +569 -0
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +1065 -0
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +496 -0
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +634 -0
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +675 -0
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +687 -0
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +578 -0
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -0
- package/dist/adaptercloud/store/adaptercloudStore.js +38 -0
- package/dist/adaptercloud/store/adaptercloudStore.js.map +1 -0
- package/dist/adaptercloud/store/index.js +1 -0
- package/dist/adaptercloud/utils/cn.js +10 -0
- package/dist/adaptercloud/utils/cn.js.map +1 -0
- package/dist/adaptercloud/utils/formatters.js +51 -0
- package/dist/adaptercloud/utils/formatters.js.map +1 -0
- package/dist/adaptercloud/utils/navigation.js +9 -0
- package/dist/adaptercloud/utils/navigation.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { useAdapterCloud as e } from "../../context/AdapterCloudContext.js";
|
|
2
|
+
import { cn as t } from "../../utils/cn.js";
|
|
3
|
+
import { PageLayout as n } from "../../components/PageLayout.js";
|
|
4
|
+
import { StatusBadge as r } from "../../components/StatusBadge.js";
|
|
5
|
+
import { EmptyState as i } from "../../components/EmptyState.js";
|
|
6
|
+
import { formatCurrency as a, formatDate as o } from "../../utils/formatters.js";
|
|
7
|
+
import { useMemo as s, useState as c } from "react";
|
|
8
|
+
import { AlertTriangle as l, ArrowLeft as u, Calendar as d, CalendarCheck as f, CheckCircle2 as p, Circle as m, Clock as h, Headphones as g, MapPin as _, Phone as v, ShoppingBag as y, Star as b, XCircle as x } from "lucide-react";
|
|
9
|
+
import { useParams as S } from "react-router-dom";
|
|
10
|
+
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
11
|
+
//#region src/adaptercloud/pages/customer/BookingDetailsPage.tsx
|
|
12
|
+
var T = [
|
|
13
|
+
{
|
|
14
|
+
id: "BK-001",
|
|
15
|
+
serviceName: "Men's Haircut + Beard Trim",
|
|
16
|
+
serviceDescription: "Professional haircut and beard grooming service at your doorstep",
|
|
17
|
+
provider: {
|
|
18
|
+
id: "SERV-001",
|
|
19
|
+
name: "Quick Cuts Salon",
|
|
20
|
+
phone: "+91-9876543210",
|
|
21
|
+
rating: 4.6,
|
|
22
|
+
reviewCount: 248,
|
|
23
|
+
category: "Personal Care & Beauty",
|
|
24
|
+
image: "https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400",
|
|
25
|
+
location: "Indiranagar, Bangalore"
|
|
26
|
+
},
|
|
27
|
+
scheduledDate: "2024-01-20",
|
|
28
|
+
scheduledTime: "10:00 AM",
|
|
29
|
+
duration: 50,
|
|
30
|
+
status: "confirmed",
|
|
31
|
+
location: {
|
|
32
|
+
street: "123 Main Street",
|
|
33
|
+
area: "Koramangala",
|
|
34
|
+
city: "Bangalore",
|
|
35
|
+
pincode: "560034",
|
|
36
|
+
landmark: "Near Metro Station"
|
|
37
|
+
},
|
|
38
|
+
pricing: {
|
|
39
|
+
serviceCharge: 450,
|
|
40
|
+
convenienceFee: 30,
|
|
41
|
+
tax: 48,
|
|
42
|
+
discount: 50,
|
|
43
|
+
total: 478
|
|
44
|
+
},
|
|
45
|
+
createdAt: "2024-01-16T14:30:00Z",
|
|
46
|
+
notes: "Please bring your own equipment",
|
|
47
|
+
timeline: [
|
|
48
|
+
{
|
|
49
|
+
status: "booked",
|
|
50
|
+
label: "Booking Placed",
|
|
51
|
+
timestamp: "2024-01-16T14:30:00Z",
|
|
52
|
+
completed: !0
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
status: "confirmed",
|
|
56
|
+
label: "Booking Confirmed",
|
|
57
|
+
timestamp: "2024-01-16T14:35:00Z",
|
|
58
|
+
completed: !0
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
status: "in_progress",
|
|
62
|
+
label: "Service Started",
|
|
63
|
+
timestamp: null,
|
|
64
|
+
completed: !1
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
status: "completed",
|
|
68
|
+
label: "Service Completed",
|
|
69
|
+
timestamp: null,
|
|
70
|
+
completed: !1
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "BK-002",
|
|
76
|
+
serviceName: "Deep House Cleaning",
|
|
77
|
+
serviceDescription: "Complete house cleaning service including kitchen, bathrooms, and living areas",
|
|
78
|
+
provider: {
|
|
79
|
+
id: "SERV-005",
|
|
80
|
+
name: "Spotless Cleaning Services",
|
|
81
|
+
phone: "+91-9876543215",
|
|
82
|
+
rating: 4.8,
|
|
83
|
+
reviewCount: 312,
|
|
84
|
+
category: "Home Services",
|
|
85
|
+
image: "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400",
|
|
86
|
+
location: "Whitefield, Bangalore"
|
|
87
|
+
},
|
|
88
|
+
scheduledDate: "2024-01-18",
|
|
89
|
+
scheduledTime: "09:00 AM",
|
|
90
|
+
duration: 180,
|
|
91
|
+
status: "completed",
|
|
92
|
+
location: {
|
|
93
|
+
street: "456 Park Avenue",
|
|
94
|
+
area: "Indiranagar",
|
|
95
|
+
city: "Bangalore",
|
|
96
|
+
pincode: "560038"
|
|
97
|
+
},
|
|
98
|
+
pricing: {
|
|
99
|
+
serviceCharge: 1500,
|
|
100
|
+
convenienceFee: 50,
|
|
101
|
+
tax: 155,
|
|
102
|
+
discount: 0,
|
|
103
|
+
total: 1705
|
|
104
|
+
},
|
|
105
|
+
createdAt: "2024-01-15T10:00:00Z",
|
|
106
|
+
timeline: [
|
|
107
|
+
{
|
|
108
|
+
status: "booked",
|
|
109
|
+
label: "Booking Placed",
|
|
110
|
+
timestamp: "2024-01-15T10:00:00Z",
|
|
111
|
+
completed: !0
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
status: "confirmed",
|
|
115
|
+
label: "Booking Confirmed",
|
|
116
|
+
timestamp: "2024-01-15T10:05:00Z",
|
|
117
|
+
completed: !0
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
status: "in_progress",
|
|
121
|
+
label: "Service Started",
|
|
122
|
+
timestamp: "2024-01-18T09:10:00Z",
|
|
123
|
+
completed: !0
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
status: "completed",
|
|
127
|
+
label: "Service Completed",
|
|
128
|
+
timestamp: "2024-01-18T12:15:00Z",
|
|
129
|
+
completed: !0
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "BK-003",
|
|
135
|
+
serviceName: "Facial Treatment",
|
|
136
|
+
serviceDescription: "Deep cleansing facial with natural ingredients for glowing skin",
|
|
137
|
+
provider: {
|
|
138
|
+
id: "SERV-002",
|
|
139
|
+
name: "Glow Beauty Services",
|
|
140
|
+
phone: "+91-9876543212",
|
|
141
|
+
rating: 4.7,
|
|
142
|
+
reviewCount: 180,
|
|
143
|
+
category: "Personal Care & Beauty",
|
|
144
|
+
image: "https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400",
|
|
145
|
+
location: "HSR Layout, Bangalore"
|
|
146
|
+
},
|
|
147
|
+
scheduledDate: "2024-01-22",
|
|
148
|
+
scheduledTime: "02:00 PM",
|
|
149
|
+
duration: 60,
|
|
150
|
+
status: "cancelled",
|
|
151
|
+
location: {
|
|
152
|
+
street: "789 Lake View",
|
|
153
|
+
area: "HSR Layout",
|
|
154
|
+
city: "Bangalore",
|
|
155
|
+
pincode: "560102"
|
|
156
|
+
},
|
|
157
|
+
pricing: {
|
|
158
|
+
serviceCharge: 800,
|
|
159
|
+
convenienceFee: 30,
|
|
160
|
+
tax: 83,
|
|
161
|
+
discount: 0,
|
|
162
|
+
total: 913
|
|
163
|
+
},
|
|
164
|
+
createdAt: "2024-01-17T16:00:00Z",
|
|
165
|
+
cancellationReason: "Schedule conflict - need to reschedule",
|
|
166
|
+
timeline: [
|
|
167
|
+
{
|
|
168
|
+
status: "booked",
|
|
169
|
+
label: "Booking Placed",
|
|
170
|
+
timestamp: "2024-01-17T16:00:00Z",
|
|
171
|
+
completed: !0
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
status: "confirmed",
|
|
175
|
+
label: "Booking Confirmed",
|
|
176
|
+
timestamp: "2024-01-17T16:10:00Z",
|
|
177
|
+
completed: !0
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
status: "cancelled",
|
|
181
|
+
label: "Booking Cancelled",
|
|
182
|
+
timestamp: "2024-01-18T09:00:00Z",
|
|
183
|
+
completed: !0
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
], E = (e) => T.find((t) => t.id === e);
|
|
188
|
+
function D() {
|
|
189
|
+
let { bookingId: T } = S(), { navigateTo: D } = e(), [O, k] = c(null), A = s(() => T ? E(T) : void 0, [T]), j = (e) => {
|
|
190
|
+
k(e), setTimeout(() => k(null), 3e3);
|
|
191
|
+
};
|
|
192
|
+
if (!A) return /* @__PURE__ */ C(n, {
|
|
193
|
+
title: "Booking Not Found",
|
|
194
|
+
children: /* @__PURE__ */ C(i, {
|
|
195
|
+
icon: /* @__PURE__ */ C(f, { className: "h-12 w-12" }),
|
|
196
|
+
title: "Booking not found",
|
|
197
|
+
description: `No booking found with ID "${T}".`,
|
|
198
|
+
action: /* @__PURE__ */ C("button", {
|
|
199
|
+
type: "button",
|
|
200
|
+
onClick: () => D("/customer/dashboard"),
|
|
201
|
+
className: "rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity",
|
|
202
|
+
children: "Go to Dashboard"
|
|
203
|
+
})
|
|
204
|
+
})
|
|
205
|
+
});
|
|
206
|
+
let M = A.status === "cancelled", N = A.status === "completed", P = !M && !N;
|
|
207
|
+
return /* @__PURE__ */ w(n, {
|
|
208
|
+
title: /* @__PURE__ */ w("div", {
|
|
209
|
+
className: "flex items-center gap-3",
|
|
210
|
+
children: [/* @__PURE__ */ C("button", {
|
|
211
|
+
type: "button",
|
|
212
|
+
onClick: () => D("/customer/dashboard"),
|
|
213
|
+
className: "rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
|
|
214
|
+
children: /* @__PURE__ */ C(u, { className: "h-5 w-5" })
|
|
215
|
+
}), /* @__PURE__ */ w("span", { children: ["Booking #", A.id] })]
|
|
216
|
+
}),
|
|
217
|
+
actions: /* @__PURE__ */ C(r, { status: A.status }),
|
|
218
|
+
children: [O && /* @__PURE__ */ w("div", {
|
|
219
|
+
className: "mb-4 rounded-lg border border-green-500/30 bg-green-500/10 p-3 flex items-center gap-2",
|
|
220
|
+
children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-green-600 dark:text-green-400 shrink-0" }), /* @__PURE__ */ C("p", {
|
|
221
|
+
className: "text-sm text-green-600 dark:text-green-400",
|
|
222
|
+
children: O
|
|
223
|
+
})]
|
|
224
|
+
}), /* @__PURE__ */ w("div", {
|
|
225
|
+
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
226
|
+
children: [/* @__PURE__ */ w("div", {
|
|
227
|
+
className: "lg:col-span-2 space-y-6",
|
|
228
|
+
children: [
|
|
229
|
+
/* @__PURE__ */ w("div", {
|
|
230
|
+
className: "rounded-lg border border-border bg-card p-6",
|
|
231
|
+
children: [
|
|
232
|
+
/* @__PURE__ */ C("h2", {
|
|
233
|
+
className: "text-lg font-semibold text-foreground",
|
|
234
|
+
children: A.serviceName
|
|
235
|
+
}),
|
|
236
|
+
/* @__PURE__ */ C("p", {
|
|
237
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
238
|
+
children: A.serviceDescription
|
|
239
|
+
}),
|
|
240
|
+
/* @__PURE__ */ w("div", {
|
|
241
|
+
className: "mt-4 flex flex-wrap gap-4 text-sm text-muted-foreground",
|
|
242
|
+
children: [
|
|
243
|
+
/* @__PURE__ */ w("div", {
|
|
244
|
+
className: "flex items-center gap-1.5",
|
|
245
|
+
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: A.scheduledDate })]
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ w("div", {
|
|
248
|
+
className: "flex items-center gap-1.5",
|
|
249
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: A.scheduledTime })]
|
|
250
|
+
}),
|
|
251
|
+
/* @__PURE__ */ w("div", {
|
|
252
|
+
className: "flex items-center gap-1.5",
|
|
253
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ w("span", { children: [A.duration, " min"] })]
|
|
254
|
+
})
|
|
255
|
+
]
|
|
256
|
+
}),
|
|
257
|
+
A.notes && /* @__PURE__ */ w("div", {
|
|
258
|
+
className: "mt-4 rounded-md bg-muted p-3",
|
|
259
|
+
children: [/* @__PURE__ */ C("p", {
|
|
260
|
+
className: "text-xs text-muted-foreground mb-1",
|
|
261
|
+
children: "Notes"
|
|
262
|
+
}), /* @__PURE__ */ C("p", {
|
|
263
|
+
className: "text-sm text-foreground",
|
|
264
|
+
children: A.notes
|
|
265
|
+
})]
|
|
266
|
+
}),
|
|
267
|
+
A.cancellationReason && /* @__PURE__ */ w("div", {
|
|
268
|
+
className: "mt-4 rounded-md bg-red-500/5 border border-red-500/20 p-3",
|
|
269
|
+
children: [/* @__PURE__ */ w("div", {
|
|
270
|
+
className: "flex items-center gap-2 mb-1",
|
|
271
|
+
children: [/* @__PURE__ */ C(l, { className: "h-3.5 w-3.5 text-red-600 dark:text-red-400" }), /* @__PURE__ */ C("p", {
|
|
272
|
+
className: "text-xs font-medium text-red-600 dark:text-red-400",
|
|
273
|
+
children: "Cancellation Reason"
|
|
274
|
+
})]
|
|
275
|
+
}), /* @__PURE__ */ C("p", {
|
|
276
|
+
className: "text-sm text-foreground",
|
|
277
|
+
children: A.cancellationReason
|
|
278
|
+
})]
|
|
279
|
+
})
|
|
280
|
+
]
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ w("div", {
|
|
283
|
+
className: "rounded-lg border border-border bg-card p-6",
|
|
284
|
+
children: [
|
|
285
|
+
/* @__PURE__ */ C("h2", {
|
|
286
|
+
className: "text-base font-semibold text-foreground mb-4",
|
|
287
|
+
children: "Service Provider"
|
|
288
|
+
}),
|
|
289
|
+
/* @__PURE__ */ w("div", {
|
|
290
|
+
className: "flex items-center gap-4",
|
|
291
|
+
children: [
|
|
292
|
+
/* @__PURE__ */ C("div", {
|
|
293
|
+
className: "flex h-12 w-12 items-center justify-center rounded-full bg-muted text-muted-foreground",
|
|
294
|
+
children: /* @__PURE__ */ C(y, { className: "h-6 w-6" })
|
|
295
|
+
}),
|
|
296
|
+
/* @__PURE__ */ w("div", {
|
|
297
|
+
className: "flex-1 min-w-0",
|
|
298
|
+
children: [
|
|
299
|
+
/* @__PURE__ */ C("p", {
|
|
300
|
+
className: "text-sm font-semibold text-foreground",
|
|
301
|
+
children: A.provider.name
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ C("p", {
|
|
304
|
+
className: "text-xs text-muted-foreground",
|
|
305
|
+
children: A.provider.category
|
|
306
|
+
}),
|
|
307
|
+
/* @__PURE__ */ w("div", {
|
|
308
|
+
className: "flex items-center gap-1 mt-1",
|
|
309
|
+
children: [/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), /* @__PURE__ */ C("span", {
|
|
310
|
+
className: "text-xs font-medium text-foreground",
|
|
311
|
+
children: A.provider.rating
|
|
312
|
+
})]
|
|
313
|
+
})
|
|
314
|
+
]
|
|
315
|
+
}),
|
|
316
|
+
/* @__PURE__ */ C("a", {
|
|
317
|
+
href: `tel:${A.provider.phone}`,
|
|
318
|
+
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",
|
|
319
|
+
children: /* @__PURE__ */ C(v, { className: "h-4 w-4" })
|
|
320
|
+
})
|
|
321
|
+
]
|
|
322
|
+
}),
|
|
323
|
+
/* @__PURE__ */ w("div", {
|
|
324
|
+
className: "mt-3 flex items-center gap-2 text-sm text-muted-foreground",
|
|
325
|
+
children: [/* @__PURE__ */ C(v, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ C("span", { children: A.provider.phone })]
|
|
326
|
+
})
|
|
327
|
+
]
|
|
328
|
+
}),
|
|
329
|
+
/* @__PURE__ */ w("div", {
|
|
330
|
+
className: "rounded-lg border border-border bg-card p-6",
|
|
331
|
+
children: [/* @__PURE__ */ C("h2", {
|
|
332
|
+
className: "text-base font-semibold text-foreground mb-5",
|
|
333
|
+
children: "Booking Timeline"
|
|
334
|
+
}), /* @__PURE__ */ C("div", {
|
|
335
|
+
className: "relative",
|
|
336
|
+
children: A.timeline.map((e, n) => {
|
|
337
|
+
let r = n === A.timeline.length - 1, i = e.status === "cancelled", a = i ? x : e.completed ? p : m;
|
|
338
|
+
return /* @__PURE__ */ w("div", {
|
|
339
|
+
className: "flex gap-4",
|
|
340
|
+
children: [/* @__PURE__ */ w("div", {
|
|
341
|
+
className: "flex flex-col items-center",
|
|
342
|
+
children: [/* @__PURE__ */ C("div", {
|
|
343
|
+
className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full", i ? "bg-red-500/10 text-red-600 dark:text-red-400" : e.completed ? "bg-green-500/10 text-green-600 dark:text-green-400" : "bg-muted text-muted-foreground"),
|
|
344
|
+
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-green-500/30" : "bg-border") })]
|
|
346
|
+
}), /* @__PURE__ */ w("div", {
|
|
347
|
+
className: t("pb-6", r && "pb-0"),
|
|
348
|
+
children: [/* @__PURE__ */ C("p", {
|
|
349
|
+
className: "text-sm font-medium text-foreground",
|
|
350
|
+
children: e.label
|
|
351
|
+
}), /* @__PURE__ */ C("p", {
|
|
352
|
+
className: "mt-0.5 text-xs text-muted-foreground",
|
|
353
|
+
children: e.timestamp ? o(e.timestamp) : "Pending"
|
|
354
|
+
})]
|
|
355
|
+
})]
|
|
356
|
+
}, `${e.status}-${n}`);
|
|
357
|
+
})
|
|
358
|
+
})]
|
|
359
|
+
}),
|
|
360
|
+
/* @__PURE__ */ w("div", {
|
|
361
|
+
className: "flex flex-col sm:flex-row gap-3",
|
|
362
|
+
children: [/* @__PURE__ */ w("button", {
|
|
363
|
+
type: "button",
|
|
364
|
+
onClick: () => {
|
|
365
|
+
j("Support team will contact you shortly.");
|
|
366
|
+
},
|
|
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-foreground hover:bg-accent transition-colors",
|
|
368
|
+
children: [/* @__PURE__ */ C(g, { className: "h-4 w-4" }), "Contact Support"]
|
|
369
|
+
}), N && /* @__PURE__ */ w("button", {
|
|
370
|
+
type: "button",
|
|
371
|
+
onClick: () => {
|
|
372
|
+
j("Thank you! Rating feature coming soon.");
|
|
373
|
+
},
|
|
374
|
+
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",
|
|
375
|
+
children: [/* @__PURE__ */ C(b, { className: "h-4 w-4" }), "Rate Service"]
|
|
376
|
+
})]
|
|
377
|
+
})
|
|
378
|
+
]
|
|
379
|
+
}), /* @__PURE__ */ w("div", {
|
|
380
|
+
className: "space-y-6",
|
|
381
|
+
children: [
|
|
382
|
+
/* @__PURE__ */ w("div", {
|
|
383
|
+
className: "rounded-lg border border-border bg-card p-5",
|
|
384
|
+
children: [
|
|
385
|
+
/* @__PURE__ */ C("h3", {
|
|
386
|
+
className: "text-base font-semibold text-foreground mb-3",
|
|
387
|
+
children: "Cart Information"
|
|
388
|
+
}),
|
|
389
|
+
/* @__PURE__ */ w("div", {
|
|
390
|
+
className: "flex items-center gap-3 mb-4",
|
|
391
|
+
children: [/* @__PURE__ */ C("img", {
|
|
392
|
+
src: A.provider.image,
|
|
393
|
+
alt: A.provider.name,
|
|
394
|
+
className: "h-14 w-14 rounded-lg object-cover"
|
|
395
|
+
}), /* @__PURE__ */ w("div", {
|
|
396
|
+
className: "min-w-0",
|
|
397
|
+
children: [
|
|
398
|
+
/* @__PURE__ */ C("p", {
|
|
399
|
+
className: "text-sm font-semibold text-foreground",
|
|
400
|
+
children: A.provider.name
|
|
401
|
+
}),
|
|
402
|
+
/* @__PURE__ */ C("p", {
|
|
403
|
+
className: "text-xs text-muted-foreground",
|
|
404
|
+
children: A.provider.category
|
|
405
|
+
}),
|
|
406
|
+
/* @__PURE__ */ w("div", {
|
|
407
|
+
className: "flex items-center gap-1 mt-0.5",
|
|
408
|
+
children: [
|
|
409
|
+
/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }),
|
|
410
|
+
/* @__PURE__ */ C("span", {
|
|
411
|
+
className: "text-xs font-medium text-foreground",
|
|
412
|
+
children: A.provider.rating
|
|
413
|
+
}),
|
|
414
|
+
/* @__PURE__ */ w("span", {
|
|
415
|
+
className: "text-xs text-muted-foreground",
|
|
416
|
+
children: [
|
|
417
|
+
"(",
|
|
418
|
+
A.provider.reviewCount,
|
|
419
|
+
")"
|
|
420
|
+
]
|
|
421
|
+
})
|
|
422
|
+
]
|
|
423
|
+
})
|
|
424
|
+
]
|
|
425
|
+
})]
|
|
426
|
+
}),
|
|
427
|
+
/* @__PURE__ */ C("div", {
|
|
428
|
+
className: "space-y-2 text-sm mb-4",
|
|
429
|
+
children: /* @__PURE__ */ w("div", {
|
|
430
|
+
className: "flex items-start gap-2",
|
|
431
|
+
children: [/* @__PURE__ */ C(_, { className: "h-4 w-4 text-muted-foreground shrink-0 mt-0.5" }), /* @__PURE__ */ C("span", {
|
|
432
|
+
className: "text-muted-foreground",
|
|
433
|
+
children: A.provider.location
|
|
434
|
+
})]
|
|
435
|
+
})
|
|
436
|
+
}),
|
|
437
|
+
/* @__PURE__ */ C("button", {
|
|
438
|
+
type: "button",
|
|
439
|
+
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-foreground hover:bg-accent transition-colors",
|
|
441
|
+
children: "View Cart Menu"
|
|
442
|
+
})
|
|
443
|
+
]
|
|
444
|
+
}),
|
|
445
|
+
/* @__PURE__ */ w("div", {
|
|
446
|
+
className: "rounded-lg border border-border bg-card p-5",
|
|
447
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
448
|
+
className: "text-base font-semibold text-foreground mb-3",
|
|
449
|
+
children: "Service Location"
|
|
450
|
+
}), /* @__PURE__ */ w("div", {
|
|
451
|
+
className: "flex items-start gap-3",
|
|
452
|
+
children: [/* @__PURE__ */ C(_, { className: "mt-0.5 h-5 w-5 shrink-0 text-muted-foreground" }), /* @__PURE__ */ w("div", { children: [
|
|
453
|
+
/* @__PURE__ */ C("p", {
|
|
454
|
+
className: "text-sm text-foreground",
|
|
455
|
+
children: A.location.street
|
|
456
|
+
}),
|
|
457
|
+
/* @__PURE__ */ w("p", {
|
|
458
|
+
className: "text-sm text-muted-foreground",
|
|
459
|
+
children: [
|
|
460
|
+
A.location.area,
|
|
461
|
+
", ",
|
|
462
|
+
A.location.city,
|
|
463
|
+
" - ",
|
|
464
|
+
A.location.pincode
|
|
465
|
+
]
|
|
466
|
+
}),
|
|
467
|
+
A.location.landmark && /* @__PURE__ */ w("p", {
|
|
468
|
+
className: "text-xs text-muted-foreground mt-1",
|
|
469
|
+
children: ["Landmark: ", A.location.landmark]
|
|
470
|
+
})
|
|
471
|
+
] })]
|
|
472
|
+
})]
|
|
473
|
+
}),
|
|
474
|
+
/* @__PURE__ */ w("div", {
|
|
475
|
+
className: "rounded-lg border border-border bg-card p-5",
|
|
476
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
477
|
+
className: "text-base font-semibold text-foreground mb-3",
|
|
478
|
+
children: "Price Breakdown"
|
|
479
|
+
}), /* @__PURE__ */ w("div", {
|
|
480
|
+
className: "space-y-2.5 text-sm",
|
|
481
|
+
children: [
|
|
482
|
+
/* @__PURE__ */ w("div", {
|
|
483
|
+
className: "flex justify-between",
|
|
484
|
+
children: [/* @__PURE__ */ C("span", {
|
|
485
|
+
className: "text-muted-foreground",
|
|
486
|
+
children: "Service Charge"
|
|
487
|
+
}), /* @__PURE__ */ C("span", {
|
|
488
|
+
className: "text-foreground",
|
|
489
|
+
children: a(A.pricing.serviceCharge, { minimumFractionDigits: 0 })
|
|
490
|
+
})]
|
|
491
|
+
}),
|
|
492
|
+
/* @__PURE__ */ w("div", {
|
|
493
|
+
className: "flex justify-between",
|
|
494
|
+
children: [/* @__PURE__ */ C("span", {
|
|
495
|
+
className: "text-muted-foreground",
|
|
496
|
+
children: "Convenience Fee"
|
|
497
|
+
}), /* @__PURE__ */ C("span", {
|
|
498
|
+
className: "text-foreground",
|
|
499
|
+
children: a(A.pricing.convenienceFee, { minimumFractionDigits: 0 })
|
|
500
|
+
})]
|
|
501
|
+
}),
|
|
502
|
+
/* @__PURE__ */ w("div", {
|
|
503
|
+
className: "flex justify-between",
|
|
504
|
+
children: [/* @__PURE__ */ C("span", {
|
|
505
|
+
className: "text-muted-foreground",
|
|
506
|
+
children: "Tax"
|
|
507
|
+
}), /* @__PURE__ */ C("span", {
|
|
508
|
+
className: "text-foreground",
|
|
509
|
+
children: a(A.pricing.tax, { minimumFractionDigits: 0 })
|
|
510
|
+
})]
|
|
511
|
+
}),
|
|
512
|
+
A.pricing.discount > 0 && /* @__PURE__ */ w("div", {
|
|
513
|
+
className: "flex justify-between",
|
|
514
|
+
children: [/* @__PURE__ */ C("span", {
|
|
515
|
+
className: "text-green-600 dark:text-green-400",
|
|
516
|
+
children: "Discount"
|
|
517
|
+
}), /* @__PURE__ */ w("span", {
|
|
518
|
+
className: "text-green-600 dark:text-green-400",
|
|
519
|
+
children: ["-", a(A.pricing.discount, { minimumFractionDigits: 0 })]
|
|
520
|
+
})]
|
|
521
|
+
}),
|
|
522
|
+
/* @__PURE__ */ w("div", {
|
|
523
|
+
className: "flex justify-between border-t border-border pt-2.5",
|
|
524
|
+
children: [/* @__PURE__ */ C("span", {
|
|
525
|
+
className: "font-semibold text-foreground",
|
|
526
|
+
children: "Total"
|
|
527
|
+
}), /* @__PURE__ */ C("span", {
|
|
528
|
+
className: "font-bold text-foreground",
|
|
529
|
+
children: a(A.pricing.total, { minimumFractionDigits: 0 })
|
|
530
|
+
})]
|
|
531
|
+
})
|
|
532
|
+
]
|
|
533
|
+
})]
|
|
534
|
+
}),
|
|
535
|
+
/* @__PURE__ */ w("div", {
|
|
536
|
+
className: "rounded-lg border border-border bg-card p-5",
|
|
537
|
+
children: [/* @__PURE__ */ C("h3", {
|
|
538
|
+
className: "text-base font-semibold text-foreground mb-3",
|
|
539
|
+
children: "Booking Info"
|
|
540
|
+
}), /* @__PURE__ */ w("div", {
|
|
541
|
+
className: "space-y-3",
|
|
542
|
+
children: [
|
|
543
|
+
/* @__PURE__ */ w("div", {
|
|
544
|
+
className: "flex items-center gap-2",
|
|
545
|
+
children: [/* @__PURE__ */ C(f, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
546
|
+
className: "text-xs text-muted-foreground",
|
|
547
|
+
children: "Booked On"
|
|
548
|
+
}), /* @__PURE__ */ C("p", {
|
|
549
|
+
className: "text-sm text-foreground",
|
|
550
|
+
children: o(A.createdAt)
|
|
551
|
+
})] })]
|
|
552
|
+
}),
|
|
553
|
+
/* @__PURE__ */ w("div", {
|
|
554
|
+
className: "flex items-center gap-2",
|
|
555
|
+
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
556
|
+
className: "text-xs text-muted-foreground",
|
|
557
|
+
children: "Scheduled"
|
|
558
|
+
}), /* @__PURE__ */ w("p", {
|
|
559
|
+
className: "text-sm text-foreground",
|
|
560
|
+
children: [
|
|
561
|
+
A.scheduledDate,
|
|
562
|
+
" at ",
|
|
563
|
+
A.scheduledTime
|
|
564
|
+
]
|
|
565
|
+
})] })]
|
|
566
|
+
}),
|
|
567
|
+
/* @__PURE__ */ w("div", {
|
|
568
|
+
className: "flex items-center gap-2",
|
|
569
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
570
|
+
className: "text-xs text-muted-foreground",
|
|
571
|
+
children: "Duration"
|
|
572
|
+
}), /* @__PURE__ */ w("p", {
|
|
573
|
+
className: "text-sm text-foreground",
|
|
574
|
+
children: [A.duration, " minutes"]
|
|
575
|
+
})] })]
|
|
576
|
+
})
|
|
577
|
+
]
|
|
578
|
+
})]
|
|
579
|
+
}),
|
|
580
|
+
P && /* @__PURE__ */ w("button", {
|
|
581
|
+
type: "button",
|
|
582
|
+
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",
|
|
583
|
+
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4" }), "Cancel Booking"]
|
|
584
|
+
})
|
|
585
|
+
]
|
|
586
|
+
})]
|
|
587
|
+
})]
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
//#endregion
|
|
591
|
+
export { D as BookingDetailsPage };
|
|
592
|
+
|
|
593
|
+
//# sourceMappingURL=BookingDetailsPage.js.map
|
|
@@ -0,0 +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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"}
|