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

@@ -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": "Пользователи кампании",