@burdenoff/microfe-subscriberbot 2026.624.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/subscriberbot/components/EmptyState.js +17 -10
- package/dist/subscriberbot/components/EmptyState.js.map +1 -1
- package/dist/subscriberbot/components/InvestmentCard.js +23 -22
- package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
- package/dist/subscriberbot/components/MetricsCard.js +15 -12
- package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
- package/dist/subscriberbot/components/PageLayout.js +27 -15
- package/dist/subscriberbot/components/PageLayout.js.map +1 -1
- package/dist/subscriberbot/components/RatingDisplay.js +3 -3
- package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +25 -13
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
- package/dist/subscriberbot/pages/HomePage.js +67 -63
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -48,11 +48,11 @@ function E() {
|
|
|
48
48
|
avgRating: 4.5
|
|
49
49
|
}, H = (e) => {
|
|
50
50
|
switch (e) {
|
|
51
|
-
case "delivered": return "bg-
|
|
52
|
-
case "preparing": return "bg-
|
|
53
|
-
case "out_for_delivery": return "bg-
|
|
54
|
-
case "confirmed": return "bg-
|
|
55
|
-
case "cancelled": return "bg-
|
|
51
|
+
case "delivered": return "bg-status-success-bg/20 text-status-success-text";
|
|
52
|
+
case "preparing": return "bg-status-warning-bg/20 text-status-warning-text";
|
|
53
|
+
case "out_for_delivery": return "bg-status-info-bg/20 text-status-info-text";
|
|
54
|
+
case "confirmed": return "bg-status-info-bg/20 text-status-info-text";
|
|
55
|
+
case "cancelled": return "bg-status-error-bg/20 text-status-error-text";
|
|
56
56
|
default: return "bg-bg-sunken text-text-secondary";
|
|
57
57
|
}
|
|
58
58
|
}, U = (e) => {
|
|
@@ -64,10 +64,10 @@ function E() {
|
|
|
64
64
|
}
|
|
65
65
|
}, W = (e) => {
|
|
66
66
|
switch (e) {
|
|
67
|
-
case "suggestion": return "bg-
|
|
68
|
-
case "opportunity": return "bg-
|
|
69
|
-
case "trend": return "bg-
|
|
70
|
-
default: return "bg-bg-sunken text-text-secondary border-border-
|
|
67
|
+
case "suggestion": return "bg-status-info-bg/10 text-status-info-text border-status-info-border/20";
|
|
68
|
+
case "opportunity": return "bg-status-success-bg/10 text-status-success-text border-status-success-border/20";
|
|
69
|
+
case "trend": return "bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/20";
|
|
70
|
+
default: return "bg-bg-sunken text-text-secondary border-border-seam";
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
73
|
return F ? /* @__PURE__ */ C(n, {
|
|
@@ -85,11 +85,12 @@ function E() {
|
|
|
85
85
|
}) : /* @__PURE__ */ w(n, {
|
|
86
86
|
title: I("subscriberbot.customerDashboard.welcomeBack", "Welcome Back!"),
|
|
87
87
|
description: `${T()}, ${L}`,
|
|
88
|
+
titleGradient: !0,
|
|
88
89
|
children: [V && /* @__PURE__ */ w("div", {
|
|
89
90
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
90
91
|
children: [
|
|
91
92
|
/* @__PURE__ */ C("div", {
|
|
92
|
-
className: "rounded-lg border border-border-
|
|
93
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
93
94
|
children: /* @__PURE__ */ w("div", {
|
|
94
95
|
className: "flex items-center gap-3",
|
|
95
96
|
children: [/* @__PURE__ */ C("div", {
|
|
@@ -105,7 +106,7 @@ function E() {
|
|
|
105
106
|
})
|
|
106
107
|
}),
|
|
107
108
|
/* @__PURE__ */ C("div", {
|
|
108
|
-
className: "rounded-lg border border-border-
|
|
109
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
109
110
|
children: /* @__PURE__ */ w("div", {
|
|
110
111
|
className: "flex items-center gap-3",
|
|
111
112
|
children: [/* @__PURE__ */ C("div", {
|
|
@@ -121,7 +122,7 @@ function E() {
|
|
|
121
122
|
})
|
|
122
123
|
}),
|
|
123
124
|
/* @__PURE__ */ C("div", {
|
|
124
|
-
className: "rounded-lg border border-border-
|
|
125
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
125
126
|
children: /* @__PURE__ */ w("div", {
|
|
126
127
|
className: "flex items-center gap-3",
|
|
127
128
|
children: [/* @__PURE__ */ C("div", {
|
|
@@ -137,7 +138,7 @@ function E() {
|
|
|
137
138
|
})
|
|
138
139
|
}),
|
|
139
140
|
/* @__PURE__ */ C("div", {
|
|
140
|
-
className: "rounded-lg border border-border-
|
|
141
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
141
142
|
children: /* @__PURE__ */ w("div", {
|
|
142
143
|
className: "flex items-center gap-3",
|
|
143
144
|
children: [/* @__PURE__ */ C("div", {
|
|
@@ -167,10 +168,10 @@ function E() {
|
|
|
167
168
|
/* @__PURE__ */ w("button", {
|
|
168
169
|
type: "button",
|
|
169
170
|
onClick: () => E("/customer/carts"),
|
|
170
|
-
className: t("flex items-center gap-3 rounded-lg border border-border-
|
|
171
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
171
172
|
children: [/* @__PURE__ */ C("div", {
|
|
172
|
-
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-
|
|
173
|
-
children: /* @__PURE__ */ C(_, { className: "h-5 w-5 text-
|
|
173
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-info-bg/10",
|
|
174
|
+
children: /* @__PURE__ */ C(_, { className: "h-5 w-5 text-status-info-text" })
|
|
174
175
|
}), /* @__PURE__ */ w("div", {
|
|
175
176
|
className: "min-w-0",
|
|
176
177
|
children: [/* @__PURE__ */ C("p", {
|
|
@@ -185,10 +186,10 @@ function E() {
|
|
|
185
186
|
/* @__PURE__ */ w("button", {
|
|
186
187
|
type: "button",
|
|
187
188
|
onClick: () => E("/customer/orders"),
|
|
188
|
-
className: t("flex items-center gap-3 rounded-lg border border-border-
|
|
189
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
189
190
|
children: [/* @__PURE__ */ C("div", {
|
|
190
|
-
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-
|
|
191
|
-
children: /* @__PURE__ */ C(u, { className: "h-5 w-5 text-
|
|
191
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-success-bg/10",
|
|
192
|
+
children: /* @__PURE__ */ C(u, { className: "h-5 w-5 text-status-success-text" })
|
|
192
193
|
}), /* @__PURE__ */ w("div", {
|
|
193
194
|
className: "min-w-0",
|
|
194
195
|
children: [/* @__PURE__ */ C("p", {
|
|
@@ -203,10 +204,10 @@ function E() {
|
|
|
203
204
|
/* @__PURE__ */ w("button", {
|
|
204
205
|
type: "button",
|
|
205
206
|
onClick: () => E("/customer/favorites"),
|
|
206
|
-
className: t("flex items-center gap-3 rounded-lg border border-border-
|
|
207
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
207
208
|
children: [/* @__PURE__ */ C("div", {
|
|
208
|
-
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-
|
|
209
|
-
children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-
|
|
209
|
+
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-error-bg/10",
|
|
210
|
+
children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-status-error-text" })
|
|
210
211
|
}), /* @__PURE__ */ w("div", {
|
|
211
212
|
className: "min-w-0",
|
|
212
213
|
children: [/* @__PURE__ */ C("p", {
|
|
@@ -234,7 +235,7 @@ function E() {
|
|
|
234
235
|
}), z.length > 0 ? /* @__PURE__ */ C("div", {
|
|
235
236
|
className: "space-y-3",
|
|
236
237
|
children: z.map((e) => /* @__PURE__ */ C("div", {
|
|
237
|
-
className: "rounded-lg border border-border-
|
|
238
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
238
239
|
children: /* @__PURE__ */ w("div", {
|
|
239
240
|
className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
|
|
240
241
|
children: [/* @__PURE__ */ w("div", {
|
|
@@ -264,7 +265,7 @@ function E() {
|
|
|
264
265
|
/* @__PURE__ */ C("span", { children: new Date(e.orderDate).toLocaleDateString() }),
|
|
265
266
|
e.rating && /* @__PURE__ */ w("span", {
|
|
266
267
|
className: "flex items-center gap-1",
|
|
267
|
-
children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-
|
|
268
|
+
children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), e.rating]
|
|
268
269
|
})
|
|
269
270
|
]
|
|
270
271
|
})
|
|
@@ -272,13 +273,13 @@ function E() {
|
|
|
272
273
|
}), /* @__PURE__ */ C("button", {
|
|
273
274
|
type: "button",
|
|
274
275
|
onClick: () => E(`/customer/orders/${e.id}`),
|
|
275
|
-
className: "rounded-lg border border-border-
|
|
276
|
+
className: "rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
276
277
|
children: I("subscriberbot.customerDashboard.viewDetails", "View Details")
|
|
277
278
|
})]
|
|
278
279
|
})
|
|
279
280
|
}, e.id))
|
|
280
281
|
}) : /* @__PURE__ */ w("div", {
|
|
281
|
-
className: "rounded-lg border border-border-
|
|
282
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-8 text-center",
|
|
282
283
|
children: [/* @__PURE__ */ C(v, { className: "mx-auto h-10 w-10 text-text-secondary/50" }), /* @__PURE__ */ C("p", {
|
|
283
284
|
className: "mt-3 text-sm text-text-secondary",
|
|
284
285
|
children: I("subscriberbot.customerDashboard.noRecentOrders", "No recent orders")
|
|
@@ -290,7 +291,7 @@ function E() {
|
|
|
290
291
|
}), /* @__PURE__ */ C("div", {
|
|
291
292
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
292
293
|
children: B.map((e) => /* @__PURE__ */ w("div", {
|
|
293
|
-
className: "rounded-lg border border-border-
|
|
294
|
+
className: "rounded-lg border border-border-seam bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow",
|
|
294
295
|
children: [/* @__PURE__ */ w("div", {
|
|
295
296
|
className: "relative h-40",
|
|
296
297
|
children: [/* @__PURE__ */ C("img", {
|
|
@@ -300,7 +301,7 @@ function E() {
|
|
|
300
301
|
}), /* @__PURE__ */ C("div", {
|
|
301
302
|
className: "absolute top-2 right-2",
|
|
302
303
|
children: /* @__PURE__ */ C("span", {
|
|
303
|
-
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", e.isOpen ? "bg-
|
|
304
|
+
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", e.isOpen ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
304
305
|
children: e.isOpen ? I("subscriberbot.customerDashboard.open", "Open") : I("subscriberbot.customerDashboard.closed", "Closed")
|
|
305
306
|
})
|
|
306
307
|
})]
|
|
@@ -320,7 +321,7 @@ function E() {
|
|
|
320
321
|
})]
|
|
321
322
|
}), /* @__PURE__ */ w("div", {
|
|
322
323
|
className: "flex items-center gap-1 text-xs",
|
|
323
|
-
children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-
|
|
324
|
+
children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ C("span", {
|
|
324
325
|
className: "font-medium text-text-primary",
|
|
325
326
|
children: e.rating
|
|
326
327
|
})]
|
|
@@ -360,7 +361,7 @@ function E() {
|
|
|
360
361
|
className: "space-y-6",
|
|
361
362
|
children: [
|
|
362
363
|
/* @__PURE__ */ w("div", {
|
|
363
|
-
className: "rounded-lg border border-border-
|
|
364
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5",
|
|
364
365
|
children: [/* @__PURE__ */ C("h3", {
|
|
365
366
|
className: "text-base font-semibold text-text-primary mb-4",
|
|
366
367
|
children: I("subscriberbot.customerDashboard.personalizedRecommendations", "Personalized Recommendations")
|
|
@@ -403,7 +404,7 @@ function E() {
|
|
|
403
404
|
})]
|
|
404
405
|
}),
|
|
405
406
|
/* @__PURE__ */ w("div", {
|
|
406
|
-
className: "rounded-lg border border-border-
|
|
407
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5",
|
|
407
408
|
children: [/* @__PURE__ */ C("h3", {
|
|
408
409
|
className: "text-base font-semibold text-text-primary mb-3",
|
|
409
410
|
children: I("subscriberbot.customerDashboard.quickLinks", "Quick Links")
|
|
@@ -413,26 +414,26 @@ function E() {
|
|
|
413
414
|
/* @__PURE__ */ w("button", {
|
|
414
415
|
type: "button",
|
|
415
416
|
onClick: () => E("/customer/profile"),
|
|
416
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-
|
|
417
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
417
418
|
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-text-secondary" }), I("subscriberbot.customerDashboard.profileSettings", "Profile Settings")]
|
|
418
419
|
}),
|
|
419
420
|
/* @__PURE__ */ w("button", {
|
|
420
421
|
type: "button",
|
|
421
422
|
onClick: () => E("/customer/addresses"),
|
|
422
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-
|
|
423
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
423
424
|
children: [/* @__PURE__ */ C(m, { className: "h-4 w-4 text-text-secondary" }), I("subscriberbot.customerDashboard.savedAddresses", "Saved Addresses")]
|
|
424
425
|
}),
|
|
425
426
|
/* @__PURE__ */ w("button", {
|
|
426
427
|
type: "button",
|
|
427
428
|
onClick: () => E("/customer/payment-methods"),
|
|
428
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border-
|
|
429
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
429
430
|
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-text-secondary" }), I("subscriberbot.customerDashboard.paymentMethods", "Payment Methods")]
|
|
430
431
|
})
|
|
431
432
|
]
|
|
432
433
|
})]
|
|
433
434
|
}),
|
|
434
435
|
/* @__PURE__ */ w("div", {
|
|
435
|
-
className: "rounded-lg border border-border-
|
|
436
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5",
|
|
436
437
|
children: [
|
|
437
438
|
/* @__PURE__ */ C("h3", {
|
|
438
439
|
className: "text-base font-semibold text-text-primary mb-3",
|
|
@@ -440,7 +441,7 @@ function E() {
|
|
|
440
441
|
}),
|
|
441
442
|
/* @__PURE__ */ w("div", {
|
|
442
443
|
className: "flex items-start gap-3",
|
|
443
|
-
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-
|
|
444
|
+
children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-status-info-text mt-0.5 shrink-0" }), /* @__PURE__ */ w("div", {
|
|
444
445
|
className: "flex-1 min-w-0",
|
|
445
446
|
children: [
|
|
446
447
|
/* @__PURE__ */ C("p", {
|
|
@@ -461,13 +462,13 @@ function E() {
|
|
|
461
462
|
/* @__PURE__ */ C("button", {
|
|
462
463
|
type: "button",
|
|
463
464
|
onClick: () => E("/customer/addresses"),
|
|
464
|
-
className: "mt-3 w-full rounded-lg border border-border-
|
|
465
|
+
className: "mt-3 w-full rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
465
466
|
children: I("subscriberbot.customerDashboard.updateLocation", "Update Location")
|
|
466
467
|
})
|
|
467
468
|
]
|
|
468
469
|
}),
|
|
469
470
|
/* @__PURE__ */ w("div", {
|
|
470
|
-
className: "rounded-lg bg-gradient-to-r from-
|
|
471
|
+
className: "rounded-lg bg-gradient-to-r from-status-info-text/10 to-accent-purple/10 border border-status-info-border/20 p-5",
|
|
471
472
|
children: [
|
|
472
473
|
/* @__PURE__ */ C("h3", {
|
|
473
474
|
className: "text-base font-semibold text-text-primary mb-2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomerDashboard.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CustomerDashboard.tsx"],"sourcesContent":["/**\n * Customer Dashboard Page\n * @module subscriberbot/pages/customer\n *\n * Welcome dashboard with time-of-day greeting, AI insights panel,\n * stats grid, recent orders with per-item display, recommended carts,\n * quick links sidebar, current location card, and special offers.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n ShoppingBag,\n Heart,\n Star,\n CreditCard,\n ArrowRight,\n Search,\n Clock,\n MapPin,\n Package,\n User,\n Navigation,\n Lightbulb,\n TrendingUp,\n Zap,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders, useProviders, useDashboardStats } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ninterface RecommendedCart {\n id: string;\n name: string;\n category: string;\n rating: number;\n distance: number;\n estimatedTime: number;\n image: string;\n isOpen: boolean;\n}\n\ninterface CustomerStats {\n totalOrders: number;\n totalSpent: number;\n favoriteCount: number;\n avgRating: number;\n}\n\ninterface AIInsight {\n id: string;\n type: 'suggestion' | 'opportunity' | 'trend';\n title: string;\n description: string;\n confidence: number;\n action: string;\n}\n\nfunction getTimeOfDayGreeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n}\n\nexport function CustomerDashboard() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { t: translate } = useI18n();\n\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n const { data: statsData, isLoading: isLoadingStats } = useDashboardStats();\n\n const isLoading = isLoadingOrders || isLoadingProviders || isLoadingStats;\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Customer';\n\n const aiInsights: AIInsight[] = [\n {\n id: '1',\n type: 'suggestion',\n title: 'New Cart Nearby',\n description:\n 'Healthy Bowls cart just opened 0.2km from your location. They specialize in acai bowls and smoothies.',\n confidence: 92,\n action: 'Explore Cart',\n },\n {\n id: '2',\n type: 'opportunity',\n title: 'Special Offer Available',\n description:\n 'Your favorite Dosa Express is offering 20% off on orders above ₹300. Valid until tonight.',\n confidence: 95,\n action: 'Order Now',\n },\n {\n id: '3',\n type: 'trend',\n title: 'Peak Hours Alert',\n description:\n 'Order now to avoid lunch rush. Delivery times typically increase by 15-20 minutes after 12 PM.',\n confidence: 88,\n action: 'View Carts',\n },\n ];\n\n const recentOrders = orders.slice(0, 3);\n const recommendedCarts = providers.slice(0, 3);\n\n const stats: CustomerStats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, order) => acc + order.total, 0),\n favoriteCount: 6, // Still mock as we don't have favorite hooks yet\n avgRating: 4.5, // Still mock\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'delivered':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'preparing':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'out_for_delivery':\n return 'bg-blue-500/20 text-blue-600 dark:text-blue-400';\n case 'confirmed':\n return 'bg-blue-500/20 text-blue-600 dark:text-blue-400';\n case 'cancelled':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n };\n\n const getInsightIcon = (type: string) => {\n switch (type) {\n case 'suggestion':\n return <Lightbulb className=\"h-4 w-4\" />;\n case 'opportunity':\n return <TrendingUp className=\"h-4 w-4\" />;\n case 'trend':\n return <Zap className=\"h-4 w-4\" />;\n default:\n return <Lightbulb className=\"h-4 w-4\" />;\n }\n };\n\n const getInsightColor = (type: string) => {\n switch (type) {\n case 'suggestion':\n return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20';\n case 'opportunity':\n return 'bg-green-500/10 text-green-600 dark:text-green-400 border-green-500/20';\n case 'trend':\n return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20';\n default:\n return 'bg-bg-sunken text-text-secondary border-border-subtle';\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title={t('subscriberbot.customerDashboard.title', 'Dashboard')}>\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n <p className=\"text-sm text-text-secondary\">\n {t('subscriberbot.customerDashboard.loading', 'Loading your dashboard...')}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t('subscriberbot.customerDashboard.welcomeBack', 'Welcome Back!')}\n description={`${getTimeOfDayGreeting()}, ${firstName}`}\n >\n {/* Stats Overview */}\n {stats && (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Package className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalOrders}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.totalOrders', 'Total Orders')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Heart className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.favoriteCount}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.favoriteCarts', 'Favorite Carts')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Star className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.avgRating.toFixed(1)}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.avgRatingGiven', 'Avg Rating Given')}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"mt-8 grid grid-cols-1 gap-8 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2 space-y-8\">\n {/* Quick Actions */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('subscriberbot.customerDashboard.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-blue-500/10\">\n <Search className=\"h-5 w-5 text-blue-600 dark:text-blue-400\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.discoverCarts', 'Discover Carts')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.findNearbyCarts', 'Find nearby carts')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-green-500/10\">\n <Clock className=\"h-5 w-5 text-green-600 dark:text-green-400\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.orderHistory', 'Order History')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.viewPastOrders', 'View past orders')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/favorites')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-red-500/10\">\n <Heart className=\"h-5 w-5 text-red-600 dark:text-red-400\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.favorites', 'Favorites')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.savedCarts', 'Saved carts')}\n </p>\n </div>\n </button>\n </div>\n </section>\n\n {/* Recent Orders */}\n <section>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n {t('subscriberbot.common.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {recentOrders.length > 0 ? (\n <div className=\"space-y-3\">\n {recentOrders.map((order) => (\n <div key={order.id} className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {order.cartName}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mb-2 leading-relaxed\">\n {order.items.map((item) => `${item.name} (${item.quantity})`).join(', ')}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span>{new Date(order.orderDate).toLocaleDateString()}</span>\n {order.rating && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {order.rating}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/orders/${order.id}`)}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('subscriberbot.customerDashboard.viewDetails', 'View Details')}\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-8 text-center\">\n <ShoppingBag className=\"mx-auto h-10 w-10 text-text-secondary/50\" />\n <p className=\"mt-3 text-sm text-text-secondary\">\n {t('subscriberbot.customerDashboard.noRecentOrders', 'No recent orders')}\n </p>\n </div>\n )}\n </section>\n\n {/* Recommended Carts */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('subscriberbot.customerDashboard.recommendedForYou', 'Recommended for You')}\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {recommendedCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow\"\n >\n <div className=\"relative h-40\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 right-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-red-500/20 text-red-600 dark:text-red-400'\n )}\n >\n {cart.isOpen\n ? t('subscriberbot.customerDashboard.open', 'Open')\n : t('subscriberbot.customerDashboard.closed', 'Closed')}\n </span>\n </div>\n </div>\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{cart.name}</h3>\n <p className=\"text-xs text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-1 text-xs\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"font-medium text-text-primary\">{cart.rating}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.distance}km away\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {cart.estimatedTime} mins\n </span>\n </div>\n <button\n type=\"button\"\n disabled={!cart.isOpen}\n onClick={() => cart.isOpen && navigateTo(`/customer/carts/${cart.id}`)}\n className={cn(\n 'w-full rounded-lg py-2 text-sm font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen\n ? t('subscriberbot.customerDashboard.viewMenu', 'View Menu')\n : t('subscriberbot.customerDashboard.currentlyClosed', 'Currently Closed')}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* AI Insights Panel */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">\n {t(\n 'subscriberbot.customerDashboard.personalizedRecommendations',\n 'Personalized Recommendations'\n )}\n </h3>\n <div className=\"space-y-3\">\n {aiInsights.map((insight) => (\n <div\n key={insight.id}\n className={cn('rounded-lg border p-3', getInsightColor(insight.type))}\n >\n <div className=\"flex items-start gap-2\">\n <div className=\"mt-0.5 shrink-0\">{getInsightIcon(insight.type)}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs font-semibold\">{insight.title}</p>\n <span className=\"text-[10px] opacity-70\">{insight.confidence}%</span>\n </div>\n <p className=\"mt-1 text-xs opacity-80 leading-relaxed\">\n {insight.description}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"mt-2 text-[10px] font-semibold underline underline-offset-2\"\n >\n {insight.action}\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Quick Links */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('subscriberbot.customerDashboard.quickLinks', 'Quick Links')}\n </h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <User className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.profileSettings', 'Profile Settings')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.savedAddresses', 'Saved Addresses')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/payment-methods')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.paymentMethods', 'Payment Methods')}\n </button>\n </div>\n </div>\n\n {/* Current Location */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('subscriberbot.customerDashboard.currentLocation', 'Current Location')}\n </h3>\n <div className=\"flex items-start gap-3\">\n <Navigation className=\"h-4 w-4 text-blue-500 mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">Koramangala</p>\n <p className=\"text-xs text-text-secondary\">80 Feet Road, 6th Block</p>\n <p className=\"text-xs text-text-secondary\">Bangalore, Karnataka</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-3 w-full rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('subscriberbot.customerDashboard.updateLocation', 'Update Location')}\n </button>\n </div>\n\n {/* Special Offers */}\n <div className=\"rounded-lg bg-gradient-to-r from-blue-500/10 to-purple-500/10 border border-blue-500/20 p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-2\">\n {t('subscriberbot.customerDashboard.specialOffers', 'Special Offers')}\n </h3>\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n {t(\n 'subscriberbot.customerDashboard.specialOffersDescription',\n 'Get 25% off on your next order from featured carts'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"w-full rounded-lg bg-foreground px-3 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n {t('subscriberbot.customerDashboard.viewOffers', 'View Offers')}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomerDashboard.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CustomerDashboard.tsx"],"sourcesContent":["/**\n * Customer Dashboard Page\n * @module subscriberbot/pages/customer\n *\n * Welcome dashboard with time-of-day greeting, AI insights panel,\n * stats grid, recent orders with per-item display, recommended carts,\n * quick links sidebar, current location card, and special offers.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n ShoppingBag,\n Heart,\n Star,\n CreditCard,\n ArrowRight,\n Search,\n Clock,\n MapPin,\n Package,\n User,\n Navigation,\n Lightbulb,\n TrendingUp,\n Zap,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders, useProviders, useDashboardStats } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ninterface RecommendedCart {\n id: string;\n name: string;\n category: string;\n rating: number;\n distance: number;\n estimatedTime: number;\n image: string;\n isOpen: boolean;\n}\n\ninterface CustomerStats {\n totalOrders: number;\n totalSpent: number;\n favoriteCount: number;\n avgRating: number;\n}\n\ninterface AIInsight {\n id: string;\n type: 'suggestion' | 'opportunity' | 'trend';\n title: string;\n description: string;\n confidence: number;\n action: string;\n}\n\nfunction getTimeOfDayGreeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n}\n\nexport function CustomerDashboard() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { t: translate } = useI18n();\n\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n const { data: statsData, isLoading: isLoadingStats } = useDashboardStats();\n\n const isLoading = isLoadingOrders || isLoadingProviders || isLoadingStats;\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'Customer';\n\n const aiInsights: AIInsight[] = [\n {\n id: '1',\n type: 'suggestion',\n title: 'New Cart Nearby',\n description:\n 'Healthy Bowls cart just opened 0.2km from your location. They specialize in acai bowls and smoothies.',\n confidence: 92,\n action: 'Explore Cart',\n },\n {\n id: '2',\n type: 'opportunity',\n title: 'Special Offer Available',\n description:\n 'Your favorite Dosa Express is offering 20% off on orders above ₹300. Valid until tonight.',\n confidence: 95,\n action: 'Order Now',\n },\n {\n id: '3',\n type: 'trend',\n title: 'Peak Hours Alert',\n description:\n 'Order now to avoid lunch rush. Delivery times typically increase by 15-20 minutes after 12 PM.',\n confidence: 88,\n action: 'View Carts',\n },\n ];\n\n const recentOrders = orders.slice(0, 3);\n const recommendedCarts = providers.slice(0, 3);\n\n const stats: CustomerStats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, order) => acc + order.total, 0),\n favoriteCount: 6, // Still mock as we don't have favorite hooks yet\n avgRating: 4.5, // Still mock\n };\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case 'delivered':\n return 'bg-status-success-bg/20 text-status-success-text';\n case 'preparing':\n return 'bg-status-warning-bg/20 text-status-warning-text';\n case 'out_for_delivery':\n return 'bg-status-info-bg/20 text-status-info-text';\n case 'confirmed':\n return 'bg-status-info-bg/20 text-status-info-text';\n case 'cancelled':\n return 'bg-status-error-bg/20 text-status-error-text';\n default:\n return 'bg-bg-sunken text-text-secondary';\n }\n };\n\n const getInsightIcon = (type: string) => {\n switch (type) {\n case 'suggestion':\n return <Lightbulb className=\"h-4 w-4\" />;\n case 'opportunity':\n return <TrendingUp className=\"h-4 w-4\" />;\n case 'trend':\n return <Zap className=\"h-4 w-4\" />;\n default:\n return <Lightbulb className=\"h-4 w-4\" />;\n }\n };\n\n const getInsightColor = (type: string) => {\n switch (type) {\n case 'suggestion':\n return 'bg-status-info-bg/10 text-status-info-text border-status-info-border/20';\n case 'opportunity':\n return 'bg-status-success-bg/10 text-status-success-text border-status-success-border/20';\n case 'trend':\n return 'bg-status-warning-bg/10 text-status-warning-text border-status-warning-border/20';\n default:\n return 'bg-bg-sunken text-text-secondary border-border-seam';\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title={t('subscriberbot.customerDashboard.title', 'Dashboard')}>\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"text-center\">\n <div className=\"mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n <p className=\"text-sm text-text-secondary\">\n {t('subscriberbot.customerDashboard.loading', 'Loading your dashboard...')}\n </p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={t('subscriberbot.customerDashboard.welcomeBack', 'Welcome Back!')}\n description={`${getTimeOfDayGreeting()}, ${firstName}`}\n titleGradient\n >\n {/* Stats Overview */}\n {stats && (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Package className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.totalOrders}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.totalOrders', 'Total Orders')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <CreditCard className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Heart className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.favoriteCount}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.favoriteCarts', 'Favorite Carts')}\n </p>\n </div>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken\">\n <Star className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold text-text-primary\">{stats.avgRating.toFixed(1)}</p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.avgRatingGiven', 'Avg Rating Given')}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <div className=\"mt-8 grid grid-cols-1 gap-8 lg:grid-cols-3\">\n {/* Main Content */}\n <div className=\"lg:col-span-2 space-y-8\">\n {/* Quick Actions */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('subscriberbot.customerDashboard.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-info-bg/10\">\n <Search className=\"h-5 w-5 text-status-info-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.discoverCarts', 'Discover Carts')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.findNearbyCarts', 'Find nearby carts')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-success-bg/10\">\n <Clock className=\"h-5 w-5 text-status-success-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.orderHistory', 'Order History')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.viewPastOrders', 'View past orders')}\n </p>\n </div>\n </button>\n\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/favorites')}\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm transition-colors text-left',\n 'hover:bg-accent hover:shadow-md'\n )}\n >\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-status-error-bg/10\">\n <Heart className=\"h-5 w-5 text-status-error-text\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.favorites', 'Favorites')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {t('subscriberbot.customerDashboard.savedCarts', 'Saved carts')}\n </p>\n </div>\n </button>\n </div>\n </section>\n\n {/* Recent Orders */}\n <section>\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('subscriberbot.customerDashboard.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n {t('subscriberbot.common.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n\n {recentOrders.length > 0 ? (\n <div className=\"space-y-3\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface p-4\"\n >\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {order.cartName}\n </h3>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize',\n getStatusColor(order.status)\n )}\n >\n {order.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"text-xs text-text-secondary mb-2 leading-relaxed\">\n {order.items.map((item) => `${item.name} (${item.quantity})`).join(', ')}\n </p>\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-secondary\">\n <span className=\"font-medium text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n <span>{new Date(order.orderDate).toLocaleDateString()}</span>\n {order.rating && (\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {order.rating}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/orders/${order.id}`)}\n className=\"rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('subscriberbot.customerDashboard.viewDetails', 'View Details')}\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-8 text-center\">\n <ShoppingBag className=\"mx-auto h-10 w-10 text-text-secondary/50\" />\n <p className=\"mt-3 text-sm text-text-secondary\">\n {t('subscriberbot.customerDashboard.noRecentOrders', 'No recent orders')}\n </p>\n </div>\n )}\n </section>\n\n {/* Recommended Carts */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('subscriberbot.customerDashboard.recommendedForYou', 'Recommended for You')}\n </h2>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n {recommendedCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow\"\n >\n <div className=\"relative h-40\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 right-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {cart.isOpen\n ? t('subscriberbot.customerDashboard.open', 'Open')\n : t('subscriberbot.customerDashboard.closed', 'Closed')}\n </span>\n </div>\n </div>\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between mb-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-sm font-semibold text-text-primary\">{cart.name}</h3>\n <p className=\"text-xs text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex items-center gap-1 text-xs\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"font-medium text-text-primary\">{cart.rating}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.distance}km away\n </span>\n <span className=\"flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {cart.estimatedTime} mins\n </span>\n </div>\n <button\n type=\"button\"\n disabled={!cart.isOpen}\n onClick={() => cart.isOpen && navigateTo(`/customer/carts/${cart.id}`)}\n className={cn(\n 'w-full rounded-lg py-2 text-sm font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen\n ? t('subscriberbot.customerDashboard.viewMenu', 'View Menu')\n : t('subscriberbot.customerDashboard.currentlyClosed', 'Currently Closed')}\n </button>\n </div>\n </div>\n ))}\n </div>\n </section>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* AI Insights Panel */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-4\">\n {t(\n 'subscriberbot.customerDashboard.personalizedRecommendations',\n 'Personalized Recommendations'\n )}\n </h3>\n <div className=\"space-y-3\">\n {aiInsights.map((insight) => (\n <div\n key={insight.id}\n className={cn('rounded-lg border p-3', getInsightColor(insight.type))}\n >\n <div className=\"flex items-start gap-2\">\n <div className=\"mt-0.5 shrink-0\">{getInsightIcon(insight.type)}</div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"text-xs font-semibold\">{insight.title}</p>\n <span className=\"text-[10px] opacity-70\">{insight.confidence}%</span>\n </div>\n <p className=\"mt-1 text-xs opacity-80 leading-relaxed\">\n {insight.description}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"mt-2 text-[10px] font-semibold underline underline-offset-2\"\n >\n {insight.action}\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n\n {/* Quick Links */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('subscriberbot.customerDashboard.quickLinks', 'Quick Links')}\n </h3>\n <div className=\"space-y-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/profile')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <User className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.profileSettings', 'Profile Settings')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.savedAddresses', 'Saved Addresses')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/payment-methods')}\n className=\"flex w-full items-center gap-2 rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left\"\n >\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n {t('subscriberbot.customerDashboard.paymentMethods', 'Payment Methods')}\n </button>\n </div>\n </div>\n\n {/* Current Location */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">\n {t('subscriberbot.customerDashboard.currentLocation', 'Current Location')}\n </h3>\n <div className=\"flex items-start gap-3\">\n <Navigation className=\"h-4 w-4 text-status-info-text mt-0.5 shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">Koramangala</p>\n <p className=\"text-xs text-text-secondary\">80 Feet Road, 6th Block</p>\n <p className=\"text-xs text-text-secondary\">Bangalore, Karnataka</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-3 w-full rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n {t('subscriberbot.customerDashboard.updateLocation', 'Update Location')}\n </button>\n </div>\n\n {/* Special Offers */}\n <div className=\"rounded-lg bg-gradient-to-r from-status-info-text/10 to-accent-purple/10 border border-status-info-border/20 p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-2\">\n {t('subscriberbot.customerDashboard.specialOffers', 'Special Offers')}\n </h3>\n <p className=\"text-xs text-text-secondary mb-3 leading-relaxed\">\n {t(\n 'subscriberbot.customerDashboard.specialOffersDescription',\n 'Get 25% off on your next order from featured carts'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"w-full rounded-lg bg-foreground px-3 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n {t('subscriberbot.customerDashboard.viewOffers', 'View Offers')}\n </button>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|