diff --git a/src/api/adminSalesStats.ts b/src/api/adminSalesStats.ts index 8985faf..26c902a 100644 --- a/src/api/adminSalesStats.ts +++ b/src/api/adminSalesStats.ts @@ -119,6 +119,11 @@ export interface DailyAddonItem { total_gb: number; } +export interface DailyDeviceItem { + date: string; + count: number; +} + export interface AddonsStats { total_purchases: number; total_gb_purchased: number; @@ -127,6 +132,7 @@ export interface AddonsStats { device_revenue_kopeks: number; by_package: AddonByPackageItem[]; daily: DailyAddonItem[]; + daily_devices: DailyDeviceItem[]; } // ============ Deposits ============ diff --git a/src/components/sales-stats/AddonsTab.tsx b/src/components/sales-stats/AddonsTab.tsx index 73a1d1a..bf6ccbb 100644 --- a/src/components/sales-stats/AddonsTab.tsx +++ b/src/components/sales-stats/AddonsTab.tsx @@ -1,3 +1,4 @@ +import { useMemo } from 'react'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; @@ -7,7 +8,7 @@ import { SALES_STATS } from '../../constants/salesStats'; import { useCurrency } from '../../hooks/useCurrency'; import { StatCard } from '../stats'; -import { SimpleAreaChart } from './SimpleAreaChart'; +import { DualAreaChart } from './DualAreaChart'; import { SimpleBarChart } from './SimpleBarChart'; interface AddonsTabProps { @@ -24,6 +25,18 @@ export function AddonsTab({ params }: AddonsTabProps) { staleTime: SALES_STATS.STALE_TIME, }); + const dailyChartData = useMemo(() => { + if (!data) return []; + const trafficByDate = new Map(data.daily.map((d) => [d.date, d.count])); + const deviceByDate = new Map(data.daily_devices.map((d) => [d.date, d.count])); + const allDates = Array.from(new Set([...trafficByDate.keys(), ...deviceByDate.keys()])).sort(); + return allDates.map((date) => ({ + date, + series1: trafficByDate.get(date) ?? 0, + series2: deviceByDate.get(date) ?? 0, + })); + }, [data]); + if (isLoading) { return (
@@ -43,11 +56,6 @@ export function AddonsTab({ params }: AddonsTabProps) { value: item.count, })); - const dailyData = data.daily.map((item) => ({ - date: item.date, - value: item.count, - })); - return (
@@ -77,12 +85,14 @@ export function AddonsTab({ params }: AddonsTabProps) {
-
diff --git a/src/locales/en.json b/src/locales/en.json index ded563e..087ea49 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1140,8 +1140,10 @@ "revenue": "Revenue", "devicePurchases": "Device Purchases", "deviceRevenue": "Device Revenue", + "trafficPurchases": "Traffic", + "devicePurchasesDaily": "Devices", "byPackage": "By Package Size", - "dailyChart": "Daily Purchases", + "dailyChart": "Daily Add-on Purchases", "purchases": "Purchases" }, "deposits": { diff --git a/src/locales/fa.json b/src/locales/fa.json index 8788a67..f81c060 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -963,8 +963,10 @@ "revenue": "درآمد", "devicePurchases": "خرید دستگاه", "deviceRevenue": "درآمد دستگاه", + "trafficPurchases": "ترافیک", + "devicePurchasesDaily": "دستگاه", "byPackage": "بر اساس بسته", - "dailyChart": "خرید روزانه", + "dailyChart": "خرید روزانه خدمات اضافی", "purchases": "خرید" }, "deposits": { diff --git a/src/locales/ru.json b/src/locales/ru.json index c34a181..d486401 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1161,8 +1161,10 @@ "revenue": "Доход", "devicePurchases": "Покупки устройств", "deviceRevenue": "Доход от устройств", + "trafficPurchases": "Трафик", + "devicePurchasesDaily": "Устройства", "byPackage": "По размеру пакета", - "dailyChart": "Покупки по дням", + "dailyChart": "Покупки доп. услуг по дням", "purchases": "Покупки" }, "deposits": { diff --git a/src/locales/zh.json b/src/locales/zh.json index 6b3b19d..e24c7dd 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -963,8 +963,10 @@ "revenue": "收入", "devicePurchases": "设备购买", "deviceRevenue": "设备收入", + "trafficPurchases": "流量", + "devicePurchasesDaily": "设备", "byPackage": "按套餐大小", - "dailyChart": "每日购买", + "dailyChart": "每日附加服务购买", "purchases": "购买" }, "deposits": {