@burdenoff/microfe-subscriberbot 2026.625.1 → 2026.626.2

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.
Files changed (91) hide show
  1. package/dist/subscriberbot/pages/HomePage.js +19 -14
  2. package/dist/subscriberbot/pages/HomePage.js.map +1 -1
  3. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +66 -60
  4. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/subscriberbot/pages/admin/AdminDashboard.js +83 -44
  6. package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +38 -32
  8. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +226 -221
  10. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/subscriberbot/pages/admin/AdminProfilePage.js +127 -125
  12. package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/subscriberbot/pages/admin/CartManagementPage.js +267 -262
  16. package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/subscriberbot/pages/admin/UserManagementPage.js +267 -262
  18. package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +46 -41
  20. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +231 -194
  24. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +167 -162
  26. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +128 -126
  28. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +297 -300
  30. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +220 -223
  32. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +250 -245
  34. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/subscriberbot/pages/common/HelpSupportPage.js +94 -96
  36. package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/subscriberbot/pages/common/NotificationCenterPage.js +48 -42
  38. package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/subscriberbot/pages/common/SettingsPage.js +745 -736
  40. package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +353 -321
  42. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/subscriberbot/pages/customer/CartDetailPage.js +258 -225
  44. package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +82 -76
  46. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/subscriberbot/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/subscriberbot/pages/customer/CustomerDashboard.js +416 -381
  50. package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +488 -479
  52. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +521 -512
  54. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/subscriberbot/pages/customer/FavoritesPage.js +57 -51
  56. package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +56 -50
  58. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +65 -60
  60. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +79 -73
  62. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/subscriberbot/pages/customer/ReviewsPage.js +68 -62
  64. package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +60 -54
  66. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +292 -255
  68. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +237 -231
  70. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +60 -54
  72. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/subscriberbot/pages/investor/InvestorDashboard.js +350 -319
  74. package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +106 -100
  76. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +51 -45
  78. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +387 -382
  80. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +320 -282
  82. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/subscriberbot/pages/worker/WorkerDashboard.js +92 -61
  84. package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +82 -77
  86. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +348 -340
  90. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. package/package.json +3 -3
@@ -7,33 +7,34 @@ import { formatCurrency as o, formatDistance as s } from "../../utils/formatters
7
7
  import { useMemo as c, useState as l } from "react";
8
8
  import { AlertCircle as u, Calendar as d, CheckCircle2 as f, Clock as p, Home as m, Info as h, Loader2 as g, MapPin as _, Search as v, Star as y, Tag as b, TrendingUp as x, X as S } from "lucide-react";
9
9
  import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
10
+ import { EmphasisPanel as E, PagePurpose as ee } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/subscriberbot/pages/customer/CartDiscoveryPage.tsx
11
- var E = "All";
12
- function D() {
13
- let { navigateTo: D } = e(), [O, k] = l(""), [A, j] = l(E), [M, N] = l(""), [P, F] = l(""), [I, L] = l("rating"), [R, z] = l(9), [B, V] = l(!1), [H, U] = l(null), { data: W = [], isLoading: G, isError: K } = a(), { data: q = [] } = i(), J = c(() => {
12
+ var D = "All";
13
+ function O() {
14
+ let { navigateTo: O } = e(), [k, A] = l(""), [j, M] = l(D), [N, P] = l(""), [F, I] = l(""), [L, R] = l("rating"), [z, B] = l(9), [V, H] = l(!1), [U, W] = l(null), { data: G = [], isLoading: K, isError: q } = a(), { data: J = [] } = i(), Y = c(() => {
14
15
  let e = /* @__PURE__ */ new Set();
15
- return W.forEach((t) => {
16
+ return G.forEach((t) => {
16
17
  t.category && e.add(t.category);
17
- }), [E, ...Array.from(e)];
18
- }, [W]), Y = c(() => {
19
- let e = [...W];
20
- if (O.trim()) {
21
- let t = O.toLowerCase();
18
+ }), [D, ...Array.from(e)];
19
+ }, [G]), X = c(() => {
20
+ let e = [...G];
21
+ if (k.trim()) {
22
+ let t = k.toLowerCase();
22
23
  e = e.filter((e) => e.name.toLowerCase().includes(t) || e.category.toLowerCase().includes(t));
23
24
  }
24
- if (A !== E && (e = e.filter((e) => e.category === A)), M) {
25
- let t = parseFloat(M);
25
+ if (j !== D && (e = e.filter((e) => e.category === j)), N) {
26
+ let t = parseFloat(N);
26
27
  e = e.filter((e) => e.rating >= t);
27
28
  }
28
- switch (P && (e = e.filter((e) => {
29
+ switch (F && (e = e.filter((e) => {
29
30
  let t = e.averageOrderValue ?? 0;
30
- switch (P) {
31
+ switch (F) {
31
32
  case "low": return t <= 300;
32
33
  case "medium": return t > 300 && t <= 800;
33
34
  case "high": return t > 800;
34
35
  default: return !0;
35
36
  }
36
- })), I) {
37
+ })), L) {
37
38
  case "rating":
38
39
  e.sort((e, t) => t.rating - e.rating);
39
40
  break;
@@ -49,23 +50,23 @@ function D() {
49
50
  }
50
51
  return e;
51
52
  }, [
52
- W,
53
- O,
54
- A,
55
- M,
56
- P,
57
- I
58
- ]), X = Y.slice(0, R), Z = R < Y.length, Q = A !== E || M !== "" || P !== "" || O.trim() !== "", $ = () => {
59
- k(""), j(E), N(""), F(""), L("rating"), z(9);
53
+ G,
54
+ k,
55
+ j,
56
+ N,
57
+ F,
58
+ L
59
+ ]), Z = X.slice(0, z), Q = z < X.length, te = j !== D || N !== "" || F !== "" || k.trim() !== "", $ = () => {
60
+ A(""), M(D), P(""), I(""), R("rating"), B(9);
60
61
  };
61
- return G ? /* @__PURE__ */ w(n, {
62
+ return K ? /* @__PURE__ */ w(n, {
62
63
  title: "Discover Carts",
63
64
  description: "Finding services and shops near you...",
64
65
  children: /* @__PURE__ */ w("div", {
65
66
  className: "flex h-[60vh] items-center justify-center",
66
67
  children: /* @__PURE__ */ w(g, { className: "h-8 w-8 animate-spin text-primary" })
67
68
  })
68
- }) : K ? /* @__PURE__ */ w(n, {
69
+ }) : q ? /* @__PURE__ */ w(n, {
69
70
  title: "Discover Carts",
70
71
  description: "Error loading carts",
71
72
  children: /* @__PURE__ */ T("div", {
@@ -90,34 +91,39 @@ function D() {
90
91
  titleGradient: !0,
91
92
  actions: /* @__PURE__ */ T("span", {
92
93
  className: "text-sm text-text-secondary",
93
- children: [Y.length, " carts found"]
94
+ children: [X.length, " carts found"]
94
95
  }),
95
96
  children: [
96
- /* @__PURE__ */ T("div", {
97
+ /* @__PURE__ */ w(ee, {
98
+ icon: /* @__PURE__ */ w(v, { className: "h-4 w-4" }),
99
+ className: "mb-6",
100
+ children: "Find local carts and service providers near you. Search by name or what you need, filter by category, and compare carts by rating, distance and price before you order. This is your starting point whenever you're after food, a quick repair, a haircut or anything else on the marketplace."
101
+ }),
102
+ /* @__PURE__ */ w(E, { children: /* @__PURE__ */ T("div", {
97
103
  className: "relative",
98
104
  children: [
99
105
  /* @__PURE__ */ w(v, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }),
100
106
  /* @__PURE__ */ w("input", {
101
107
  type: "text",
102
108
  placeholder: "Search carts, services, or items...",
103
- value: O,
104
- onChange: (e) => k(e.target.value),
109
+ value: k,
110
+ onChange: (e) => A(e.target.value),
105
111
  className: t("w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary", "placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]")
106
112
  }),
107
- O && /* @__PURE__ */ w("button", {
113
+ k && /* @__PURE__ */ w("button", {
108
114
  type: "button",
109
- onClick: () => k(""),
115
+ onClick: () => A(""),
110
116
  className: "absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary",
111
117
  children: /* @__PURE__ */ w(S, { className: "h-4 w-4" })
112
118
  })
113
119
  ]
114
- }),
120
+ }) }),
115
121
  /* @__PURE__ */ w("div", {
116
122
  className: "mt-4 flex flex-wrap gap-2",
117
- children: J.map((e) => /* @__PURE__ */ w("button", {
123
+ children: Y.map((e) => /* @__PURE__ */ w("button", {
118
124
  type: "button",
119
- onClick: () => j(e),
120
- className: t("rounded-full px-3 py-1.5 text-xs font-medium transition-colors", A === e ? "bg-foreground text-background" : "bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary"),
125
+ onClick: () => M(e),
126
+ className: t("rounded-full px-3 py-1.5 text-xs font-medium transition-colors", j === e ? "bg-foreground text-background" : "bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary"),
121
127
  children: e
122
128
  }, e))
123
129
  }),
@@ -125,8 +131,8 @@ function D() {
125
131
  className: "mt-4 flex flex-wrap items-center gap-3",
126
132
  children: [
127
133
  /* @__PURE__ */ T("select", {
128
- value: M,
129
- onChange: (e) => N(e.target.value),
134
+ value: N,
135
+ onChange: (e) => P(e.target.value),
130
136
  className: "rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
131
137
  children: [
132
138
  /* @__PURE__ */ w("option", {
@@ -148,8 +154,8 @@ function D() {
148
154
  ]
149
155
  }),
150
156
  /* @__PURE__ */ T("select", {
151
- value: P,
152
- onChange: (e) => F(e.target.value),
157
+ value: F,
158
+ onChange: (e) => I(e.target.value),
153
159
  className: "rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
154
160
  children: [
155
161
  /* @__PURE__ */ w("option", {
@@ -171,8 +177,8 @@ function D() {
171
177
  ]
172
178
  }),
173
179
  /* @__PURE__ */ T("select", {
174
- value: I,
175
- onChange: (e) => L(e.target.value),
180
+ value: L,
181
+ onChange: (e) => R(e.target.value),
176
182
  className: "rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
177
183
  children: [
178
184
  /* @__PURE__ */ w("option", {
@@ -193,7 +199,7 @@ function D() {
193
199
  })
194
200
  ]
195
201
  }),
196
- Q && /* @__PURE__ */ w("button", {
202
+ te && /* @__PURE__ */ w("button", {
197
203
  type: "button",
198
204
  onClick: $,
199
205
  className: "rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors",
@@ -201,10 +207,10 @@ function D() {
201
207
  })
202
208
  ]
203
209
  }),
204
- X.length > 0 ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("div", {
210
+ Z.length > 0 ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ w("div", {
205
211
  className: "mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
206
- children: X.map((e) => {
207
- let n = q.find((t) => t.cartId === e.id);
212
+ children: Z.map((e) => {
213
+ let n = J.find((t) => t.cartId === e.id);
208
214
  return /* @__PURE__ */ T("div", {
209
215
  className: "rounded-lg border border-border-seam bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col",
210
216
  children: [/* @__PURE__ */ T("div", {
@@ -310,14 +316,14 @@ function D() {
310
316
  children: [
311
317
  /* @__PURE__ */ w("button", {
312
318
  type: "button",
313
- onClick: () => D(`/customer/cart/${e.id}`),
319
+ onClick: () => O(`/customer/cart/${e.id}`),
314
320
  disabled: !e.isOpen,
315
321
  className: t("flex-1 rounded-lg py-2 text-xs font-medium transition-opacity", e.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
316
322
  children: e.isOpen ? "View Services" : "Closed"
317
323
  }),
318
324
  e.serviceTypes?.includes("direct_service") && /* @__PURE__ */ w("button", {
319
325
  type: "button",
320
- onClick: () => D(`/customer/cart/${e.id}`),
326
+ onClick: () => O(`/customer/cart/${e.id}`),
321
327
  className: "rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors",
322
328
  title: "Book Direct Service",
323
329
  children: /* @__PURE__ */ w(m, { className: "h-3.5 w-3.5" })
@@ -332,7 +338,7 @@ function D() {
332
338
  /* @__PURE__ */ w("button", {
333
339
  type: "button",
334
340
  onClick: () => {
335
- U(e), V(!0);
341
+ W(e), H(!0);
336
342
  },
337
343
  className: "rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors",
338
344
  title: "Cart Info",
@@ -344,11 +350,11 @@ function D() {
344
350
  })]
345
351
  }, e.id);
346
352
  })
347
- }), Z && /* @__PURE__ */ w("div", {
353
+ }), Q && /* @__PURE__ */ w("div", {
348
354
  className: "mt-8 text-center",
349
355
  children: /* @__PURE__ */ w("button", {
350
356
  type: "button",
351
- onClick: () => z((e) => e + 9),
357
+ onClick: () => B((e) => e + 9),
352
358
  className: "rounded-lg border border-border-seam px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
353
359
  children: "Load More Carts"
354
360
  })
@@ -358,7 +364,7 @@ function D() {
358
364
  illustration: "empty-search",
359
365
  icon: /* @__PURE__ */ w(v, { className: "h-12 w-12" }),
360
366
  title: "No carts found",
361
- description: O ? `No results for "${O}". Try a different search term.` : "No carts available with these filters.",
367
+ description: k ? `No results for "${k}". Try a different search term.` : "No carts available with these filters.",
362
368
  action: /* @__PURE__ */ w("button", {
363
369
  type: "button",
364
370
  onClick: $,
@@ -367,7 +373,7 @@ function D() {
367
373
  })
368
374
  })
369
375
  }),
370
- B && H && /* @__PURE__ */ w("div", {
376
+ V && U && /* @__PURE__ */ w("div", {
371
377
  className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4",
372
378
  children: /* @__PURE__ */ w("div", {
373
379
  className: "w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface",
@@ -381,7 +387,7 @@ function D() {
381
387
  children: "Cart Information"
382
388
  }), /* @__PURE__ */ w("button", {
383
389
  type: "button",
384
- onClick: () => V(!1),
390
+ onClick: () => H(!1),
385
391
  className: "rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors",
386
392
  children: /* @__PURE__ */ w(S, { className: "h-5 w-5" })
387
393
  })]
@@ -389,14 +395,14 @@ function D() {
389
395
  /* @__PURE__ */ w("div", {
390
396
  className: "h-48 rounded-lg overflow-hidden mb-4",
391
397
  children: /* @__PURE__ */ w("img", {
392
- src: H.image,
393
- alt: H.name,
398
+ src: U.image,
399
+ alt: U.name,
394
400
  className: "h-full w-full object-cover"
395
401
  })
396
402
  }),
397
403
  /* @__PURE__ */ w("h4", {
398
404
  className: "text-xl font-semibold text-text-primary mb-1",
399
- children: H.name
405
+ children: U.name
400
406
  }),
401
407
  /* @__PURE__ */ T("div", {
402
408
  className: "flex flex-wrap items-center gap-3 mb-4",
@@ -406,20 +412,20 @@ function D() {
406
412
  /* @__PURE__ */ w(y, { className: "h-3.5 w-3.5 fill-status-warning-text text-status-warning-text" }),
407
413
  /* @__PURE__ */ w("span", {
408
414
  className: "text-sm font-medium",
409
- children: H.rating
415
+ children: U.rating
410
416
  }),
411
417
  /* @__PURE__ */ T("span", {
412
418
  className: "text-xs text-text-secondary",
413
419
  children: [
414
420
  "(",
415
- H.totalRatings,
421
+ U.totalRatings,
416
422
  " reviews)"
417
423
  ]
418
424
  })
419
425
  ]
420
426
  }), /* @__PURE__ */ w("span", {
421
- className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", H.isOpen ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
422
- children: H.isOpen ? "Open" : "Closed"
427
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", U.isOpen ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
428
+ children: U.isOpen ? "Open" : "Closed"
423
429
  })]
424
430
  }),
425
431
  /* @__PURE__ */ T("div", {
@@ -432,7 +438,7 @@ function D() {
432
438
  children: [/* @__PURE__ */ w(_, { className: "h-3 w-3" }), " Location"]
433
439
  }), /* @__PURE__ */ w("p", {
434
440
  className: "mt-1 text-sm text-text-primary",
435
- children: H.location.address
441
+ children: U.location.address
436
442
  })]
437
443
  }),
438
444
  /* @__PURE__ */ T("div", {
@@ -442,17 +448,17 @@ function D() {
442
448
  children: [/* @__PURE__ */ w(b, { className: "h-3 w-3" }), " Category"]
443
449
  }), /* @__PURE__ */ w("p", {
444
450
  className: "mt-1 text-sm text-text-primary",
445
- children: H.category
451
+ children: U.category
446
452
  })]
447
453
  }),
448
- H.averageOrderValue && /* @__PURE__ */ T("div", {
454
+ U.averageOrderValue && /* @__PURE__ */ T("div", {
449
455
  className: "rounded-md bg-bg-sunken p-3",
450
456
  children: [/* @__PURE__ */ w("p", {
451
457
  className: "text-xs font-medium text-text-secondary",
452
458
  children: "Average Order"
453
459
  }), /* @__PURE__ */ w("p", {
454
460
  className: "mt-1 text-sm text-text-primary",
455
- children: o(H.averageOrderValue, { minimumFractionDigits: 0 })
461
+ children: o(U.averageOrderValue, { minimumFractionDigits: 0 })
456
462
  })]
457
463
  }),
458
464
  /* @__PURE__ */ T("div", {
@@ -462,7 +468,7 @@ function D() {
462
468
  children: [/* @__PURE__ */ w(p, { className: "h-3 w-3" }), " Estimated Time"]
463
469
  }), /* @__PURE__ */ T("p", {
464
470
  className: "mt-1 text-sm text-text-primary",
465
- children: [H.estimatedTime, " minutes"]
471
+ children: [U.estimatedTime, " minutes"]
466
472
  })]
467
473
  }),
468
474
  /* @__PURE__ */ T("div", {
@@ -472,10 +478,10 @@ function D() {
472
478
  children: "Distance"
473
479
  }), /* @__PURE__ */ w("p", {
474
480
  className: "mt-1 text-sm text-text-primary",
475
- children: s(H.distance)
481
+ children: s(U.distance)
476
482
  })]
477
483
  }),
478
- H.isVerified && /* @__PURE__ */ T("div", {
484
+ U.isVerified && /* @__PURE__ */ T("div", {
479
485
  className: "rounded-md bg-bg-sunken p-3",
480
486
  children: [/* @__PURE__ */ T("p", {
481
487
  className: "text-xs font-medium text-text-secondary flex items-center gap-1",
@@ -487,27 +493,27 @@ function D() {
487
493
  })
488
494
  ]
489
495
  }),
490
- H.serviceTypes && H.serviceTypes.length > 0 && /* @__PURE__ */ T("div", {
496
+ U.serviceTypes && U.serviceTypes.length > 0 && /* @__PURE__ */ T("div", {
491
497
  className: "mb-4",
492
498
  children: [/* @__PURE__ */ w("p", {
493
499
  className: "text-xs font-medium text-text-secondary mb-2",
494
500
  children: "Service Types"
495
501
  }), /* @__PURE__ */ w("div", {
496
502
  className: "flex flex-wrap gap-2",
497
- children: H.serviceTypes.map((e) => /* @__PURE__ */ w("span", {
503
+ children: U.serviceTypes.map((e) => /* @__PURE__ */ w("span", {
498
504
  className: "rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize",
499
505
  children: e.replace(/_/g, " ")
500
506
  }, e))
501
507
  })]
502
508
  }),
503
- H.businessHours && Object.keys(H.businessHours).length > 0 && /* @__PURE__ */ T("div", {
509
+ U.businessHours && Object.keys(U.businessHours).length > 0 && /* @__PURE__ */ T("div", {
504
510
  className: "mb-4",
505
511
  children: [/* @__PURE__ */ w("p", {
506
512
  className: "text-xs font-medium text-text-secondary mb-2",
507
513
  children: "Operating Hours"
508
514
  }), /* @__PURE__ */ w("div", {
509
515
  className: "space-y-1",
510
- children: Object.entries(H.businessHours).map(([e, t]) => /* @__PURE__ */ T("div", {
516
+ children: Object.entries(U.businessHours).map(([e, t]) => /* @__PURE__ */ T("div", {
511
517
  className: "flex justify-between text-xs",
512
518
  children: [/* @__PURE__ */ w("span", {
513
519
  className: "capitalize text-text-primary",
@@ -524,14 +530,14 @@ function D() {
524
530
  children: [/* @__PURE__ */ w("button", {
525
531
  type: "button",
526
532
  onClick: () => {
527
- V(!1), D(`/customer/carts/${H.id}`);
533
+ H(!1), O(`/customer/carts/${U.id}`);
528
534
  },
529
- disabled: !H.isOpen,
530
- className: t("flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity", H.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
531
- children: H.isOpen ? "View Menu" : "Currently Closed"
535
+ disabled: !U.isOpen,
536
+ className: t("flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity", U.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
537
+ children: U.isOpen ? "View Menu" : "Currently Closed"
532
538
  }), /* @__PURE__ */ w("button", {
533
539
  type: "button",
534
- onClick: () => V(!1),
540
+ onClick: () => H(!1),
535
541
  className: "rounded-lg border border-border-seam px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
536
542
  children: "Close"
537
543
  })]
@@ -544,6 +550,6 @@ function D() {
544
550
  });
545
551
  }
546
552
  //#endregion
547
- export { D as CartDiscoveryPage };
553
+ export { O as CartDiscoveryPage };
548
554
 
549
555
  //# sourceMappingURL=CartDiscoveryPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module subscriberbot/pages/customer\n *\n * Browse and search service providers (carts) with full filtering:\n * category, rating, price range, sort, search. Grid view with\n * cart info modal, load more, investment indicators, scheduled stops,\n * direct service links, verified badges, and prep time badges.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { MockCart } from '../../types';\nimport {\n Search,\n X,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Info,\n Home,\n TrendingUp,\n Calendar,\n Tag,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatDistance, formatCurrency } from '../../utils/formatters';\n\nconst ALL_CATEGORIES = 'All';\n\ntype RatingFilter = '' | '4.5' | '4.0' | '3.5';\ntype PriceFilter = '' | 'low' | 'medium' | 'high';\ntype SortBy = 'rating' | 'popularity' | 'distance' | 'newest';\n\nexport function CartDiscoveryPage() {\n const { navigateTo } = useSubscriberBot();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>(ALL_CATEGORIES);\n const [ratingFilter, setRatingFilter] = useState<RatingFilter>('');\n const [priceFilter, setPriceFilter] = useState<PriceFilter>('');\n const [sortBy, setSortBy] = useState<SortBy>('rating');\n const [visibleCount, setVisibleCount] = useState(9);\n const [showCartInfo, setShowCartInfo] = useState(false);\n const [selectedCartInfo, setSelectedCartInfo] = useState<MockCart | null>(null);\n\n const { data: providers = [], isLoading, isError } = useProviders();\n const { data: investmentOpportunities = [] } = useInvestmentOpportunities();\n\n const categories = useMemo(() => {\n const cats = new Set<string>();\n providers.forEach((p) => {\n if (p.category) cats.add(p.category);\n });\n return [ALL_CATEGORIES, ...Array.from(cats)];\n }, [providers]);\n\n const filteredCarts = useMemo(() => {\n let carts = [...providers];\n\n // Search query\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n\n // Category filter\n if (selectedCategory !== ALL_CATEGORIES) {\n carts = carts.filter((cart) => cart.category === selectedCategory);\n }\n\n // Rating filter\n if (ratingFilter) {\n const minRating = parseFloat(ratingFilter);\n carts = carts.filter((cart) => cart.rating >= minRating);\n }\n\n // Price range filter\n if (priceFilter) {\n carts = carts.filter((cart) => {\n const avg = cart.averageOrderValue ?? 0;\n switch (priceFilter) {\n case 'low':\n return avg <= 300;\n case 'medium':\n return avg > 300 && avg <= 800;\n case 'high':\n return avg > 800;\n default:\n return true;\n }\n });\n }\n\n // Sort\n switch (sortBy) {\n case 'rating':\n carts.sort((a, b) => b.rating - a.rating);\n break;\n case 'popularity':\n carts.sort((a, b) => (b.totalRatings || 0) - (a.totalRatings || 0));\n break;\n case 'distance':\n carts.sort((a, b) => (a.distance || 0) - (b.distance || 0));\n break;\n case 'newest':\n carts.sort(\n (a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime()\n );\n break;\n }\n\n return carts;\n }, [providers, searchQuery, selectedCategory, ratingFilter, priceFilter, sortBy]);\n\n const visibleCarts = filteredCarts.slice(0, visibleCount);\n const hasMore = visibleCount < filteredCarts.length;\n\n const hasActiveFilters =\n selectedCategory !== ALL_CATEGORIES ||\n ratingFilter !== '' ||\n priceFilter !== '' ||\n searchQuery.trim() !== '';\n\n const clearAllFilters = () => {\n setSearchQuery('');\n setSelectedCategory(ALL_CATEGORIES);\n setRatingFilter('');\n setPriceFilter('');\n setSortBy('rating');\n setVisibleCount(9);\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Finding services and shops near you...\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Error loading carts\">\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">Error loading service providers</h2>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Discover Carts\"\n description=\"Find services and shops near you\"\n titleGradient\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n {/* Search Bar */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search carts, services, or items...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary',\n 'placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]'\n )}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Category Chips */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n 'rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n selectedCategory === category\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {category}\n </button>\n ))}\n </div>\n\n {/* Filter Row */}\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n value={ratingFilter}\n onChange={(e) => setRatingFilter(e.target.value as RatingFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Rating</option>\n <option value=\"4.5\">4.5+ Stars</option>\n <option value=\"4.0\">4.0+ Stars</option>\n <option value=\"3.5\">3.5+ Stars</option>\n </select>\n\n <select\n value={priceFilter}\n onChange={(e) => setPriceFilter(e.target.value as PriceFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Price</option>\n <option value=\"low\">Under ₹300</option>\n <option value=\"medium\">₹300 - ₹800</option>\n <option value=\"high\">₹800+</option>\n </select>\n\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"rating\">Highest Rated</option>\n <option value=\"popularity\">Most Popular</option>\n <option value=\"distance\">Nearest</option>\n <option value=\"newest\">Newest</option>\n </select>\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n Clear All Filters\n </button>\n )}\n </div>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleCarts.map((cart) => {\n const investment = investmentOpportunities.find((o) => o.cartId === cart.id);\n return (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\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 ? 'Open' : 'Closed'}\n </span>\n {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-status-info-bg/20 px-2 py-0.5 text-xs font-medium text-status-info-text backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <div className=\"absolute top-2 right-2\">\n <span className=\"rounded-full bg-bg-canvas/50 px-2 py-0.5 text-xs text-text-inverse backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"flex flex-col flex-1 p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate flex-1\">\n {cart.name}\n </h3>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">({cart.totalRatings})</span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{cart.category}</p>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Unknown'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.averageOrderValue && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-status-info-bg/10 border border-status-info-border/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-status-info-text\">\n <Calendar className=\"h-3 w-3\" />\n <span className=\"font-medium\">Appointment available</span>\n </div>\n </div>\n )}\n\n {/* Direct Service Info */}\n {cart.serviceTypes?.includes('direct_service') && (\n <div className=\"mb-3 rounded-md bg-accent-purple-subtle border border-accent-purple/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-purple\">\n <Home className=\"h-3 w-3\" />\n <span className=\"font-medium\">Direct Service Available</span>\n </div>\n </div>\n )}\n\n {/* Tags */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {cart.serviceTypes.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary\"\n >\n {tag.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-auto flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n disabled={!cart.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2 text-xs 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 ? 'View Services' : 'Closed'}\n </button>\n\n {cart.serviceTypes?.includes('direct_service') && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Book Direct Service\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {investment && (\n <button\n type=\"button\"\n onClick={() =>\n alert('Investment opportunity available! View in Investor section.')\n }\n className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n title=\"Investment Opportunity\"\n >\n <TrendingUp className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n setSelectedCartInfo(cart);\n setShowCartInfo(true);\n }}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Cart Info\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Load More */}\n {hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={() => setVisibleCount((prev) => prev + 9)}\n className=\"rounded-lg border border-border-seam px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Load More Carts\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"mt-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Search className=\"h-12 w-12\" />}\n title=\"No carts found\"\n description={\n searchQuery\n ? `No results for \"${searchQuery}\". Try a different search term.`\n : 'No carts available with these filters.'\n }\n action={\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n )}\n\n {/* Cart Info Modal */}\n {showCartInfo && selectedCartInfo && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Cart Information</h3>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Image */}\n <div className=\"h-48 rounded-lg overflow-hidden mb-4\">\n <img\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {/* Basic Info */}\n <h4 className=\"text-xl font-semibold text-text-primary mb-1\">\n {selectedCartInfo.name}\n </h4>\n <div className=\"flex flex-wrap items-center gap-3 mb-4\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{selectedCartInfo.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({selectedCartInfo.totalRatings} reviews)\n </span>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n selectedCartInfo.isOpen\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {selectedCartInfo.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> Location\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.location.address}\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Tag className=\"h-3 w-3\" /> Category\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">{selectedCartInfo.category}</p>\n </div>\n {selectedCartInfo.averageOrderValue && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Average Order</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatCurrency(selectedCartInfo.averageOrderValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n )}\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Estimated Time\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.estimatedTime} minutes\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Distance</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatDistance(selectedCartInfo.distance)}\n </p>\n </div>\n {selectedCartInfo.isVerified && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" /> Verification\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">Verified cart</p>\n </div>\n )}\n </div>\n\n {/* Service Types */}\n {selectedCartInfo.serviceTypes && selectedCartInfo.serviceTypes.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Service Types</p>\n <div className=\"flex flex-wrap gap-2\">\n {(selectedCartInfo.serviceTypes as string[]).map((type: string) => (\n <span\n key={type}\n className=\"rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize\"\n >\n {type.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Business Hours */}\n {selectedCartInfo.businessHours &&\n Object.keys(selectedCartInfo.businessHours).length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Operating Hours</p>\n <div className=\"space-y-1\">\n {Object.entries(selectedCartInfo.businessHours as Record<string, any>).map(\n ([day, hours]) => (\n <div key={day} className=\"flex justify-between text-xs\">\n <span className=\"capitalize text-text-primary\">{day}</span>\n <span className=\"text-text-secondary\">\n {hours.isOpen ? `${hours.open} - ${hours.close}` : 'Closed'}\n </span>\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => {\n setShowCartInfo(false);\n navigateTo(`/customer/carts/${selectedCartInfo.id}`);\n }}\n disabled={!selectedCartInfo.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity',\n selectedCartInfo.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {selectedCartInfo.isOpen ? 'View Menu' : 'Currently Closed'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"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 Close\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module subscriberbot/pages/customer\n *\n * Browse and search service providers (carts) with full filtering:\n * category, rating, price range, sort, search. Grid view with\n * cart info modal, load more, investment indicators, scheduled stops,\n * direct service links, verified badges, and prep time badges.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { MockCart } from '../../types';\nimport {\n Search,\n X,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Info,\n Home,\n TrendingUp,\n Calendar,\n Tag,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PagePurpose, EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatDistance, formatCurrency } from '../../utils/formatters';\n\nconst ALL_CATEGORIES = 'All';\n\ntype RatingFilter = '' | '4.5' | '4.0' | '3.5';\ntype PriceFilter = '' | 'low' | 'medium' | 'high';\ntype SortBy = 'rating' | 'popularity' | 'distance' | 'newest';\n\nexport function CartDiscoveryPage() {\n const { navigateTo } = useSubscriberBot();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>(ALL_CATEGORIES);\n const [ratingFilter, setRatingFilter] = useState<RatingFilter>('');\n const [priceFilter, setPriceFilter] = useState<PriceFilter>('');\n const [sortBy, setSortBy] = useState<SortBy>('rating');\n const [visibleCount, setVisibleCount] = useState(9);\n const [showCartInfo, setShowCartInfo] = useState(false);\n const [selectedCartInfo, setSelectedCartInfo] = useState<MockCart | null>(null);\n\n const { data: providers = [], isLoading, isError } = useProviders();\n const { data: investmentOpportunities = [] } = useInvestmentOpportunities();\n\n const categories = useMemo(() => {\n const cats = new Set<string>();\n providers.forEach((p) => {\n if (p.category) cats.add(p.category);\n });\n return [ALL_CATEGORIES, ...Array.from(cats)];\n }, [providers]);\n\n const filteredCarts = useMemo(() => {\n let carts = [...providers];\n\n // Search query\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n\n // Category filter\n if (selectedCategory !== ALL_CATEGORIES) {\n carts = carts.filter((cart) => cart.category === selectedCategory);\n }\n\n // Rating filter\n if (ratingFilter) {\n const minRating = parseFloat(ratingFilter);\n carts = carts.filter((cart) => cart.rating >= minRating);\n }\n\n // Price range filter\n if (priceFilter) {\n carts = carts.filter((cart) => {\n const avg = cart.averageOrderValue ?? 0;\n switch (priceFilter) {\n case 'low':\n return avg <= 300;\n case 'medium':\n return avg > 300 && avg <= 800;\n case 'high':\n return avg > 800;\n default:\n return true;\n }\n });\n }\n\n // Sort\n switch (sortBy) {\n case 'rating':\n carts.sort((a, b) => b.rating - a.rating);\n break;\n case 'popularity':\n carts.sort((a, b) => (b.totalRatings || 0) - (a.totalRatings || 0));\n break;\n case 'distance':\n carts.sort((a, b) => (a.distance || 0) - (b.distance || 0));\n break;\n case 'newest':\n carts.sort(\n (a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime()\n );\n break;\n }\n\n return carts;\n }, [providers, searchQuery, selectedCategory, ratingFilter, priceFilter, sortBy]);\n\n const visibleCarts = filteredCarts.slice(0, visibleCount);\n const hasMore = visibleCount < filteredCarts.length;\n\n const hasActiveFilters =\n selectedCategory !== ALL_CATEGORIES ||\n ratingFilter !== '' ||\n priceFilter !== '' ||\n searchQuery.trim() !== '';\n\n const clearAllFilters = () => {\n setSearchQuery('');\n setSelectedCategory(ALL_CATEGORIES);\n setRatingFilter('');\n setPriceFilter('');\n setSortBy('rating');\n setVisibleCount(9);\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Finding services and shops near you...\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Error loading carts\">\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">Error loading service providers</h2>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Discover Carts\"\n description=\"Find services and shops near you\"\n titleGradient\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n <PagePurpose icon={<Search className=\"h-4 w-4\" />} className=\"mb-6\">\n Find local carts and service providers near you. Search by name or what you need,\n filter by category, and compare carts by rating, distance and price before you\n order. This is your starting point whenever you're after food, a quick repair, a\n haircut or anything else on the marketplace.\n </PagePurpose>\n\n {/* Search Bar — the ONE emphasis zone */}\n <EmphasisPanel>\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search carts, services, or items...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary',\n 'placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]'\n )}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </EmphasisPanel>\n\n {/* Category Chips */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n 'rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n selectedCategory === category\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {category}\n </button>\n ))}\n </div>\n\n {/* Filter Row */}\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n value={ratingFilter}\n onChange={(e) => setRatingFilter(e.target.value as RatingFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Rating</option>\n <option value=\"4.5\">4.5+ Stars</option>\n <option value=\"4.0\">4.0+ Stars</option>\n <option value=\"3.5\">3.5+ Stars</option>\n </select>\n\n <select\n value={priceFilter}\n onChange={(e) => setPriceFilter(e.target.value as PriceFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Price</option>\n <option value=\"low\">Under ₹300</option>\n <option value=\"medium\">₹300 - ₹800</option>\n <option value=\"high\">₹800+</option>\n </select>\n\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"rating\">Highest Rated</option>\n <option value=\"popularity\">Most Popular</option>\n <option value=\"distance\">Nearest</option>\n <option value=\"newest\">Newest</option>\n </select>\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n Clear All Filters\n </button>\n )}\n </div>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleCarts.map((cart) => {\n const investment = investmentOpportunities.find((o) => o.cartId === cart.id);\n return (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\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 ? 'Open' : 'Closed'}\n </span>\n {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-status-info-bg/20 px-2 py-0.5 text-xs font-medium text-status-info-text backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <div className=\"absolute top-2 right-2\">\n <span className=\"rounded-full bg-bg-canvas/50 px-2 py-0.5 text-xs text-text-inverse backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"flex flex-col flex-1 p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate flex-1\">\n {cart.name}\n </h3>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">({cart.totalRatings})</span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{cart.category}</p>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Unknown'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.averageOrderValue && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-status-info-bg/10 border border-status-info-border/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-status-info-text\">\n <Calendar className=\"h-3 w-3\" />\n <span className=\"font-medium\">Appointment available</span>\n </div>\n </div>\n )}\n\n {/* Direct Service Info */}\n {cart.serviceTypes?.includes('direct_service') && (\n <div className=\"mb-3 rounded-md bg-accent-purple-subtle border border-accent-purple/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-purple\">\n <Home className=\"h-3 w-3\" />\n <span className=\"font-medium\">Direct Service Available</span>\n </div>\n </div>\n )}\n\n {/* Tags */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {cart.serviceTypes.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary\"\n >\n {tag.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-auto flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n disabled={!cart.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2 text-xs 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 ? 'View Services' : 'Closed'}\n </button>\n\n {cart.serviceTypes?.includes('direct_service') && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Book Direct Service\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {investment && (\n <button\n type=\"button\"\n onClick={() =>\n alert('Investment opportunity available! View in Investor section.')\n }\n className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n title=\"Investment Opportunity\"\n >\n <TrendingUp className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n setSelectedCartInfo(cart);\n setShowCartInfo(true);\n }}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Cart Info\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Load More */}\n {hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={() => setVisibleCount((prev) => prev + 9)}\n className=\"rounded-lg border border-border-seam px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Load More Carts\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"mt-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Search className=\"h-12 w-12\" />}\n title=\"No carts found\"\n description={\n searchQuery\n ? `No results for \"${searchQuery}\". Try a different search term.`\n : 'No carts available with these filters.'\n }\n action={\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n )}\n\n {/* Cart Info Modal */}\n {showCartInfo && selectedCartInfo && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Cart Information</h3>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Image */}\n <div className=\"h-48 rounded-lg overflow-hidden mb-4\">\n <img\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {/* Basic Info */}\n <h4 className=\"text-xl font-semibold text-text-primary mb-1\">\n {selectedCartInfo.name}\n </h4>\n <div className=\"flex flex-wrap items-center gap-3 mb-4\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{selectedCartInfo.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({selectedCartInfo.totalRatings} reviews)\n </span>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n selectedCartInfo.isOpen\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {selectedCartInfo.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> Location\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.location.address}\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Tag className=\"h-3 w-3\" /> Category\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">{selectedCartInfo.category}</p>\n </div>\n {selectedCartInfo.averageOrderValue && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Average Order</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatCurrency(selectedCartInfo.averageOrderValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n )}\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Estimated Time\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.estimatedTime} minutes\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Distance</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatDistance(selectedCartInfo.distance)}\n </p>\n </div>\n {selectedCartInfo.isVerified && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" /> Verification\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">Verified cart</p>\n </div>\n )}\n </div>\n\n {/* Service Types */}\n {selectedCartInfo.serviceTypes && selectedCartInfo.serviceTypes.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Service Types</p>\n <div className=\"flex flex-wrap gap-2\">\n {(selectedCartInfo.serviceTypes as string[]).map((type: string) => (\n <span\n key={type}\n className=\"rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize\"\n >\n {type.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Business Hours */}\n {selectedCartInfo.businessHours &&\n Object.keys(selectedCartInfo.businessHours).length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Operating Hours</p>\n <div className=\"space-y-1\">\n {Object.entries(selectedCartInfo.businessHours as Record<string, any>).map(\n ([day, hours]) => (\n <div key={day} className=\"flex justify-between text-xs\">\n <span className=\"capitalize text-text-primary\">{day}</span>\n <span className=\"text-text-secondary\">\n {hours.isOpen ? `${hours.open} - ${hours.close}` : 'Closed'}\n </span>\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => {\n setShowCartInfo(false);\n navigateTo(`/customer/carts/${selectedCartInfo.id}`);\n }}\n disabled={!selectedCartInfo.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity',\n selectedCartInfo.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {selectedCartInfo.isOpen ? 'View Menu' : 'Currently Closed'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"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 Close\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}