feat: add recharts analytics to admin campaign stats page

- Move shared chart components (DailyChart, PeriodComparison, StatCard) to src/components/stats/ with configurable label props
- Create shared types for chart data decoupled from partner API
- Add campaign chart data API client with deposits/spending split
- Enhance AdminCampaignStats with daily trends chart, period comparison, top registrations, and deposit/spending stat cards
- Add useChartColors hook with SSR guard and theme-aware CSS variable parsing
- Add cross-platform clipboard utility with execCommand fallback for Telegram WebView
- Add i18n keys for chart analytics across all 4 locales (en, ru, zh, fa)
- Responsive fixes: truncation for long names/values, responsive text sizing, touch-friendly copy buttons
This commit is contained in:
Fringg
2026-03-02 06:10:20 +03:00
parent 60f16e64e8
commit c7d05c4809
21 changed files with 1577 additions and 158 deletions

View File

@@ -750,6 +750,28 @@
"tariff": "Bonus tariff",
"tariffDesc": "Free tariff plan"
},
"stats": {
"registrations": "Registrations",
"referrals": "Referrals",
"earnings": "Earnings",
"conversionRate": "Conversion",
"today": "Today",
"week": "Week",
"month": "Month",
"showDetails": "Details",
"hideDetails": "Collapse",
"vsLastWeek": "vs last week",
"topReferrals": "Top Referrals",
"noData": "No data",
"dailyChart": "30-day trends",
"periodComparison": "Period comparison",
"noReferrals": "No referrals yet",
"paid": "Paid",
"pending": "Pending",
"active": "Active",
"referralsCount": "Referrals",
"earningsAmount": "Earned"
},
"fields": {
"companyName": "Company Name",
"companyNamePlaceholder": "Your company or brand name",
@@ -1991,7 +2013,17 @@
"users": "Users",
"noUsers": "No registered users",
"paid": "Paid",
"hasSub": "Has sub"
"hasSub": "Has sub",
"dailyChart": "30-day trends",
"chartRegistrations": "Registrations",
"chartRevenue": "Revenue",
"totalDeposits": "Total Deposits",
"totalSpending": "Subscription Spending",
"periodComparison": "Period comparison",
"vsLastWeek": "vs last week",
"topRegistrations": "Top registrations",
"noRegistrations": "No registrations yet",
"chartLoading": "Loading chart data..."
},
"users": {
"title": "Campaign Users",

View File

@@ -584,6 +584,28 @@
"tariff": "تعرفه جایزه",
"tariffDesc": "طرح تعرفه رایگان"
},
"stats": {
"registrations": "ثبت‌نام",
"referrals": "معرفی‌شده‌ها",
"earnings": "درآمد",
"conversionRate": "نرخ تبدیل",
"today": "امروز",
"week": "هفته",
"month": "ماه",
"showDetails": "جزئیات",
"hideDetails": "بستن",
"vsLastWeek": "مقایسه با هفته قبل",
"topReferrals": "برترین معرفی‌شده‌ها",
"noData": "داده‌ای نیست",
"dailyChart": "روند ۳۰ روزه",
"periodComparison": "مقایسه دوره‌ها",
"noReferrals": "هنوز معرفی‌شده‌ای نیست",
"paid": "پرداخت شده",
"pending": "در انتظار",
"active": "فعال",
"referralsCount": "تعداد معرفی",
"earningsAmount": "کسب شده"
},
"fields": {
"companyName": "نام شرکت",
"companyNamePlaceholder": "نام شرکت یا برند شما",
@@ -1670,7 +1692,17 @@
"users": "کاربران",
"noUsers": "کاربر ثبت‌نام شده‌ای وجود ندارد",
"paid": "پرداخت کرده",
"hasSub": "دارای اشتراک"
"hasSub": "دارای اشتراک",
"dailyChart": "روند ۳۰ روزه",
"chartRegistrations": "ثبت‌نام‌ها",
"chartRevenue": "درآمد",
"totalDeposits": "کل واریزی‌ها",
"totalSpending": "هزینه اشتراک",
"periodComparison": "مقایسه دوره‌ها",
"vsLastWeek": "نسبت به هفته قبل",
"topRegistrations": "بالاترین ثبت‌نام‌ها",
"noRegistrations": "هنوز ثبت‌نامی وجود ندارد",
"chartLoading": "در حال بارگذاری..."
},
"users": {
"title": "کاربران کمپین",

View File

@@ -778,6 +778,28 @@
"tariff": "Бонусный тариф",
"tariffDesc": "Бесплатный тарифный план"
},
"stats": {
"registrations": "Регистрации",
"referrals": "Рефералы",
"earnings": "Заработок",
"conversionRate": "Конверсия",
"today": "Сегодня",
"week": "Неделя",
"month": "Месяц",
"showDetails": "Подробнее",
"hideDetails": "Свернуть",
"vsLastWeek": "vs прошлая неделя",
"topReferrals": "Топ рефералы",
"noData": "Нет данных",
"dailyChart": "Динамика за 30 дней",
"periodComparison": "Сравнение периодов",
"noReferrals": "Пока нет рефералов",
"paid": "Оплатил",
"pending": "Ожидание",
"active": "Активен",
"referralsCount": "Рефералов",
"earningsAmount": "Заработано"
},
"fields": {
"companyName": "Название компании",
"companyNamePlaceholder": "Название вашей компании или бренда",
@@ -2512,7 +2534,17 @@
"users": "Пользователи",
"noUsers": "Нет зарегистрированных пользователей",
"paid": "Платил",
"hasSub": "Подписка"
"hasSub": "Подписка",
"dailyChart": "Динамика за 30 дней",
"chartRegistrations": "Регистрации",
"chartRevenue": "Доход",
"totalDeposits": "Всего пополнений",
"totalSpending": "Расход на подписки",
"periodComparison": "Сравнение периодов",
"vsLastWeek": "vs прошлая неделя",
"topRegistrations": "Топ регистрации",
"noRegistrations": "Пока нет регистраций",
"chartLoading": "Загрузка данных..."
},
"users": {
"title": "Пользователи кампании",

View File

@@ -584,6 +584,28 @@
"tariff": "奖励套餐",
"tariffDesc": "免费套餐方案"
},
"stats": {
"registrations": "注册",
"referrals": "推荐",
"earnings": "收入",
"conversionRate": "转化率",
"today": "今天",
"week": "本周",
"month": "本月",
"showDetails": "详情",
"hideDetails": "收起",
"vsLastWeek": "对比上周",
"topReferrals": "热门推荐",
"noData": "暂无数据",
"dailyChart": "30天趋势",
"periodComparison": "周期对比",
"noReferrals": "暂无推荐",
"paid": "已付款",
"pending": "待处理",
"active": "活跃",
"referralsCount": "推荐数",
"earningsAmount": "收入"
},
"fields": {
"companyName": "公司名称",
"companyNamePlaceholder": "您的公司或品牌名称",
@@ -1669,7 +1691,17 @@
"users": "用户",
"noUsers": "没有注册用户",
"paid": "已付费",
"hasSub": "有订阅"
"hasSub": "有订阅",
"dailyChart": "30天趋势",
"chartRegistrations": "注册",
"chartRevenue": "收入",
"totalDeposits": "总充值",
"totalSpending": "订阅支出",
"periodComparison": "期间比较",
"vsLastWeek": "与上周对比",
"topRegistrations": "热门注册",
"noRegistrations": "暂无注册",
"chartLoading": "加载图表数据..."
},
"users": {
"title": "活动用户",