@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
|
@@ -143,7 +143,7 @@ function A() {
|
|
|
143
143
|
title: "My Profile",
|
|
144
144
|
description: "Manage your personal information and preferences",
|
|
145
145
|
children: [/* @__PURE__ */ E("div", {
|
|
146
|
-
className: "flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-
|
|
146
|
+
className: "flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-seam bg-bg-surface p-6",
|
|
147
147
|
children: [
|
|
148
148
|
/* @__PURE__ */ E("div", {
|
|
149
149
|
className: "relative",
|
|
@@ -185,10 +185,10 @@ function A() {
|
|
|
185
185
|
/* @__PURE__ */ E("div", {
|
|
186
186
|
className: "flex flex-wrap items-center justify-center sm:justify-start gap-2 mt-2",
|
|
187
187
|
children: [/* @__PURE__ */ E("span", {
|
|
188
|
-
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", R.isEmailVerified ? "bg-
|
|
188
|
+
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", R.isEmailVerified ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
189
189
|
children: [/* @__PURE__ */ T(f, { className: "h-3 w-3" }), R.isEmailVerified ? "Email Verified" : "Email Not Verified"]
|
|
190
190
|
}), /* @__PURE__ */ E("span", {
|
|
191
|
-
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", R.isPhoneVerified ? "bg-
|
|
191
|
+
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", R.isPhoneVerified ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
192
192
|
children: [/* @__PURE__ */ T(f, { className: "h-3 w-3" }), R.isPhoneVerified ? "Phone Verified" : "Phone Not Verified"]
|
|
193
193
|
})]
|
|
194
194
|
})
|
|
@@ -206,9 +206,9 @@ function A() {
|
|
|
206
206
|
})
|
|
207
207
|
]
|
|
208
208
|
}), /* @__PURE__ */ E("div", {
|
|
209
|
-
className: "mt-6 rounded-lg border border-border-
|
|
209
|
+
className: "mt-6 rounded-lg border border-border-seam bg-bg-surface",
|
|
210
210
|
children: [/* @__PURE__ */ T("div", {
|
|
211
|
-
className: "border-b border-border-
|
|
211
|
+
className: "border-b border-border-seam",
|
|
212
212
|
children: /* @__PURE__ */ T("nav", {
|
|
213
213
|
className: "flex -mb-px overflow-x-auto",
|
|
214
214
|
children: $.map((e) => {
|
|
@@ -242,13 +242,13 @@ function A() {
|
|
|
242
242
|
}), /* @__PURE__ */ E("button", {
|
|
243
243
|
type: "button",
|
|
244
244
|
onClick: K,
|
|
245
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border-
|
|
245
|
+
className: "flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
246
246
|
children: [/* @__PURE__ */ T(w, { className: "h-3 w-3" }), "Cancel"]
|
|
247
247
|
})]
|
|
248
248
|
}) : /* @__PURE__ */ E("button", {
|
|
249
249
|
type: "button",
|
|
250
250
|
onClick: G,
|
|
251
|
-
className: "flex items-center gap-1.5 rounded-lg border border-border-
|
|
251
|
+
className: "flex items-center gap-1.5 rounded-lg border border-border-seam px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
252
252
|
children: [/* @__PURE__ */ T(m, { className: "h-3 w-3" }), "Edit Profile"]
|
|
253
253
|
})]
|
|
254
254
|
}),
|
|
@@ -263,7 +263,7 @@ function A() {
|
|
|
263
263
|
value: I ? V.firstName : z.firstName,
|
|
264
264
|
onChange: (e) => Y("firstName", e.target.value),
|
|
265
265
|
disabled: !I,
|
|
266
|
-
className: t("w-full rounded-lg border border-border-
|
|
266
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
267
267
|
})] }),
|
|
268
268
|
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
269
269
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
@@ -273,7 +273,7 @@ function A() {
|
|
|
273
273
|
value: I ? V.lastName : z.lastName,
|
|
274
274
|
onChange: (e) => Y("lastName", e.target.value),
|
|
275
275
|
disabled: !I,
|
|
276
|
-
className: t("w-full rounded-lg border border-border-
|
|
276
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
277
277
|
})] }),
|
|
278
278
|
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
279
279
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
@@ -283,7 +283,7 @@ function A() {
|
|
|
283
283
|
value: I ? V.email : z.email,
|
|
284
284
|
onChange: (e) => Y("email", e.target.value),
|
|
285
285
|
disabled: !I,
|
|
286
|
-
className: t("w-full rounded-lg border border-border-
|
|
286
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
287
287
|
})] }),
|
|
288
288
|
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
289
289
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
@@ -293,7 +293,7 @@ function A() {
|
|
|
293
293
|
value: I ? V.phone : z.phone,
|
|
294
294
|
onChange: (e) => Y("phone", e.target.value),
|
|
295
295
|
disabled: !I,
|
|
296
|
-
className: t("w-full rounded-lg border border-border-
|
|
296
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
297
297
|
})] })
|
|
298
298
|
]
|
|
299
299
|
}),
|
|
@@ -347,7 +347,7 @@ function A() {
|
|
|
347
347
|
value: I ? V.emergencyContact.name : z.emergencyContact.name,
|
|
348
348
|
onChange: (e) => X("name", e.target.value),
|
|
349
349
|
disabled: !I,
|
|
350
|
-
className: t("w-full rounded-lg border border-border-
|
|
350
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
351
351
|
})] }),
|
|
352
352
|
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
353
353
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
@@ -357,7 +357,7 @@ function A() {
|
|
|
357
357
|
value: I ? V.emergencyContact.phone : z.emergencyContact.phone,
|
|
358
358
|
onChange: (e) => X("phone", e.target.value),
|
|
359
359
|
disabled: !I,
|
|
360
|
-
className: t("w-full rounded-lg border border-border-
|
|
360
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
361
361
|
})] }),
|
|
362
362
|
/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("label", {
|
|
363
363
|
className: "block text-sm font-medium text-text-primary mb-1.5",
|
|
@@ -367,12 +367,12 @@ function A() {
|
|
|
367
367
|
value: I ? V.emergencyContact.relationship : z.emergencyContact.relationship,
|
|
368
368
|
onChange: (e) => X("relationship", e.target.value),
|
|
369
369
|
disabled: !I,
|
|
370
|
-
className: t("w-full rounded-lg border border-border-
|
|
370
|
+
className: t("w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", !I && "bg-bg-sunken cursor-not-allowed", I && "bg-bg-surface")
|
|
371
371
|
})] })
|
|
372
372
|
]
|
|
373
373
|
})] }),
|
|
374
374
|
I && /* @__PURE__ */ E("div", {
|
|
375
|
-
className: "flex gap-3 pt-4 border-t border-border-
|
|
375
|
+
className: "flex gap-3 pt-4 border-t border-border-seam",
|
|
376
376
|
children: [/* @__PURE__ */ E("button", {
|
|
377
377
|
type: "button",
|
|
378
378
|
onClick: q,
|
|
@@ -381,7 +381,7 @@ function A() {
|
|
|
381
381
|
}), /* @__PURE__ */ T("button", {
|
|
382
382
|
type: "button",
|
|
383
383
|
onClick: K,
|
|
384
|
-
className: "flex items-center gap-2 rounded-lg border border-border-
|
|
384
|
+
className: "flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
|
|
385
385
|
children: "Cancel"
|
|
386
386
|
})]
|
|
387
387
|
})
|
|
@@ -418,7 +418,7 @@ function A() {
|
|
|
418
418
|
type: "checkbox",
|
|
419
419
|
checked: V.notifications[e.key],
|
|
420
420
|
onChange: (t) => Z(e.key, t.target.checked),
|
|
421
|
-
className: "h-4 w-4 rounded border-border-
|
|
421
|
+
className: "h-4 w-4 rounded border-border-seam text-text-primary focus:ring-[var(--color-focus-ring)]"
|
|
422
422
|
}), /* @__PURE__ */ T("span", {
|
|
423
423
|
className: "text-sm text-text-primary",
|
|
424
424
|
children: e.label
|
|
@@ -436,7 +436,7 @@ function A() {
|
|
|
436
436
|
type: "checkbox",
|
|
437
437
|
checked: V.dietary.includes(e),
|
|
438
438
|
onChange: (t) => Q("dietary", e, t.target.checked),
|
|
439
|
-
className: "h-4 w-4 rounded border-border-
|
|
439
|
+
className: "h-4 w-4 rounded border-border-seam text-text-primary focus:ring-[var(--color-focus-ring)]"
|
|
440
440
|
}), /* @__PURE__ */ T("span", {
|
|
441
441
|
className: "text-sm text-text-primary capitalize",
|
|
442
442
|
children: e
|
|
@@ -454,7 +454,7 @@ function A() {
|
|
|
454
454
|
type: "checkbox",
|
|
455
455
|
checked: V.allergies.includes(e),
|
|
456
456
|
onChange: (t) => Q("allergies", e, t.target.checked),
|
|
457
|
-
className: "h-4 w-4 rounded border-border-
|
|
457
|
+
className: "h-4 w-4 rounded border-border-seam text-status-error-text focus:ring-destructive"
|
|
458
458
|
}), /* @__PURE__ */ T("span", {
|
|
459
459
|
className: "text-sm text-text-primary capitalize",
|
|
460
460
|
children: e
|
|
@@ -462,7 +462,7 @@ function A() {
|
|
|
462
462
|
}, e))
|
|
463
463
|
})] }),
|
|
464
464
|
/* @__PURE__ */ T("div", {
|
|
465
|
-
className: "pt-4 border-t border-border-
|
|
465
|
+
className: "pt-4 border-t border-border-seam",
|
|
466
466
|
children: /* @__PURE__ */ E("button", {
|
|
467
467
|
type: "button",
|
|
468
468
|
onClick: J,
|
|
@@ -478,41 +478,41 @@ function A() {
|
|
|
478
478
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
479
479
|
children: [
|
|
480
480
|
/* @__PURE__ */ E("div", {
|
|
481
|
-
className: "rounded-lg bg-
|
|
481
|
+
className: "rounded-lg bg-status-info-bg/10 p-5 border border-status-info-border/20",
|
|
482
482
|
children: [/* @__PURE__ */ E("div", {
|
|
483
483
|
className: "flex items-center gap-2 mb-2",
|
|
484
|
-
children: [/* @__PURE__ */ T(x, { className: "h-4 w-4 text-
|
|
485
|
-
className: "text-sm font-medium text-
|
|
484
|
+
children: [/* @__PURE__ */ T(x, { className: "h-4 w-4 text-status-info-text" }), /* @__PURE__ */ T("h4", {
|
|
485
|
+
className: "text-sm font-medium text-status-info-text",
|
|
486
486
|
children: "Total Orders"
|
|
487
487
|
})]
|
|
488
488
|
}), /* @__PURE__ */ T("p", {
|
|
489
|
-
className: "text-3xl font-bold text-
|
|
489
|
+
className: "text-3xl font-bold text-status-info-text",
|
|
490
490
|
children: U.totalOrders
|
|
491
491
|
})]
|
|
492
492
|
}),
|
|
493
493
|
/* @__PURE__ */ E("div", {
|
|
494
|
-
className: "rounded-lg bg-
|
|
494
|
+
className: "rounded-lg bg-status-success-bg/10 p-5 border border-status-success-border/20",
|
|
495
495
|
children: [/* @__PURE__ */ E("div", {
|
|
496
496
|
className: "flex items-center gap-2 mb-2",
|
|
497
|
-
children: [/* @__PURE__ */ T(g, { className: "h-4 w-4 text-
|
|
498
|
-
className: "text-sm font-medium text-
|
|
497
|
+
children: [/* @__PURE__ */ T(g, { className: "h-4 w-4 text-status-success-text" }), /* @__PURE__ */ T("h4", {
|
|
498
|
+
className: "text-sm font-medium text-status-success-text",
|
|
499
499
|
children: "Total Spent"
|
|
500
500
|
})]
|
|
501
501
|
}), /* @__PURE__ */ T("p", {
|
|
502
|
-
className: "text-3xl font-bold text-
|
|
502
|
+
className: "text-3xl font-bold text-status-success-text",
|
|
503
503
|
children: i(U.totalSpent, { minimumFractionDigits: 0 })
|
|
504
504
|
})]
|
|
505
505
|
}),
|
|
506
506
|
/* @__PURE__ */ E("div", {
|
|
507
|
-
className: "rounded-lg bg-purple-
|
|
507
|
+
className: "rounded-lg bg-accent-purple-subtle p-5 border border-accent-purple/20",
|
|
508
508
|
children: [/* @__PURE__ */ E("div", {
|
|
509
509
|
className: "flex items-center gap-2 mb-2",
|
|
510
|
-
children: [/* @__PURE__ */ T(c, { className: "h-4 w-4 text-
|
|
511
|
-
className: "text-sm font-medium text-
|
|
510
|
+
children: [/* @__PURE__ */ T(c, { className: "h-4 w-4 text-accent-purple" }), /* @__PURE__ */ T("h4", {
|
|
511
|
+
className: "text-sm font-medium text-accent-purple",
|
|
512
512
|
children: "Loyalty Points"
|
|
513
513
|
})]
|
|
514
514
|
}), /* @__PURE__ */ T("p", {
|
|
515
|
-
className: "text-3xl font-bold text-
|
|
515
|
+
className: "text-3xl font-bold text-accent-purple",
|
|
516
516
|
children: U.loyaltyPoints
|
|
517
517
|
})]
|
|
518
518
|
})
|
|
@@ -520,7 +520,7 @@ function A() {
|
|
|
520
520
|
}), /* @__PURE__ */ E("div", {
|
|
521
521
|
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
522
522
|
children: [/* @__PURE__ */ E("div", {
|
|
523
|
-
className: "rounded-lg border border-border-
|
|
523
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5",
|
|
524
524
|
children: [/* @__PURE__ */ E("h4", {
|
|
525
525
|
className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
|
|
526
526
|
children: [/* @__PURE__ */ T(l, { className: "h-4 w-4 text-text-secondary" }), "Order Statistics"]
|
|
@@ -564,7 +564,7 @@ function A() {
|
|
|
564
564
|
]
|
|
565
565
|
})]
|
|
566
566
|
}), /* @__PURE__ */ E("div", {
|
|
567
|
-
className: "rounded-lg border border-border-
|
|
567
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-5",
|
|
568
568
|
children: [/* @__PURE__ */ E("h4", {
|
|
569
569
|
className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
|
|
570
570
|
children: [/* @__PURE__ */ T(b, { className: "h-4 w-4 text-text-secondary" }), "Account Status"]
|
|
@@ -577,7 +577,7 @@ function A() {
|
|
|
577
577
|
className: "text-sm text-text-secondary",
|
|
578
578
|
children: "Email Verification"
|
|
579
579
|
}), /* @__PURE__ */ T("span", {
|
|
580
|
-
className: t("inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", R.isEmailVerified ? "bg-
|
|
580
|
+
className: t("inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", R.isEmailVerified ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
581
581
|
children: R.isEmailVerified ? "Verified" : "Not Verified"
|
|
582
582
|
})]
|
|
583
583
|
}),
|
|
@@ -587,7 +587,7 @@ function A() {
|
|
|
587
587
|
className: "text-sm text-text-secondary",
|
|
588
588
|
children: "Phone Verification"
|
|
589
589
|
}), /* @__PURE__ */ T("span", {
|
|
590
|
-
className: t("inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", R.isPhoneVerified ? "bg-
|
|
590
|
+
className: t("inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", R.isPhoneVerified ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
591
591
|
children: R.isPhoneVerified ? "Verified" : "Not Verified"
|
|
592
592
|
})]
|
|
593
593
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomerProfilePage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CustomerProfilePage.tsx"],"sourcesContent":["/**\n * Customer Profile Page\n * @module subscriberbot/pages/customer\n *\n * Full profile management with 3-tab interface (Profile Info, Preferences, My Stats),\n * edit mode toggle, inline editable fields, emergency contact, dietary preferences,\n * food allergies, and stats/loyalty display.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n MapPin,\n Bell,\n Globe,\n CheckCircle2,\n Camera,\n ChevronRight,\n Edit3,\n Save,\n X,\n Heart,\n AlertTriangle,\n Award,\n ShoppingBag,\n IndianRupee,\n Star,\n BarChart3,\n Settings,\n UserCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\ntype ProfileTab = 'profile' | 'preferences' | 'stats';\n\ninterface EmergencyContact {\n name: string;\n phone: string;\n relationship: string;\n}\n\ninterface ProfileData {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n emergencyContact: EmergencyContact;\n dietary: string[];\n allergies: string[];\n notifications: {\n orderUpdates: boolean;\n promotions: boolean;\n newsletter: boolean;\n sms: boolean;\n };\n}\n\nconst dietaryOptions = ['vegetarian', 'vegan', 'jain', 'keto', 'gluten-free', 'low-carb'];\nconst allergyOptions = ['nuts', 'dairy', 'eggs', 'soy', 'shellfish', 'gluten'];\n\nconst mockAddresses = [\n {\n id: 'addr-1',\n label: 'Home',\n street: '123, MG Road',\n area: 'Near Central Mall',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560001',\n isDefault: true,\n },\n {\n id: 'addr-2',\n label: 'Office',\n street: '456 Tech Park Road',\n area: 'Whitefield',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560066',\n isDefault: false,\n },\n];\n\nexport function CustomerProfilePage() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const [activeTab, setActiveTab] = useState<ProfileTab>('profile');\n const [isEditing, setIsEditing] = useState(false);\n\n // Use currentUser from context, fallback to defaults\n const profile = {\n firstName: currentUser?.firstName || currentUser?.name?.split(' ')[0] || 'Customer',\n lastName: currentUser?.lastName || currentUser?.name?.split(' ').slice(1).join(' ') || '',\n email: currentUser?.email || '',\n phone: '+91 98765 43210',\n profilePicture: currentUser?.avatar,\n isEmailVerified: true,\n isPhoneVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Editable profile data\n const [profileData, setProfileData] = useState<ProfileData>({\n firstName: profile.firstName,\n lastName: profile.lastName,\n email: profile.email,\n phone: profile.phone,\n emergencyContact: {\n name: 'Priya Sharma',\n phone: '+91 98765 43211',\n relationship: 'Spouse',\n },\n dietary: ['vegetarian'],\n allergies: ['nuts', 'dairy'],\n notifications: {\n orderUpdates: true,\n promotions: true,\n newsletter: false,\n sms: true,\n },\n });\n\n const [editedData, setEditedData] = useState<ProfileData>({ ...profileData });\n\n // Calculate stats from real orders\n const stats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, o) => acc + o.total, 0),\n loyaltyPoints: Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / 10),\n avgOrderValue:\n orders.length > 0\n ? Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / orders.length)\n : 0,\n favoriteCategory: 'South Indian',\n memberSince: profile.createdAt,\n };\n\n const isLoading = isLoadingOrders;\n\n const handleStartEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(false);\n };\n\n const handleSaveProfile = () => {\n setProfileData({ ...editedData });\n setIsEditing(false);\n alert('Profile updated successfully');\n };\n\n const handleSavePreferences = () => {\n setProfileData({ ...editedData });\n alert('Preferences saved successfully');\n };\n\n const handleFieldChange = (field: keyof ProfileData, value: string) => {\n setEditedData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleEmergencyContactChange = (field: keyof EmergencyContact, value: string) => {\n setEditedData((prev) => ({\n ...prev,\n emergencyContact: { ...prev.emergencyContact, [field]: value },\n }));\n };\n\n const handleNotificationChange = (field: string, value: boolean) => {\n setEditedData((prev) => ({\n ...prev,\n notifications: { ...prev.notifications, [field]: value },\n }));\n };\n\n const handleArrayToggle = (field: 'dietary' | 'allergies', value: string, checked: boolean) => {\n setEditedData((prev) => {\n const currentArray = prev[field];\n const newArray = checked\n ? [...currentArray, value]\n : currentArray.filter((item) => item !== value);\n return { ...prev, [field]: newArray };\n });\n };\n\n const tabs: Array<{ key: ProfileTab; label: string; icon: typeof UserCircle }> = [\n { key: 'profile', label: 'Profile Info', icon: UserCircle },\n { key: 'preferences', label: 'Preferences', icon: Settings },\n { key: 'stats', label: 'My Stats', icon: BarChart3 },\n ];\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading profile...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Profile\" description=\"Manage your personal information and preferences\">\n {/* Profile Header */}\n <div className=\"flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <div className=\"relative\">\n <div className=\"h-24 w-24 rounded-full bg-bg-sunken overflow-hidden\">\n {profile.profilePicture ? (\n <img\n src={profile.profilePicture}\n alt={`${profile.firstName} ${profile.lastName}`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-text-secondary\">\n <User className=\"h-10 w-10\" />\n </div>\n )}\n </div>\n <button\n type=\"button\"\n className=\"absolute bottom-0 right-0 flex h-8 w-8 items-center justify-center rounded-full bg-foreground text-background shadow-sm hover:opacity-90 transition-opacity\"\n >\n <Camera className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 text-center sm:text-left\">\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profileData.firstName} {profileData.lastName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{profileData.email}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{profileData.phone}</p>\n <div className=\"flex flex-wrap items-center justify-center sm:justify-start gap-2 mt-2\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isEmailVerified ? 'Email Verified' : 'Email Not Verified'}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isPhoneVerified ? 'Phone Verified' : 'Phone Not Verified'}\n </span>\n </div>\n </div>\n\n <div className=\"text-center sm:text-right\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.loyaltyPoints}</p>\n <p className=\"text-xs text-text-secondary\">Loyalty Points</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 py-3.5 px-5 text-sm font-medium whitespace-nowrap transition-colors',\n activeTab === tab.key\n ? 'border-b-2 border-foreground text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n onClick={() => setActiveTab(tab.key)}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-5 md:p-6\">\n {/* Profile Tab */}\n {activeTab === 'profile' && (\n <div className=\"space-y-6\">\n {/* Header with Edit/Save/Cancel */}\n <div className=\"flex justify-between items-center\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Personal Information</h3>\n {isEditing ? (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-1.5 rounded-lg bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-3 w-3\" />\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-1.5 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 <X className=\"h-3 w-3\" />\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleStartEdit}\n className=\"flex items-center gap-1.5 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 <Edit3 className=\"h-3 w-3\" />\n Edit Profile\n </button>\n )}\n </div>\n\n {/* Editable Fields */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n First Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.firstName : profileData.firstName}\n onChange={(e) => handleFieldChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.lastName : profileData.lastName}\n onChange={(e) => handleFieldChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Email</label>\n <input\n type=\"email\"\n value={isEditing ? editedData.email : profileData.email}\n onChange={(e) => handleFieldChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Phone</label>\n <input\n type=\"tel\"\n value={isEditing ? editedData.phone : profileData.phone}\n onChange={(e) => handleFieldChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n\n {/* Primary Address */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3\">Primary Address</h4>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <p className=\"text-sm font-medium text-text-primary\">{mockAddresses[0].street}</p>\n <p className=\"text-sm text-text-secondary\">{mockAddresses[0].area}</p>\n <p className=\"text-sm text-text-secondary\">\n {mockAddresses[0].city}, {mockAddresses[0].state} - {mockAddresses[0].pincode}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-2 flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Manage Addresses\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n\n {/* Emergency Contact */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-text-secondary\" />\n Emergency Contact\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Name</label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.name\n : profileData.emergencyContact.name\n }\n onChange={(e) => handleEmergencyContactChange('name', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Phone\n </label>\n <input\n type=\"tel\"\n value={\n isEditing\n ? editedData.emergencyContact.phone\n : profileData.emergencyContact.phone\n }\n onChange={(e) => handleEmergencyContactChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Relationship\n </label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.relationship\n : profileData.emergencyContact.relationship\n }\n onChange={(e) => handleEmergencyContactChange('relationship', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n </div>\n\n {/* Save/Cancel at bottom when editing */}\n {isEditing && (\n <div className=\"flex gap-3 pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Changes\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-2 rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Preferences Tab */}\n {activeTab === 'preferences' && (\n <div className=\"space-y-8\">\n {/* Notification Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n Notification Preferences\n </h3>\n <div className=\"space-y-3\">\n {[\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers and discounts' },\n { key: 'newsletter', label: 'Newsletter and food recommendations' },\n { key: 'sms', label: 'SMS notifications' },\n ].map((item) => (\n <label key={item.key} className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={\n editedData.notifications[\n item.key as keyof typeof editedData.notifications\n ]\n }\n onChange={(e) => handleNotificationChange(item.key, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Dietary Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Dietary Preferences\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {dietaryOptions.map((diet) => (\n <label key={diet} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.dietary.includes(diet)}\n onChange={(e) => handleArrayToggle('dietary', diet, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{diet}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Food Allergies */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Food Allergies\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {allergyOptions.map((allergy) => (\n <label key={allergy} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.allergies.includes(allergy)}\n onChange={(e) => handleArrayToggle('allergies', allergy, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-subtle text-status-error-text focus:ring-destructive\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{allergy}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Save Preferences */}\n <div className=\"pt-4 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Preferences\n </button>\n </div>\n </div>\n )}\n\n {/* Stats Tab */}\n {activeTab === 'stats' && (\n <div className=\"space-y-8\">\n {/* Top Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg bg-blue-500/10 p-5 border border-blue-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <ShoppingBag className=\"h-4 w-4 text-blue-600 dark:text-blue-400\" />\n <h4 className=\"text-sm font-medium text-blue-600 dark:text-blue-400\">\n Total Orders\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-blue-600 dark:text-blue-400\">\n {stats.totalOrders}\n </p>\n </div>\n <div className=\"rounded-lg bg-green-500/10 p-5 border border-green-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n <h4 className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n Total Spent\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-green-600 dark:text-green-400\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg bg-purple-500/10 p-5 border border-purple-500/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Award className=\"h-4 w-4 text-purple-600 dark:text-purple-400\" />\n <h4 className=\"text-sm font-medium text-purple-600 dark:text-purple-400\">\n Loyalty Points\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-purple-600 dark:text-purple-400\">\n {stats.loyaltyPoints}\n </p>\n </div>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Order Value</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(stats.avgOrderValue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Favorite Category</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {stats.favoriteCategory}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Member Since</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(stats.memberSince, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Account Status */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n Account Status\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Email Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isEmailVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Phone Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isPhoneVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Last Updated</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(profile.updatedAt, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomerProfilePage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CustomerProfilePage.tsx"],"sourcesContent":["/**\n * Customer Profile Page\n * @module subscriberbot/pages/customer\n *\n * Full profile management with 3-tab interface (Profile Info, Preferences, My Stats),\n * edit mode toggle, inline editable fields, emergency contact, dietary preferences,\n * food allergies, and stats/loyalty display.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n User,\n Mail,\n Phone,\n Shield,\n MapPin,\n Bell,\n Globe,\n CheckCircle2,\n Camera,\n ChevronRight,\n Edit3,\n Save,\n X,\n Heart,\n AlertTriangle,\n Award,\n ShoppingBag,\n IndianRupee,\n Star,\n BarChart3,\n Settings,\n UserCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\ntype ProfileTab = 'profile' | 'preferences' | 'stats';\n\ninterface EmergencyContact {\n name: string;\n phone: string;\n relationship: string;\n}\n\ninterface ProfileData {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n emergencyContact: EmergencyContact;\n dietary: string[];\n allergies: string[];\n notifications: {\n orderUpdates: boolean;\n promotions: boolean;\n newsletter: boolean;\n sms: boolean;\n };\n}\n\nconst dietaryOptions = ['vegetarian', 'vegan', 'jain', 'keto', 'gluten-free', 'low-carb'];\nconst allergyOptions = ['nuts', 'dairy', 'eggs', 'soy', 'shellfish', 'gluten'];\n\nconst mockAddresses = [\n {\n id: 'addr-1',\n label: 'Home',\n street: '123, MG Road',\n area: 'Near Central Mall',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560001',\n isDefault: true,\n },\n {\n id: 'addr-2',\n label: 'Office',\n street: '456 Tech Park Road',\n area: 'Whitefield',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560066',\n isDefault: false,\n },\n];\n\nexport function CustomerProfilePage() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n const [activeTab, setActiveTab] = useState<ProfileTab>('profile');\n const [isEditing, setIsEditing] = useState(false);\n\n // Use currentUser from context, fallback to defaults\n const profile = {\n firstName: currentUser?.firstName || currentUser?.name?.split(' ')[0] || 'Customer',\n lastName: currentUser?.lastName || currentUser?.name?.split(' ').slice(1).join(' ') || '',\n email: currentUser?.email || '',\n phone: '+91 98765 43210',\n profilePicture: currentUser?.avatar,\n isEmailVerified: true,\n isPhoneVerified: true,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Editable profile data\n const [profileData, setProfileData] = useState<ProfileData>({\n firstName: profile.firstName,\n lastName: profile.lastName,\n email: profile.email,\n phone: profile.phone,\n emergencyContact: {\n name: 'Priya Sharma',\n phone: '+91 98765 43211',\n relationship: 'Spouse',\n },\n dietary: ['vegetarian'],\n allergies: ['nuts', 'dairy'],\n notifications: {\n orderUpdates: true,\n promotions: true,\n newsletter: false,\n sms: true,\n },\n });\n\n const [editedData, setEditedData] = useState<ProfileData>({ ...profileData });\n\n // Calculate stats from real orders\n const stats = {\n totalOrders: orders.length,\n totalSpent: orders.reduce((acc, o) => acc + o.total, 0),\n loyaltyPoints: Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / 10),\n avgOrderValue:\n orders.length > 0\n ? Math.floor(orders.reduce((acc, o) => acc + o.total, 0) / orders.length)\n : 0,\n favoriteCategory: 'South Indian',\n memberSince: profile.createdAt,\n };\n\n const isLoading = isLoadingOrders;\n\n const handleStartEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditedData({ ...profileData });\n setIsEditing(false);\n };\n\n const handleSaveProfile = () => {\n setProfileData({ ...editedData });\n setIsEditing(false);\n alert('Profile updated successfully');\n };\n\n const handleSavePreferences = () => {\n setProfileData({ ...editedData });\n alert('Preferences saved successfully');\n };\n\n const handleFieldChange = (field: keyof ProfileData, value: string) => {\n setEditedData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleEmergencyContactChange = (field: keyof EmergencyContact, value: string) => {\n setEditedData((prev) => ({\n ...prev,\n emergencyContact: { ...prev.emergencyContact, [field]: value },\n }));\n };\n\n const handleNotificationChange = (field: string, value: boolean) => {\n setEditedData((prev) => ({\n ...prev,\n notifications: { ...prev.notifications, [field]: value },\n }));\n };\n\n const handleArrayToggle = (field: 'dietary' | 'allergies', value: string, checked: boolean) => {\n setEditedData((prev) => {\n const currentArray = prev[field];\n const newArray = checked\n ? [...currentArray, value]\n : currentArray.filter((item) => item !== value);\n return { ...prev, [field]: newArray };\n });\n };\n\n const tabs: Array<{ key: ProfileTab; label: string; icon: typeof UserCircle }> = [\n { key: 'profile', label: 'Profile Info', icon: UserCircle },\n { key: 'preferences', label: 'Preferences', icon: Settings },\n { key: 'stats', label: 'My Stats', icon: BarChart3 },\n ];\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Profile\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading profile...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"My Profile\" description=\"Manage your personal information and preferences\">\n {/* Profile Header */}\n <div className=\"flex flex-col items-center sm:flex-row sm:items-start gap-6 rounded-lg border border-border-seam bg-bg-surface p-6\">\n <div className=\"relative\">\n <div className=\"h-24 w-24 rounded-full bg-bg-sunken overflow-hidden\">\n {profile.profilePicture ? (\n <img\n src={profile.profilePicture}\n alt={`${profile.firstName} ${profile.lastName}`}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-text-secondary\">\n <User className=\"h-10 w-10\" />\n </div>\n )}\n </div>\n <button\n type=\"button\"\n className=\"absolute bottom-0 right-0 flex h-8 w-8 items-center justify-center rounded-full bg-foreground text-background shadow-sm hover:opacity-90 transition-opacity\"\n >\n <Camera className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"flex-1 text-center sm:text-left\">\n <h2 className=\"text-xl font-semibold text-text-primary\">\n {profileData.firstName} {profileData.lastName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{profileData.email}</p>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{profileData.phone}</p>\n <div className=\"flex flex-wrap items-center justify-center sm:justify-start gap-2 mt-2\">\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isEmailVerified ? 'Email Verified' : 'Email Not Verified'}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n <CheckCircle2 className=\"h-3 w-3\" />\n {profile.isPhoneVerified ? 'Phone Verified' : 'Phone Not Verified'}\n </span>\n </div>\n </div>\n\n <div className=\"text-center sm:text-right\">\n <p className=\"text-2xl font-bold text-text-primary\">{stats.loyaltyPoints}</p>\n <p className=\"text-xs text-text-secondary\">Loyalty Points</p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"mt-6 rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"border-b border-border-seam\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 py-3.5 px-5 text-sm font-medium whitespace-nowrap transition-colors',\n activeTab === tab.key\n ? 'border-b-2 border-foreground text-text-primary'\n : 'text-text-secondary hover:text-text-primary'\n )}\n onClick={() => setActiveTab(tab.key)}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-5 md:p-6\">\n {/* Profile Tab */}\n {activeTab === 'profile' && (\n <div className=\"space-y-6\">\n {/* Header with Edit/Save/Cancel */}\n <div className=\"flex justify-between items-center\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Personal Information</h3>\n {isEditing ? (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-1.5 rounded-lg bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-3 w-3\" />\n Save\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-1.5 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 <X className=\"h-3 w-3\" />\n Cancel\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleStartEdit}\n className=\"flex items-center gap-1.5 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 <Edit3 className=\"h-3 w-3\" />\n Edit Profile\n </button>\n )}\n </div>\n\n {/* Editable Fields */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n First Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.firstName : profileData.firstName}\n onChange={(e) => handleFieldChange('firstName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={isEditing ? editedData.lastName : profileData.lastName}\n onChange={(e) => handleFieldChange('lastName', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Email\n </label>\n <input\n type=\"email\"\n value={isEditing ? editedData.email : profileData.email}\n onChange={(e) => handleFieldChange('email', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Phone\n </label>\n <input\n type=\"tel\"\n value={isEditing ? editedData.phone : profileData.phone}\n onChange={(e) => handleFieldChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n\n {/* Primary Address */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3\">Primary Address</h4>\n <div className=\"rounded-lg bg-bg-sunken/50 p-4\">\n <p className=\"text-sm font-medium text-text-primary\">{mockAddresses[0].street}</p>\n <p className=\"text-sm text-text-secondary\">{mockAddresses[0].area}</p>\n <p className=\"text-sm text-text-secondary\">\n {mockAddresses[0].city}, {mockAddresses[0].state} - {mockAddresses[0].pincode}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/addresses')}\n className=\"mt-2 flex items-center gap-1 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n <MapPin className=\"h-3 w-3\" />\n Manage Addresses\n <ChevronRight className=\"h-3 w-3\" />\n </button>\n </div>\n </div>\n\n {/* Emergency Contact */}\n <div>\n <h4 className=\"text-base font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-text-secondary\" />\n Emergency Contact\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Name\n </label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.name\n : profileData.emergencyContact.name\n }\n onChange={(e) => handleEmergencyContactChange('name', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Phone\n </label>\n <input\n type=\"tel\"\n value={\n isEditing\n ? editedData.emergencyContact.phone\n : profileData.emergencyContact.phone\n }\n onChange={(e) => handleEmergencyContactChange('phone', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Relationship\n </label>\n <input\n type=\"text\"\n value={\n isEditing\n ? editedData.emergencyContact.relationship\n : profileData.emergencyContact.relationship\n }\n onChange={(e) => handleEmergencyContactChange('relationship', e.target.value)}\n disabled={!isEditing}\n className={cn(\n 'w-full rounded-lg border border-border-seam px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]',\n !isEditing && 'bg-bg-sunken cursor-not-allowed',\n isEditing && 'bg-bg-surface'\n )}\n />\n </div>\n </div>\n </div>\n\n {/* Save/Cancel at bottom when editing */}\n {isEditing && (\n <div className=\"flex gap-3 pt-4 border-t border-border-seam\">\n <button\n type=\"button\"\n onClick={handleSaveProfile}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Changes\n </button>\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"flex items-center gap-2 rounded-lg border border-border-seam px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n </div>\n )}\n </div>\n )}\n\n {/* Preferences Tab */}\n {activeTab === 'preferences' && (\n <div className=\"space-y-8\">\n {/* Notification Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n Notification Preferences\n </h3>\n <div className=\"space-y-3\">\n {[\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers and discounts' },\n { key: 'newsletter', label: 'Newsletter and food recommendations' },\n { key: 'sms', label: 'SMS notifications' },\n ].map((item) => (\n <label key={item.key} className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={\n editedData.notifications[\n item.key as keyof typeof editedData.notifications\n ]\n }\n onChange={(e) => handleNotificationChange(item.key, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-seam text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Dietary Preferences */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Dietary Preferences\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {dietaryOptions.map((diet) => (\n <label key={diet} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.dietary.includes(diet)}\n onChange={(e) => handleArrayToggle('dietary', diet, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-seam text-text-primary focus:ring-[var(--color-focus-ring)]\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{diet}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Food Allergies */}\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Food Allergies\n </h3>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n {allergyOptions.map((allergy) => (\n <label key={allergy} className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={editedData.allergies.includes(allergy)}\n onChange={(e) => handleArrayToggle('allergies', allergy, e.target.checked)}\n className=\"h-4 w-4 rounded border-border-seam text-status-error-text focus:ring-destructive\"\n />\n <span className=\"text-sm text-text-primary capitalize\">{allergy}</span>\n </label>\n ))}\n </div>\n </div>\n\n {/* Save Preferences */}\n <div className=\"pt-4 border-t border-border-seam\">\n <button\n type=\"button\"\n onClick={handleSavePreferences}\n className=\"flex items-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Save className=\"h-4 w-4\" />\n Save Preferences\n </button>\n </div>\n </div>\n )}\n\n {/* Stats Tab */}\n {activeTab === 'stats' && (\n <div className=\"space-y-8\">\n {/* Top Stats Cards */}\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg bg-status-info-bg/10 p-5 border border-status-info-border/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <ShoppingBag className=\"h-4 w-4 text-status-info-text\" />\n <h4 className=\"text-sm font-medium text-status-info-text\">Total Orders</h4>\n </div>\n <p className=\"text-3xl font-bold text-status-info-text\">{stats.totalOrders}</p>\n </div>\n <div className=\"rounded-lg bg-status-success-bg/10 p-5 border border-status-success-border/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-status-success-text\" />\n <h4 className=\"text-sm font-medium text-status-success-text\">Total Spent</h4>\n </div>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {formatCurrency(stats.totalSpent, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg bg-accent-purple-subtle p-5 border border-accent-purple/20\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Award className=\"h-4 w-4 text-accent-purple\" />\n <h4 className=\"text-sm font-medium text-accent-purple\">Loyalty Points</h4>\n </div>\n <p className=\"text-3xl font-bold text-accent-purple\">{stats.loyaltyPoints}</p>\n </div>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n {/* Order Statistics */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n Order Statistics\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Average Order Value</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(stats.avgOrderValue, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Favorite Category</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {stats.favoriteCategory}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Member Since</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(stats.memberSince, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Account Status */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h4 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n Account Status\n </h4>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Email Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isEmailVerified\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isEmailVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm text-text-secondary\">Phone Verification</span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium',\n profile.isPhoneVerified\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {profile.isPhoneVerified ? 'Verified' : 'Not Verified'}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-sm text-text-secondary\">Last Updated</span>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatDate(profile.updatedAt, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|