From 8862aecc61887f632796468be8a32e289ff322bb Mon Sep 17 00:00:00 2001 From: g Date: Tue, 6 Jan 2026 17:59:30 +0000 Subject: [PATCH] Update AdminAnalytics.tsx --- components/admin/AdminAnalytics.tsx | 374 ++++++++++------------------ 1 file changed, 129 insertions(+), 245 deletions(-) diff --git a/components/admin/AdminAnalytics.tsx b/components/admin/AdminAnalytics.tsx index cf0bc1d..2e2e0a0 100644 --- a/components/admin/AdminAnalytics.tsx +++ b/components/admin/AdminAnalytics.tsx @@ -44,7 +44,7 @@ import { ComposedChart, } from "recharts"; import { formatGBP } from "@/utils/format"; -import { PieChart, Pie, Cell, Legend, AreaChart, Area } from "recharts"; +import { PieChart, Pie, Cell, Legend } from "recharts"; interface GrowthData { launchDate: string; @@ -88,24 +88,7 @@ interface GrowthData { vip: number; }; }; - profit: { - monthly: Array<{ - month: string; - revenue: number; - trackedRevenue: number; - cost: number; - profit: number; - profitMargin: number; - costDataCoverage: number; - }>; - totals: { - revenue: number; - trackedRevenue: number; - cost: number; - profit: number; - profitMargin: number; - }; - }; + cumulative: { orders: number; revenue: number; @@ -1370,236 +1353,137 @@ export default function AdminAnalytics() { -
- {/* Customer Segments Pie Chart */} - - - Customer Segments - - Breakdown by purchase behavior - - - - {growthLoading ? ( -
-
-
- ) : growthData?.customers ? ( -
- - - - `${name}: ${(percent * 100).toFixed(0)}%` - } - labelLine={false} - > - {[ - { color: SEGMENT_COLORS.new }, - { color: SEGMENT_COLORS.returning }, - { color: SEGMENT_COLORS.loyal }, - { color: SEGMENT_COLORS.vip }, - ].map((entry, index) => ( - - ))} - - { - if (active && payload?.length) { - const data = payload[0].payload; - const details = - growthData.customers.segmentDetails[ - data.name.split(" ")[0].toLowerCase() - ]; - return ( -
-

{data.name}

-

- Count: {data.value.toLocaleString()} -

- {details && ( - <> -

- Revenue:{" "} - {formatCurrency(details.totalRevenue)} -

-

- Avg Orders: {details.avgOrderCount} -

- - )} -
- ); - } - return null; - }} - /> -
-
-
- ) : ( -
- No customer data available -
- )} - - {/* Segment Stats */} - {growthData?.customers && ( -
-
-
- {growthData.customers.segments.new} -
-
New
-
-
-
- {growthData.customers.segments.returning} -
-
- Returning -
-
-
-
- {growthData.customers.segments.loyal} -
-
Loyal
-
-
-
- {growthData.customers.segments.vip} -
-
VIP
-
-
- )} -
-
- - {/* Monthly Profit Chart */} - - - Monthly Profit Trends - - Profit margins over time - {growthData?.profit?.totals && ( - - (Total: {formatCurrency(growthData.profit.totals.profit)}{" "} - at {growthData.profit.totals.profitMargin}% margin) - - )} - - - - {growthLoading ? ( -
-
-
- ) : growthData?.profit?.monthly && - growthData.profit.monthly.length > 0 ? ( -
- - ({ - ...m, - formattedMonth: new Date( - m.month + "-01", - ).toLocaleDateString("en-GB", { - month: "short", - year: "2-digit", - }), - }))} - margin={{ top: 5, right: 30, left: 20, bottom: 5 }} + {/* Customer Segments Pie Chart */} + + + Customer Segments + Breakdown by purchase behavior + + + {growthLoading ? ( +
+
+
+ ) : growthData?.customers ? ( +
+ + + + `${name}: ${(percent * 100).toFixed(0)}%` + } + labelLine={false} > - - - - `£${(value / 1000).toFixed(0)}k` + {[ + { color: SEGMENT_COLORS.new }, + { color: SEGMENT_COLORS.returning }, + { color: SEGMENT_COLORS.loyal }, + { color: SEGMENT_COLORS.vip }, + ].map((entry, index) => ( + + ))} + + { + if (active && payload?.length) { + const data = payload[0].payload; + const details = + growthData.customers.segmentDetails[ + data.name.split(" ")[0].toLowerCase() + ]; + return ( +
+

{data.name}

+

+ Count: {data.value.toLocaleString()} +

+ {details && ( + <> +

+ Revenue:{" "} + {formatCurrency(details.totalRevenue)} +

+

+ Avg Orders: {details.avgOrderCount} +

+ + )} +
+ ); } - /> - { - if (active && payload?.length) { - const data = payload[0].payload; - return ( -
-

- {data.month} -

-

- Revenue: {formatCurrency(data.revenue)} -

-

- Cost: {formatCurrency(data.cost)} -

-

- Profit: {formatCurrency(data.profit)} -

-

- Margin: {data.profitMargin}% -

-

- Cost data coverage: {data.costDataCoverage}% -

-
- ); - } - return null; - }} - /> - - -
+ return null; + }} + /> + + +
+ ) : ( +
+ No customer data available +
+ )} + + {/* Segment Stats */} + {growthData?.customers && ( +
+
+
+ {growthData.customers.segments.new} +
+
New
- ) : ( -
- No profit data available (add costPerUnit to products) +
+
+ {growthData.customers.segments.returning} +
+
+ Returning +
- )} - - -
+
+
+ {growthData.customers.segments.loyal} +
+
Loyal
+
+
+
+ {growthData.customers.segments.vip} +
+
VIP
+
+
+ )} +
+
{/* Monthly Growth Table */} {growthData?.monthly && growthData.monthly.length > 0 && (