@burdenoff/microfe-coolandlovely 2026.625.1 → 2026.625.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.
- package/dist/coolandlovely/pages/HomePage.js +263 -258
- package/dist/coolandlovely/pages/HomePage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +67 -61
- package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminDashboard.js +79 -45
- package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +39 -33
- package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +227 -222
- package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js +65 -60
- package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
- package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/CartManagementPage.js +268 -263
- package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/admin/UserManagementPage.js +268 -263
- package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +92 -84
- package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +257 -252
- package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +587 -548
- package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +171 -166
- package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +219 -211
- package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +671 -670
- package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +515 -514
- package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +244 -246
- package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/HelpSupportPage.js +96 -96
- package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js +50 -44
- package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
- package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
- package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CartDetailPage.js +179 -176
- package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +215 -204
- package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CheckoutPage.js +212 -215
- package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js +438 -396
- package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
- package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
- package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/FavoritesPage.js +86 -76
- package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +118 -109
- package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
- package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +82 -76
- package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/ReviewsPage.js +83 -73
- package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +61 -55
- package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +293 -255
- package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +238 -232
- package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +61 -55
- package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js +356 -320
- package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +107 -101
- package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +170 -137
- package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +386 -381
- package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +359 -322
- package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js +574 -537
- package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +81 -76
- package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +82 -77
- package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +78 -73
- package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -6,13 +6,14 @@ import { formatCurrency as i } from "../../utils/formatters.js";
|
|
|
6
6
|
import { useEffect as a, useState as o } from "react";
|
|
7
7
|
import { Award as s, BarChart3 as c, IndianRupee as l, Loader2 as u, ShoppingBag as d, Star as f, Timer as p, Users as m, Zap as h } from "lucide-react";
|
|
8
8
|
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
9
|
+
import { EmphasisPanel as v, PagePurpose as y } from "@burdenoff/fe-libs/ui";
|
|
9
10
|
//#region src/coolandlovely/pages/admin/AdminAnalyticsPage.tsx
|
|
10
|
-
function
|
|
11
|
-
let { currentUser:
|
|
11
|
+
function b() {
|
|
12
|
+
let { currentUser: b } = e(), [x, S] = o(null), [C, w] = o(!0), [T, E] = o("month"), [D, O] = o("overview");
|
|
12
13
|
a(() => {
|
|
13
|
-
|
|
14
|
+
w(!0);
|
|
14
15
|
let e = setTimeout(() => {
|
|
15
|
-
|
|
16
|
+
S({
|
|
16
17
|
revenue: {
|
|
17
18
|
total: 125e5,
|
|
18
19
|
growth: 15.2,
|
|
@@ -114,12 +115,12 @@ function v() {
|
|
|
114
115
|
revenue: 189e4
|
|
115
116
|
}
|
|
116
117
|
] }
|
|
117
|
-
}),
|
|
118
|
+
}), w(!1);
|
|
118
119
|
}, 800);
|
|
119
120
|
return () => clearTimeout(e);
|
|
120
|
-
}, [
|
|
121
|
-
let
|
|
122
|
-
if (
|
|
121
|
+
}, [T]);
|
|
122
|
+
let k = (e) => e >= 1e7 ? `₹${(e / 1e7).toFixed(1)}Cr` : e >= 1e5 ? `₹${(e / 1e5).toFixed(1)}L` : i(e, { minimumFractionDigits: 0 }), A = (e) => e === 0 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-status-warning-text" }) : e === 1 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-text-secondary" }) : e === 2 ? /* @__PURE__ */ g(s, { className: "h-5 w-5 text-status-warning-text" }) : /* @__PURE__ */ g(c, { className: "h-5 w-5 text-text-secondary" });
|
|
123
|
+
if (C || !x) return /* @__PURE__ */ g(n, {
|
|
123
124
|
title: "Platform Analytics",
|
|
124
125
|
description: "Loading analytics...",
|
|
125
126
|
children: /* @__PURE__ */ _("div", {
|
|
@@ -130,7 +131,7 @@ function v() {
|
|
|
130
131
|
})]
|
|
131
132
|
})
|
|
132
133
|
});
|
|
133
|
-
let
|
|
134
|
+
let j = [
|
|
134
135
|
{
|
|
135
136
|
key: "overview",
|
|
136
137
|
label: "Overview",
|
|
@@ -156,11 +157,16 @@ function v() {
|
|
|
156
157
|
title: "Platform Analytics",
|
|
157
158
|
description: "Comprehensive platform metrics and trends",
|
|
158
159
|
children: [
|
|
160
|
+
/* @__PURE__ */ g(y, {
|
|
161
|
+
className: "mb-6",
|
|
162
|
+
icon: /* @__PURE__ */ g(c, { className: "h-4 w-4" }),
|
|
163
|
+
children: "The numbers behind the whole marketplace. Track revenue, orders, users and active carts over any period, drill into revenue, user and performance breakdowns, and spot top performers — so platform decisions are grounded in data, not guesswork."
|
|
164
|
+
}),
|
|
159
165
|
/* @__PURE__ */ _("div", {
|
|
160
166
|
className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6",
|
|
161
167
|
children: [/* @__PURE__ */ _("select", {
|
|
162
|
-
value:
|
|
163
|
-
onChange: (e) =>
|
|
168
|
+
value: T,
|
|
169
|
+
onChange: (e) => E(e.target.value),
|
|
164
170
|
className: "rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] w-fit",
|
|
165
171
|
children: [
|
|
166
172
|
/* @__PURE__ */ g("option", {
|
|
@@ -189,35 +195,35 @@ function v() {
|
|
|
189
195
|
children: ["Last updated: ", (/* @__PURE__ */ new Date()).toLocaleString("en-IN")]
|
|
190
196
|
})]
|
|
191
197
|
}),
|
|
192
|
-
/* @__PURE__ */ _(
|
|
193
|
-
className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8",
|
|
198
|
+
/* @__PURE__ */ _(v, {
|
|
199
|
+
className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8 p-4",
|
|
194
200
|
children: [
|
|
195
201
|
/* @__PURE__ */ g(r, {
|
|
196
202
|
icon: /* @__PURE__ */ g(l, { className: "h-5 w-5" }),
|
|
197
|
-
value:
|
|
203
|
+
value: k(x.revenue.total),
|
|
198
204
|
label: "Total Revenue",
|
|
199
205
|
trend: "up",
|
|
200
|
-
trendValue: `+${
|
|
206
|
+
trendValue: `+${x.revenue.growth}%`
|
|
201
207
|
}),
|
|
202
208
|
/* @__PURE__ */ g(r, {
|
|
203
209
|
icon: /* @__PURE__ */ g(d, { className: "h-5 w-5" }),
|
|
204
|
-
value:
|
|
210
|
+
value: x.orders.total.toLocaleString("en-IN"),
|
|
205
211
|
label: "Total Orders",
|
|
206
212
|
trend: "up",
|
|
207
|
-
trendValue: `+${
|
|
213
|
+
trendValue: `+${x.orders.growth}%`
|
|
208
214
|
}),
|
|
209
215
|
/* @__PURE__ */ g(r, {
|
|
210
216
|
icon: /* @__PURE__ */ g(m, { className: "h-5 w-5" }),
|
|
211
|
-
value:
|
|
217
|
+
value: x.users.active.toLocaleString("en-IN"),
|
|
212
218
|
label: "Active Users",
|
|
213
219
|
trend: "up",
|
|
214
|
-
trendValue: `+${
|
|
220
|
+
trendValue: `+${x.users.growth}%`
|
|
215
221
|
}),
|
|
216
222
|
/* @__PURE__ */ g(r, {
|
|
217
223
|
icon: /* @__PURE__ */ g(c, { className: "h-5 w-5" }),
|
|
218
|
-
value:
|
|
224
|
+
value: x.carts.active.toLocaleString("en-IN"),
|
|
219
225
|
label: "Active Carts",
|
|
220
|
-
trendValue: `${
|
|
226
|
+
trendValue: `${x.carts.pending} pending`
|
|
221
227
|
})
|
|
222
228
|
]
|
|
223
229
|
}),
|
|
@@ -227,12 +233,12 @@ function v() {
|
|
|
227
233
|
className: "border-b border-border-subtle",
|
|
228
234
|
children: /* @__PURE__ */ g("nav", {
|
|
229
235
|
className: "flex -mb-px overflow-x-auto",
|
|
230
|
-
children:
|
|
236
|
+
children: j.map((e) => {
|
|
231
237
|
let n = e.icon;
|
|
232
238
|
return /* @__PURE__ */ _("button", {
|
|
233
239
|
type: "button",
|
|
234
|
-
onClick: () =>
|
|
235
|
-
className: t("flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors",
|
|
240
|
+
onClick: () => O(e.key),
|
|
241
|
+
className: t("flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors", D === e.key ? "border-primary text-primary" : "border-transparent text-text-secondary hover:text-text-primary"),
|
|
236
242
|
children: [/* @__PURE__ */ g(n, { className: "h-4 w-4" }), /* @__PURE__ */ g("span", {
|
|
237
243
|
className: "hidden sm:inline",
|
|
238
244
|
children: e.label
|
|
@@ -243,7 +249,7 @@ function v() {
|
|
|
243
249
|
}), /* @__PURE__ */ _("div", {
|
|
244
250
|
className: "p-4 sm:p-6",
|
|
245
251
|
children: [
|
|
246
|
-
|
|
252
|
+
D === "overview" && /* @__PURE__ */ _("div", {
|
|
247
253
|
className: "space-y-8",
|
|
248
254
|
children: [/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("h3", {
|
|
249
255
|
className: "text-lg font-semibold text-text-primary mb-4",
|
|
@@ -260,11 +266,11 @@ function v() {
|
|
|
260
266
|
}),
|
|
261
267
|
/* @__PURE__ */ g("p", {
|
|
262
268
|
className: "text-2xl font-bold text-status-success-text",
|
|
263
|
-
children:
|
|
269
|
+
children: x.orders.completed.toLocaleString("en-IN")
|
|
264
270
|
}),
|
|
265
271
|
/* @__PURE__ */ _("p", {
|
|
266
272
|
className: "text-sm text-status-success-text",
|
|
267
|
-
children: [(
|
|
273
|
+
children: [(x.orders.completed / x.orders.total * 100).toFixed(1), "% of total"]
|
|
268
274
|
})
|
|
269
275
|
]
|
|
270
276
|
}),
|
|
@@ -277,11 +283,11 @@ function v() {
|
|
|
277
283
|
}),
|
|
278
284
|
/* @__PURE__ */ g("p", {
|
|
279
285
|
className: "text-2xl font-bold text-status-warning-text",
|
|
280
|
-
children:
|
|
286
|
+
children: x.orders.pending.toLocaleString("en-IN")
|
|
281
287
|
}),
|
|
282
288
|
/* @__PURE__ */ _("p", {
|
|
283
289
|
className: "text-sm text-status-warning-text",
|
|
284
|
-
children: [(
|
|
290
|
+
children: [(x.orders.pending / x.orders.total * 100).toFixed(1), "% of total"]
|
|
285
291
|
})
|
|
286
292
|
]
|
|
287
293
|
}),
|
|
@@ -294,11 +300,11 @@ function v() {
|
|
|
294
300
|
}),
|
|
295
301
|
/* @__PURE__ */ g("p", {
|
|
296
302
|
className: "text-2xl font-bold text-status-error-text",
|
|
297
|
-
children:
|
|
303
|
+
children: x.orders.cancelled.toLocaleString("en-IN")
|
|
298
304
|
}),
|
|
299
305
|
/* @__PURE__ */ _("p", {
|
|
300
306
|
className: "text-sm text-status-error-text",
|
|
301
|
-
children: [(
|
|
307
|
+
children: [(x.orders.cancelled / x.orders.total * 100).toFixed(1), "% of total"]
|
|
302
308
|
})
|
|
303
309
|
]
|
|
304
310
|
})
|
|
@@ -332,14 +338,14 @@ function v() {
|
|
|
332
338
|
]
|
|
333
339
|
}) }), /* @__PURE__ */ g("tbody", {
|
|
334
340
|
className: "divide-y divide-border",
|
|
335
|
-
children:
|
|
341
|
+
children: x.carts.topPerforming.map((e, t) => /* @__PURE__ */ _("tr", {
|
|
336
342
|
className: "hover:bg-accent/50 transition-colors",
|
|
337
343
|
children: [
|
|
338
344
|
/* @__PURE__ */ g("td", {
|
|
339
345
|
className: "px-4 py-3",
|
|
340
346
|
children: /* @__PURE__ */ _("div", {
|
|
341
347
|
className: "flex items-center gap-2",
|
|
342
|
-
children: [
|
|
348
|
+
children: [A(t), /* @__PURE__ */ g("span", {
|
|
343
349
|
className: "text-sm font-medium text-text-primary",
|
|
344
350
|
children: e.name
|
|
345
351
|
})]
|
|
@@ -347,7 +353,7 @@ function v() {
|
|
|
347
353
|
}),
|
|
348
354
|
/* @__PURE__ */ g("td", {
|
|
349
355
|
className: "px-4 py-3 text-sm text-right font-medium text-text-primary",
|
|
350
|
-
children:
|
|
356
|
+
children: k(e.revenue)
|
|
351
357
|
}),
|
|
352
358
|
/* @__PURE__ */ g("td", {
|
|
353
359
|
className: "px-4 py-3 text-sm text-right text-text-primary",
|
|
@@ -366,7 +372,7 @@ function v() {
|
|
|
366
372
|
})
|
|
367
373
|
})] })]
|
|
368
374
|
}),
|
|
369
|
-
|
|
375
|
+
D === "revenue" && /* @__PURE__ */ _("div", {
|
|
370
376
|
className: "space-y-8",
|
|
371
377
|
children: [/* @__PURE__ */ _("div", {
|
|
372
378
|
className: "grid grid-cols-1 md:grid-cols-3 gap-4",
|
|
@@ -378,7 +384,7 @@ function v() {
|
|
|
378
384
|
children: "This Month"
|
|
379
385
|
}), /* @__PURE__ */ g("p", {
|
|
380
386
|
className: "text-2xl font-bold text-accent-blue",
|
|
381
|
-
children:
|
|
387
|
+
children: k(x.revenue.thisMonth)
|
|
382
388
|
})]
|
|
383
389
|
}),
|
|
384
390
|
/* @__PURE__ */ _("div", {
|
|
@@ -388,7 +394,7 @@ function v() {
|
|
|
388
394
|
children: "Last Month"
|
|
389
395
|
}), /* @__PURE__ */ g("p", {
|
|
390
396
|
className: "text-2xl font-bold text-text-primary",
|
|
391
|
-
children:
|
|
397
|
+
children: k(x.revenue.lastMonth)
|
|
392
398
|
})]
|
|
393
399
|
}),
|
|
394
400
|
/* @__PURE__ */ _("div", {
|
|
@@ -398,7 +404,7 @@ function v() {
|
|
|
398
404
|
children: "Average Order Value"
|
|
399
405
|
}), /* @__PURE__ */ _("p", {
|
|
400
406
|
className: "text-2xl font-bold text-status-success-text",
|
|
401
|
-
children: ["₹",
|
|
407
|
+
children: ["₹", x.orders.averageOrderValue]
|
|
402
408
|
})]
|
|
403
409
|
})
|
|
404
410
|
]
|
|
@@ -407,11 +413,11 @@ function v() {
|
|
|
407
413
|
children: "Revenue by City"
|
|
408
414
|
}), /* @__PURE__ */ g("div", {
|
|
409
415
|
className: "space-y-3",
|
|
410
|
-
children:
|
|
416
|
+
children: x.geography.topCities.map((e, t) => /* @__PURE__ */ _("div", {
|
|
411
417
|
className: "flex items-center justify-between p-4 rounded-lg border border-border-subtle bg-bg-sunken/30",
|
|
412
418
|
children: [/* @__PURE__ */ _("div", {
|
|
413
419
|
className: "flex items-center gap-3",
|
|
414
|
-
children: [
|
|
420
|
+
children: [A(t), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
415
421
|
className: "font-medium text-text-primary",
|
|
416
422
|
children: e.city
|
|
417
423
|
}), /* @__PURE__ */ _("p", {
|
|
@@ -422,38 +428,38 @@ function v() {
|
|
|
422
428
|
className: "text-right",
|
|
423
429
|
children: [/* @__PURE__ */ g("p", {
|
|
424
430
|
className: "font-bold text-text-primary",
|
|
425
|
-
children:
|
|
431
|
+
children: k(e.revenue)
|
|
426
432
|
}), /* @__PURE__ */ _("p", {
|
|
427
433
|
className: "text-sm text-text-secondary",
|
|
428
|
-
children: [(e.revenue /
|
|
434
|
+
children: [(e.revenue / x.revenue.total * 100).toFixed(1), "%"]
|
|
429
435
|
})]
|
|
430
436
|
})]
|
|
431
437
|
}, e.city))
|
|
432
438
|
})] })]
|
|
433
439
|
}),
|
|
434
|
-
|
|
440
|
+
D === "users" && /* @__PURE__ */ _("div", {
|
|
435
441
|
className: "space-y-8",
|
|
436
442
|
children: [/* @__PURE__ */ g("div", {
|
|
437
443
|
className: "grid grid-cols-1 md:grid-cols-4 gap-4",
|
|
438
444
|
children: [
|
|
439
445
|
{
|
|
440
446
|
label: "Customers",
|
|
441
|
-
value:
|
|
447
|
+
value: x.users.customers,
|
|
442
448
|
color: "blue"
|
|
443
449
|
},
|
|
444
450
|
{
|
|
445
451
|
label: "Cart Owners",
|
|
446
|
-
value:
|
|
452
|
+
value: x.users.cartOwners,
|
|
447
453
|
color: "green"
|
|
448
454
|
},
|
|
449
455
|
{
|
|
450
456
|
label: "Workers",
|
|
451
|
-
value:
|
|
457
|
+
value: x.users.workers,
|
|
452
458
|
color: "yellow"
|
|
453
459
|
},
|
|
454
460
|
{
|
|
455
461
|
label: "Investors",
|
|
456
|
-
value:
|
|
462
|
+
value: x.users.investors,
|
|
457
463
|
color: "purple"
|
|
458
464
|
}
|
|
459
465
|
].map((e) => /* @__PURE__ */ _("div", {
|
|
@@ -469,7 +475,7 @@ function v() {
|
|
|
469
475
|
}),
|
|
470
476
|
/* @__PURE__ */ _("p", {
|
|
471
477
|
className: t("text-sm", `text-${e.color}-600/80 dark:text-${e.color}-400/80`),
|
|
472
|
-
children: [(e.value /
|
|
478
|
+
children: [(e.value / x.users.total * 100).toFixed(1), "%"]
|
|
473
479
|
})
|
|
474
480
|
]
|
|
475
481
|
}, e.label))
|
|
@@ -485,18 +491,18 @@ function v() {
|
|
|
485
491
|
children: "New Users This Month"
|
|
486
492
|
}), /* @__PURE__ */ g("p", {
|
|
487
493
|
className: "text-3xl font-bold text-accent-blue",
|
|
488
|
-
children:
|
|
494
|
+
children: x.users.newThisMonth
|
|
489
495
|
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
490
496
|
className: "text-sm text-text-secondary mb-2",
|
|
491
497
|
children: "Active Users Rate"
|
|
492
498
|
}), /* @__PURE__ */ _("p", {
|
|
493
499
|
className: "text-3xl font-bold text-status-success-text",
|
|
494
|
-
children: [(
|
|
500
|
+
children: [(x.users.active / x.users.total * 100).toFixed(1), "%"]
|
|
495
501
|
})] })]
|
|
496
502
|
})]
|
|
497
503
|
})]
|
|
498
504
|
}),
|
|
499
|
-
|
|
505
|
+
D === "performance" && /* @__PURE__ */ _("div", {
|
|
500
506
|
className: "space-y-8",
|
|
501
507
|
children: [
|
|
502
508
|
/* @__PURE__ */ _("div", {
|
|
@@ -514,7 +520,7 @@ function v() {
|
|
|
514
520
|
}),
|
|
515
521
|
/* @__PURE__ */ _("p", {
|
|
516
522
|
className: "text-3xl font-bold text-text-primary",
|
|
517
|
-
children: [
|
|
523
|
+
children: [x.performance.averageDeliveryTime, " min"]
|
|
518
524
|
}),
|
|
519
525
|
/* @__PURE__ */ g("p", {
|
|
520
526
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -534,7 +540,7 @@ function v() {
|
|
|
534
540
|
}),
|
|
535
541
|
/* @__PURE__ */ _("p", {
|
|
536
542
|
className: "text-3xl font-bold text-text-primary flex items-center gap-1",
|
|
537
|
-
children: [/* @__PURE__ */ g(f, { className: "h-6 w-6 fill-status-warning-text text-status-warning-text" }),
|
|
543
|
+
children: [/* @__PURE__ */ g(f, { className: "h-6 w-6 fill-status-warning-text text-status-warning-text" }), x.performance.customerSatisfaction]
|
|
538
544
|
}),
|
|
539
545
|
/* @__PURE__ */ g("p", {
|
|
540
546
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -554,7 +560,7 @@ function v() {
|
|
|
554
560
|
}),
|
|
555
561
|
/* @__PURE__ */ _("p", {
|
|
556
562
|
className: "text-3xl font-bold text-text-primary",
|
|
557
|
-
children: [
|
|
563
|
+
children: [x.performance.platformFee, "%"]
|
|
558
564
|
}),
|
|
559
565
|
/* @__PURE__ */ g("p", {
|
|
560
566
|
className: "text-sm text-text-secondary mt-1",
|
|
@@ -579,21 +585,21 @@ function v() {
|
|
|
579
585
|
children: "Operating Costs"
|
|
580
586
|
}), /* @__PURE__ */ g("p", {
|
|
581
587
|
className: "text-2xl font-bold text-status-error-text",
|
|
582
|
-
children:
|
|
588
|
+
children: k(x.performance.operatingCosts)
|
|
583
589
|
})] }),
|
|
584
590
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
585
591
|
className: "text-sm text-text-secondary mb-2",
|
|
586
592
|
children: "Total Revenue"
|
|
587
593
|
}), /* @__PURE__ */ g("p", {
|
|
588
594
|
className: "text-2xl font-bold text-accent-blue",
|
|
589
|
-
children:
|
|
595
|
+
children: k(x.revenue.total)
|
|
590
596
|
})] }),
|
|
591
597
|
/* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
592
598
|
className: "text-sm text-text-secondary mb-2",
|
|
593
599
|
children: "Net Profit"
|
|
594
600
|
}), /* @__PURE__ */ g("p", {
|
|
595
601
|
className: "text-2xl font-bold text-status-success-text",
|
|
596
|
-
children:
|
|
602
|
+
children: k(x.performance.netProfit)
|
|
597
603
|
})] })
|
|
598
604
|
]
|
|
599
605
|
}),
|
|
@@ -604,7 +610,7 @@ function v() {
|
|
|
604
610
|
children: "Profit Margin"
|
|
605
611
|
}), /* @__PURE__ */ _("p", {
|
|
606
612
|
className: "text-xl font-bold text-text-primary",
|
|
607
|
-
children: [(
|
|
613
|
+
children: [(x.performance.netProfit / x.revenue.total * 100).toFixed(1), "%"]
|
|
608
614
|
})]
|
|
609
615
|
})
|
|
610
616
|
]
|
|
@@ -621,13 +627,13 @@ function v() {
|
|
|
621
627
|
children: "Orders Today"
|
|
622
628
|
}), /* @__PURE__ */ g("p", {
|
|
623
629
|
className: "text-3xl font-bold text-accent-blue",
|
|
624
|
-
children:
|
|
630
|
+
children: x.orders.ordersToday
|
|
625
631
|
})] }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
|
|
626
632
|
className: "text-sm text-text-secondary mb-2",
|
|
627
633
|
children: "Estimated Revenue"
|
|
628
634
|
}), /* @__PURE__ */ g("p", {
|
|
629
635
|
className: "text-3xl font-bold text-status-success-text",
|
|
630
|
-
children:
|
|
636
|
+
children: k(x.orders.ordersToday * x.orders.averageOrderValue)
|
|
631
637
|
})] })]
|
|
632
638
|
})]
|
|
633
639
|
})
|
|
@@ -640,6 +646,6 @@ function v() {
|
|
|
640
646
|
});
|
|
641
647
|
}
|
|
642
648
|
//#endregion
|
|
643
|
-
export {
|
|
649
|
+
export { b as AdminAnalyticsPage };
|
|
644
650
|
|
|
645
651
|
//# sourceMappingURL=AdminAnalyticsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured analytics with 4 tabs (Overview/Revenue/Users/Performance),\n * time period filter, order status distribution, top performing carts,\n * revenue by city, user role distribution, growth insights, financial\n * performance, and today's performance metrics.\n */\n\nimport { useState, useEffect } from'react';\nimport {\n Users,\n TrendingUp,\n TrendingDown,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n MapPin,\n Clock,\n Timer,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AnalyticsData {\n revenue: { total: number; growth: number; thisMonth: number; lastMonth: number };\n orders: {\n total: number;\n growth: number;\n pending: number;\n completed: number;\n cancelled: number;\n averageOrderValue: number;\n ordersToday: number;\n };\n users: {\n total: number;\n growth: number;\n active: number;\n newThisMonth: number;\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n };\n carts: {\n total: number;\n active: number;\n pending: number;\n topPerforming: Array<{\n id: string;\n name: string;\n revenue: number;\n orders: number;\n rating: number;\n }>;\n };\n performance: {\n averageDeliveryTime: number;\n customerSatisfaction: number;\n platformFee: number;\n operatingCosts: number;\n netProfit: number;\n };\n geography: { topCities: Array<{ city: string; orders: number; revenue: number }> };\n}\n\ntype TimePeriod = 'today' | 'week' | 'month' | 'quarter' | 'year';\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { currentUser } = useCoolAndLovely();\n\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [loading, setLoading] = useState(true);\n const [selectedPeriod, setSelectedPeriod] = useState<TimePeriod>('month');\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setAnalytics({\n revenue: { total: 12500000, growth: 15.2, thisMonth: 2100000, lastMonth: 1850000 },\n orders: {\n total: 45230,\n growth: 8.7,\n pending: 156,\n completed: 44890,\n cancelled: 184,\n averageOrderValue: 276,\n ordersToday: 89,\n },\n users: {\n total: 12450,\n growth: 12.3,\n active: 9870,\n newThisMonth: 456,\n customers: 9850,\n cartOwners: 1240,\n workers: 890,\n investors: 470,\n },\n carts: {\n total: 1240,\n active: 1156,\n pending: 84,\n topPerforming: [\n { id: 'c1', name: 'South Indian Express', revenue: 285000, orders: 1250, rating: 4.8 },\n { id: 'c2', name: 'Mumbai Street Chaat', revenue: 245000, orders: 980, rating: 4.7 },\n { id: 'c3', name: 'Delhi Paratha Corner', revenue: 198000, orders: 876, rating: 4.6 },\n { id: 'c4', name: 'Bangalore Dosa House', revenue: 176000, orders: 743, rating: 4.9 },\n { id: 'c5', name: 'Kolkata Fish Fry', revenue: 154000, orders: 632, rating: 4.5 },\n ],\n },\n performance: {\n averageDeliveryTime: 28,\n customerSatisfaction: 4.6,\n platformFee: 8.5,\n operatingCosts: 2100000,\n netProfit: 850000,\n },\n geography: {\n topCities: [\n { city: 'Bangalore', orders: 15670, revenue: 4250000 },\n { city: 'Mumbai', orders: 12340, revenue: 3890000 },\n { city: 'Delhi', orders: 9870, revenue: 2980000 },\n { city: 'Hyderabad', orders: 7650, revenue: 2140000 },\n { city: 'Chennai', orders: 6540, revenue: 1890000 },\n ],\n },\n });\n setLoading(false);\n }, 800);\n return () => clearTimeout(timer);\n }, [selectedPeriod]);\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return`₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return`₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n const fmtGrowth = (growth: number) => {\n const isPositive = growth >= 0;\n return (\n <span\n className={cn(\n 'flex items-center gap-1 text-sm font-medium',\n isPositive ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {isPositive ? (\n <TrendingUp className=\"h-3.5 w-3.5\" />\n ) : (\n <TrendingDown className=\"h-3.5 w-3.5\" />\n )}\n {Math.abs(growth).toFixed(1)}%\n </span>\n );\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-text-secondary\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return <BarChart3 className=\"h-5 w-5 text-text-secondary\" />;\n };\n\n if (loading || !analytics) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n {/* Time Period Filter */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <select\n value={selectedPeriod}\n onChange={(e) => setSelectedPeriod(e.target.value as TimePeriod)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] w-fit\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"quarter\">This Quarter</option>\n <option value=\"year\">This Year</option>\n </select>\n <span className=\"text-sm text-text-secondary\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n </div>\n\n {/* Key Metrics */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(analytics.revenue.total)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${analytics.revenue.growth}%`}\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={analytics.orders.total.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue={`+${analytics.orders.growth}%`}\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={analytics.users.active.toLocaleString('en-IN')}\n label=\"Active Users\"\n trend=\"up\"\n trendValue={`+${analytics.users.growth}%`}\n />\n <MetricsCard\n icon={<BarChart3 className=\"h-5 w-5\" />}\n value={analytics.carts.active.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${analytics.carts.pending} pending`}\n />\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface mb-8\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Order Status Distribution\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-success-text\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {analytics.orders.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-success-text\">\n {((analytics.orders.completed / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-warning-border/30 bg-status-warning-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-warning-text\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">\n {analytics.orders.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-warning-text\">\n {((analytics.orders.pending / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-error-text\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {analytics.orders.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-error-text\">\n {((analytics.orders.cancelled / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Top Performing Carts</h3>\n <div className=\"rounded-lg border border-border-subtle overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.carts.topPerforming.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-text-primary\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-right font-medium text-text-primary\">\n {fmtCur(cart.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {cart.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {cart.rating}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-accent-blue-subtle/30 bg-accent-blue-subtle/10 p-6\">\n <h4 className=\"text-sm font-medium text-accent-blue mb-2\">\n This Month\n </h4>\n <p className=\"text-2xl font-bold text-accent-blue\">\n {fmtCur(analytics.revenue.thisMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Last Month</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {fmtCur(analytics.revenue.lastMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-6\">\n <h4 className=\"text-sm font-medium text-status-success-text mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-status-success-text\">\n ₹{analytics.orders.averageOrderValue}\n </p>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Revenue by City</h3>\n <div className=\"space-y-3\">\n {analytics.geography.topCities.map((city, i) => (\n <div\n key={city.city}\n className=\"flex items-center justify-between p-4 rounded-lg border border-border-subtle bg-bg-sunken/30\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(i)}\n <div>\n <p className=\"font-medium text-text-primary\">{city.city}</p>\n <p className=\"text-sm text-text-secondary\">\n {city.orders.toLocaleString('en-IN')} orders\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold text-text-primary\">{fmtCur(city.revenue)}</p>\n <p className=\"text-sm text-text-secondary\">\n {((city.revenue / analytics.revenue.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n {[\n { label: 'Customers', value: analytics.users.customers, color: 'blue' },\n { label: 'Cart Owners', value: analytics.users.cartOwners, color: 'green' },\n { label: 'Workers', value: analytics.users.workers, color: 'yellow' },\n { label: 'Investors', value: analytics.users.investors, color: 'purple' },\n ].map((item) => (\n <div\n key={item.label}\n className={cn(\n 'rounded-lg border p-4',\n `border-${item.color}-500/30 bg-${item.color}-500/10`\n )}\n >\n <h4\n className={cn(\n 'text-sm font-medium',\n `text-${item.color}-600 dark:text-${item.color}-400`\n )}\n >\n {item.label}\n </h4>\n <p\n className={cn(\n 'text-2xl font-bold',\n `text-${item.color}-700 dark:text-${item.color}-300`\n )}\n >\n {item.value.toLocaleString('en-IN')}\n </p>\n <p\n className={cn(\n 'text-sm',\n `text-${item.color}-600/80 dark:text-${item.color}-400/80`\n )}\n >\n {((item.value / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">User Growth Insights</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">New Users This Month</p>\n <p className=\"text-3xl font-bold text-accent-blue\">\n {analytics.users.newThisMonth}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Active Users Rate</p>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {((analytics.users.active / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Timer className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Avg Delivery Time</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.averageDeliveryTime} min\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Target: < 30 min</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-status-warning-text text-status-warning-text\" />\n {analytics.performance.customerSatisfaction}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Based on ratings</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Platform Fee</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.platformFee}%\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Per transaction</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Financial Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Operating Costs</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {fmtCur(analytics.performance.operatingCosts)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-accent-blue\">\n {fmtCur(analytics.revenue.total)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Net Profit</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {fmtCur(analytics.performance.netProfit)}\n </p>\n </div>\n </div>\n <div className=\"mt-4 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-sm text-text-secondary\">Profit Margin</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {((analytics.performance.netProfit / analytics.revenue.total) * 100).toFixed(1)}\n %\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Today's Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-accent-blue\">\n {analytics.orders.ordersToday}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Estimated Revenue</p>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {fmtCur(analytics.orders.ordersToday * analytics.orders.averageOrderValue)}\n </p>\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":"AdminAnalyticsPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/admin/AdminAnalyticsPage.tsx"],"sourcesContent":["/**\n * Admin Analytics Page\n * @module coolandlovely/pages/admin\n *\n * Full-featured analytics with 4 tabs (Overview/Revenue/Users/Performance),\n * time period filter, order status distribution, top performing carts,\n * revenue by city, user role distribution, growth insights, financial\n * performance, and today's performance metrics.\n */\n\nimport { useState, useEffect } from'react';\nimport {\n Users,\n TrendingUp,\n TrendingDown,\n ShoppingBag,\n IndianRupee,\n BarChart3,\n Zap,\n Loader2,\n Star,\n Award,\n MapPin,\n Clock,\n Timer,\n} from'lucide-react';\nimport { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { MetricsCard } from'../../components/MetricsCard';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency } from'../../utils/formatters';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface AnalyticsData {\n revenue: { total: number; growth: number; thisMonth: number; lastMonth: number };\n orders: {\n total: number;\n growth: number;\n pending: number;\n completed: number;\n cancelled: number;\n averageOrderValue: number;\n ordersToday: number;\n };\n users: {\n total: number;\n growth: number;\n active: number;\n newThisMonth: number;\n customers: number;\n cartOwners: number;\n workers: number;\n investors: number;\n };\n carts: {\n total: number;\n active: number;\n pending: number;\n topPerforming: Array<{\n id: string;\n name: string;\n revenue: number;\n orders: number;\n rating: number;\n }>;\n };\n performance: {\n averageDeliveryTime: number;\n customerSatisfaction: number;\n platformFee: number;\n operatingCosts: number;\n netProfit: number;\n };\n geography: { topCities: Array<{ city: string; orders: number; revenue: number }> };\n}\n\ntype TimePeriod = 'today' | 'week' | 'month' | 'quarter' | 'year';\ntype TabKey = 'overview' | 'revenue' | 'users' | 'performance';\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function AdminAnalyticsPage() {\n const { currentUser } = useCoolAndLovely();\n\n const [analytics, setAnalytics] = useState<AnalyticsData | null>(null);\n const [loading, setLoading] = useState(true);\n const [selectedPeriod, setSelectedPeriod] = useState<TimePeriod>('month');\n const [activeTab, setActiveTab] = useState<TabKey>('overview');\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setAnalytics({\n revenue: { total: 12500000, growth: 15.2, thisMonth: 2100000, lastMonth: 1850000 },\n orders: {\n total: 45230,\n growth: 8.7,\n pending: 156,\n completed: 44890,\n cancelled: 184,\n averageOrderValue: 276,\n ordersToday: 89,\n },\n users: {\n total: 12450,\n growth: 12.3,\n active: 9870,\n newThisMonth: 456,\n customers: 9850,\n cartOwners: 1240,\n workers: 890,\n investors: 470,\n },\n carts: {\n total: 1240,\n active: 1156,\n pending: 84,\n topPerforming: [\n { id: 'c1', name: 'South Indian Express', revenue: 285000, orders: 1250, rating: 4.8 },\n { id: 'c2', name: 'Mumbai Street Chaat', revenue: 245000, orders: 980, rating: 4.7 },\n { id: 'c3', name: 'Delhi Paratha Corner', revenue: 198000, orders: 876, rating: 4.6 },\n { id: 'c4', name: 'Bangalore Dosa House', revenue: 176000, orders: 743, rating: 4.9 },\n { id: 'c5', name: 'Kolkata Fish Fry', revenue: 154000, orders: 632, rating: 4.5 },\n ],\n },\n performance: {\n averageDeliveryTime: 28,\n customerSatisfaction: 4.6,\n platformFee: 8.5,\n operatingCosts: 2100000,\n netProfit: 850000,\n },\n geography: {\n topCities: [\n { city: 'Bangalore', orders: 15670, revenue: 4250000 },\n { city: 'Mumbai', orders: 12340, revenue: 3890000 },\n { city: 'Delhi', orders: 9870, revenue: 2980000 },\n { city: 'Hyderabad', orders: 7650, revenue: 2140000 },\n { city: 'Chennai', orders: 6540, revenue: 1890000 },\n ],\n },\n });\n setLoading(false);\n }, 800);\n return () => clearTimeout(timer);\n }, [selectedPeriod]);\n\n const fmtCur = (amount: number) => {\n if (amount >= 10000000) return`₹${(amount / 10000000).toFixed(1)}Cr`;\n if (amount >= 100000) return`₹${(amount / 100000).toFixed(1)}L`;\n return formatCurrency(amount, { minimumFractionDigits: 0 });\n };\n\n const fmtGrowth = (growth: number) => {\n const isPositive = growth >= 0;\n return (\n <span\n className={cn(\n 'flex items-center gap-1 text-sm font-medium',\n isPositive ? 'text-status-success-text' : 'text-status-error-text'\n )}\n >\n {isPositive ? (\n <TrendingUp className=\"h-3.5 w-3.5\" />\n ) : (\n <TrendingDown className=\"h-3.5 w-3.5\" />\n )}\n {Math.abs(growth).toFixed(1)}%\n </span>\n );\n };\n\n const medalIcon = (index: number) => {\n if (index === 0) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n if (index === 1) return <Award className=\"h-5 w-5 text-text-secondary\" />;\n if (index === 2) return <Award className=\"h-5 w-5 text-status-warning-text\" />;\n return <BarChart3 className=\"h-5 w-5 text-text-secondary\" />;\n };\n\n if (loading || !analytics) {\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Loading analytics...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading analytics...</p>\n </div>\n </PageLayout>\n );\n }\n\n const tabs: Array<{ key: TabKey; label: string; icon: typeof BarChart3 }> = [\n { key: 'overview', label: 'Overview', icon: BarChart3 },\n { key: 'revenue', label: 'Revenue', icon: IndianRupee },\n { key: 'users', label: 'Users', icon: Users },\n { key: 'performance', label: 'Performance', icon: Zap },\n ];\n\n return (\n <PageLayout title=\"Platform Analytics\" description=\"Comprehensive platform metrics and trends\">\n <PagePurpose className=\"mb-6\" icon={<BarChart3 className=\"h-4 w-4\" />}>\n The numbers behind the whole marketplace. Track revenue, orders, users and\n active carts over any period, drill into revenue, user and performance\n breakdowns, and spot top performers — so platform decisions are grounded in\n data, not guesswork.\n </PagePurpose>\n\n {/* Time Period Filter */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <select\n value={selectedPeriod}\n onChange={(e) => setSelectedPeriod(e.target.value as TimePeriod)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] w-fit\"\n >\n <option value=\"today\">Today</option>\n <option value=\"week\">This Week</option>\n <option value=\"month\">This Month</option>\n <option value=\"quarter\">This Quarter</option>\n <option value=\"year\">This Year</option>\n </select>\n <span className=\"text-sm text-text-secondary\">\n Last updated: {new Date().toLocaleString('en-IN')}\n </span>\n </div>\n\n {/* Key Metrics — primary emphasis zone */}\n <EmphasisPanel className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-8 p-4\">\n <MetricsCard\n icon={<IndianRupee className=\"h-5 w-5\" />}\n value={fmtCur(analytics.revenue.total)}\n label=\"Total Revenue\"\n trend=\"up\"\n trendValue={`+${analytics.revenue.growth}%`}\n />\n <MetricsCard\n icon={<ShoppingBag className=\"h-5 w-5\" />}\n value={analytics.orders.total.toLocaleString('en-IN')}\n label=\"Total Orders\"\n trend=\"up\"\n trendValue={`+${analytics.orders.growth}%`}\n />\n <MetricsCard\n icon={<Users className=\"h-5 w-5\" />}\n value={analytics.users.active.toLocaleString('en-IN')}\n label=\"Active Users\"\n trend=\"up\"\n trendValue={`+${analytics.users.growth}%`}\n />\n <MetricsCard\n icon={<BarChart3 className=\"h-5 w-5\" />}\n value={analytics.carts.active.toLocaleString('en-IN')}\n label=\"Active Carts\"\n trendValue={`${analytics.carts.pending} pending`}\n />\n </EmphasisPanel>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface mb-8\">\n <div className=\"border-b border-border-subtle\">\n <nav className=\"flex -mb-px overflow-x-auto\">\n {tabs.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n 'flex items-center gap-2 py-3 px-4 sm:px-6 text-sm font-medium whitespace-nowrap border-b-2 transition-colors',\n activeTab === tab.key\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n </div>\n\n <div className=\"p-4 sm:p-6\">\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-8\">\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Order Status Distribution\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-success-text\">Completed Orders</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {analytics.orders.completed.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-success-text\">\n {((analytics.orders.completed / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-warning-border/30 bg-status-warning-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-warning-text\">Pending Orders</p>\n <p className=\"text-2xl font-bold text-status-warning-text\">\n {analytics.orders.pending.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-warning-text\">\n {((analytics.orders.pending / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n <div className=\"rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/10 p-4\">\n <p className=\"text-sm text-status-error-text\">Cancelled Orders</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {analytics.orders.cancelled.toLocaleString('en-IN')}\n </p>\n <p className=\"text-sm text-status-error-text\">\n {((analytics.orders.cancelled / analytics.orders.total) * 100).toFixed(1)}% of\n total\n </p>\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Top Performing Carts</h3>\n <div className=\"rounded-lg border border-border-subtle overflow-hidden\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase\">\n Cart Name\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Revenue\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Orders\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium text-text-secondary uppercase\">\n Rating\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {analytics.carts.topPerforming.map((cart, i) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n {medalIcon(i)}\n <span className=\"text-sm font-medium text-text-primary\">\n {cart.name}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm text-right font-medium text-text-primary\">\n {fmtCur(cart.revenue)}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n {cart.orders.toLocaleString('en-IN')}\n </td>\n <td className=\"px-4 py-3 text-sm text-right text-text-primary\">\n <span className=\"flex items-center justify-end gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {cart.rating}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n )}\n\n {/* Revenue Tab */}\n {activeTab === 'revenue' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <div className=\"rounded-lg border border-accent-blue-subtle/30 bg-accent-blue-subtle/10 p-6\">\n <h4 className=\"text-sm font-medium text-accent-blue mb-2\">\n This Month\n </h4>\n <p className=\"text-2xl font-bold text-accent-blue\">\n {fmtCur(analytics.revenue.thisMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-6\">\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Last Month</h4>\n <p className=\"text-2xl font-bold text-text-primary\">\n {fmtCur(analytics.revenue.lastMonth)}\n </p>\n </div>\n <div className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-6\">\n <h4 className=\"text-sm font-medium text-status-success-text mb-2\">\n Average Order Value\n </h4>\n <p className=\"text-2xl font-bold text-status-success-text\">\n ₹{analytics.orders.averageOrderValue}\n </p>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">Revenue by City</h3>\n <div className=\"space-y-3\">\n {analytics.geography.topCities.map((city, i) => (\n <div\n key={city.city}\n className=\"flex items-center justify-between p-4 rounded-lg border border-border-subtle bg-bg-sunken/30\"\n >\n <div className=\"flex items-center gap-3\">\n {medalIcon(i)}\n <div>\n <p className=\"font-medium text-text-primary\">{city.city}</p>\n <p className=\"text-sm text-text-secondary\">\n {city.orders.toLocaleString('en-IN')} orders\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-bold text-text-primary\">{fmtCur(city.revenue)}</p>\n <p className=\"text-sm text-text-secondary\">\n {((city.revenue / analytics.revenue.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {/* Users Tab */}\n {activeTab === 'users' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n {[\n { label: 'Customers', value: analytics.users.customers, color: 'blue' },\n { label: 'Cart Owners', value: analytics.users.cartOwners, color: 'green' },\n { label: 'Workers', value: analytics.users.workers, color: 'yellow' },\n { label: 'Investors', value: analytics.users.investors, color: 'purple' },\n ].map((item) => (\n <div\n key={item.label}\n className={cn(\n 'rounded-lg border p-4',\n `border-${item.color}-500/30 bg-${item.color}-500/10`\n )}\n >\n <h4\n className={cn(\n 'text-sm font-medium',\n `text-${item.color}-600 dark:text-${item.color}-400`\n )}\n >\n {item.label}\n </h4>\n <p\n className={cn(\n 'text-2xl font-bold',\n `text-${item.color}-700 dark:text-${item.color}-300`\n )}\n >\n {item.value.toLocaleString('en-IN')}\n </p>\n <p\n className={cn(\n 'text-sm',\n `text-${item.color}-600/80 dark:text-${item.color}-400/80`\n )}\n >\n {((item.value / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n ))}\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">User Growth Insights</h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">New Users This Month</p>\n <p className=\"text-3xl font-bold text-accent-blue\">\n {analytics.users.newThisMonth}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Active Users Rate</p>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {((analytics.users.active / analytics.users.total) * 100).toFixed(1)}%\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Performance Tab */}\n {activeTab === 'performance' && (\n <div className=\"space-y-8\">\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Timer className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Avg Delivery Time</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.averageDeliveryTime} min\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Target: < 30 min</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Star className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">\n Customer Satisfaction\n </h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary flex items-center gap-1\">\n <Star className=\"h-6 w-6 fill-status-warning-text text-status-warning-text\" />\n {analytics.performance.customerSatisfaction}\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Based on ratings</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <div className=\"flex items-center gap-2 mb-2\">\n <IndianRupee className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-medium text-text-secondary\">Platform Fee</h4>\n </div>\n <p className=\"text-3xl font-bold text-text-primary\">\n {analytics.performance.platformFee}%\n </p>\n <p className=\"text-sm text-text-secondary mt-1\">Per transaction</p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/20 p-6\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Financial Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Operating Costs</p>\n <p className=\"text-2xl font-bold text-status-error-text\">\n {fmtCur(analytics.performance.operatingCosts)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Total Revenue</p>\n <p className=\"text-2xl font-bold text-accent-blue\">\n {fmtCur(analytics.revenue.total)}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Net Profit</p>\n <p className=\"text-2xl font-bold text-status-success-text\">\n {fmtCur(analytics.performance.netProfit)}\n </p>\n </div>\n </div>\n <div className=\"mt-4 rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <p className=\"text-sm text-text-secondary\">Profit Margin</p>\n <p className=\"text-xl font-bold text-text-primary\">\n {((analytics.performance.netProfit / analytics.revenue.total) * 100).toFixed(1)}\n %\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h3 className=\"text-lg font-semibold text-text-primary mb-4\">\n Today's Performance\n </h3>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Orders Today</p>\n <p className=\"text-3xl font-bold text-accent-blue\">\n {analytics.orders.ordersToday}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary mb-2\">Estimated Revenue</p>\n <p className=\"text-3xl font-bold text-status-success-text\">\n {fmtCur(analytics.orders.ordersToday * analytics.orders.averageOrderValue)}\n </p>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|