fix: improve campaign stats, shared chart components, and i18n coverage

- Extract shared chart constants to constants/charts.ts
- Add TREND_STYLES to stats/constants.ts for reuse
- Fix useChartColors with MutationObserver for theme changes
- Fix DailyChart date parsing to prevent timezone shift
- Add truncate to StatCard value for overflow safety
- Fix CampaignCard copy feedback inside try block
- Add NaN validation and staleTime to AdminCampaignStats
- Replace hardcoded strings with i18n keys in Referral page
- Add missing i18n keys across all 4 locales (en, ru, zh, fa)
- Add sales stats route to AdminPanel and App router
This commit is contained in:
Fringg
2026-03-02 20:34:24 +03:00
parent c7d05c4809
commit 673de08dd4
16 changed files with 449 additions and 84 deletions

View File

@@ -702,6 +702,8 @@
},
"yourReferrals": "Your Referrals",
"noReferrals": "No referrals yet. Share your link to invite friends!",
"anonymousUser": "User #{{id}}",
"anonymousReferral": "Referral",
"user": "User",
"joined": "Joined",
"hasPaid": "Has Paid",
@@ -1040,7 +1042,8 @@
"roles": "Roles",
"roleAssign": "Role Assignment",
"policies": "Access Policies",
"auditLog": "Audit Log"
"auditLog": "Audit Log",
"salesStats": "Sales Statistics"
},
"panel": {
"title": "Admin Panel",
@@ -1072,7 +1075,78 @@
"rolesDesc": "Manage admin roles and permissions",
"roleAssignDesc": "Assign and revoke user roles",
"policiesDesc": "Configure ABAC access policies",
"auditLogDesc": "Review system activity and access history"
"auditLogDesc": "Review system activity and access history",
"salesStatsDesc": "Sales analytics and trends"
},
"salesStats": {
"title": "Sales Statistics",
"subtitle": "Revenue, trials, subscriptions, and renewals",
"period": {
"week": "7 days",
"month": "30 days",
"quarter": "90 days",
"all": "All time",
"custom": "Custom"
},
"tabs": {
"trials": "Trials",
"sales": "Sales",
"renewals": "Renewals",
"addons": "Add-ons",
"deposits": "Deposits"
},
"summary": {
"revenue": "Revenue",
"activeSubs": "Active Subs",
"activeTrials": "Active Trials",
"newTrials": "New Trials",
"conversion": "Conversion",
"renewals": "Renewals",
"addonRevenue": "Add-on Revenue"
},
"trials": {
"total": "Total Trials",
"conversion": "Conversion Rate",
"avgDuration": "Avg Duration",
"byProvider": "By Registration Source",
"dailyChart": "Daily Registrations",
"registrations": "Registrations"
},
"sales": {
"totalSales": "Total Sales",
"avgOrder": "Avg Order",
"topTariff": "Top Tariff",
"byTariff": "Sales by Tariff",
"byPeriod": "By Subscription Period",
"dailyChart": "Daily Sales"
},
"renewals": {
"total": "Total Renewals",
"rate": "Renewal Rate",
"revenue": "Revenue",
"comparison": "Period Comparison",
"currentPeriod": "Current Period",
"previousPeriod": "Previous Period",
"dailyChart": "Daily Renewals",
"renewals": "Renewals"
},
"addons": {
"totalPurchases": "Total Purchases",
"totalGb": "Total Traffic",
"revenue": "Revenue",
"byPackage": "By Package Size",
"dailyChart": "Daily Purchases",
"purchases": "Purchases"
},
"deposits": {
"totalDeposits": "Total Deposits",
"totalAmount": "Total Amount",
"avgDeposit": "Avg Deposit",
"byMethod": "By Payment Method",
"dailyChart": "Daily Deposits",
"revenue": "Revenue"
},
"loadError": "Failed to load statistics"
},
"trafficUsage": {
"title": "Traffic Usage",
@@ -2021,9 +2095,7 @@
"totalSpending": "Subscription Spending",
"periodComparison": "Period comparison",
"vsLastWeek": "vs last week",
"topRegistrations": "Top registrations",
"noRegistrations": "No registrations yet",
"chartLoading": "Loading chart data..."
"topRegistrations": "Top registrations"
},
"users": {
"title": "Campaign Users",

View File

@@ -536,6 +536,8 @@
},
"yourReferrals": "معرفی‌های شما",
"noReferrals": "هنوز معرفی ندارید. لینک را به اشتراک بگذارید!",
"anonymousUser": "کاربر #{{id}}",
"anonymousReferral": "معرفی‌شده",
"user": "کاربر",
"joined": "تاریخ عضویت",
"hasPaid": "پرداخت کرده",
@@ -863,7 +865,8 @@
"roles": "نقش‌ها",
"roleAssign": "تخصیص نقش",
"policies": "سیاست‌های دسترسی",
"auditLog": "گزارش بازرسی"
"auditLog": "گزارش بازرسی",
"salesStats": "آمار فروش"
},
"panel": {
"title": "پنل مدیریت",
@@ -895,7 +898,78 @@
"rolesDesc": "مدیریت نقش‌ها و مجوزهای مدیران",
"roleAssignDesc": "تخصیص و لغو نقش‌های کاربران",
"policiesDesc": "تنظیم سیاست‌های کنترل دسترسی ABAC",
"auditLogDesc": "بررسی فعالیت سیستم و تاریخچه دسترسی"
"auditLogDesc": "بررسی فعالیت سیستم و تاریخچه دسترسی",
"salesStatsDesc": "تحلیل فروش و روندها"
},
"salesStats": {
"title": "آمار فروش",
"subtitle": "درآمد، آزمایشی، اشتراک و تمدید",
"period": {
"week": "۷ روز",
"month": "۳۰ روز",
"quarter": "۹۰ روز",
"all": "همه",
"custom": "سفارشی"
},
"tabs": {
"trials": "آزمایشی",
"sales": "فروش",
"renewals": "تمدید",
"addons": "خدمات اضافی",
"deposits": "شارژ"
},
"summary": {
"revenue": "درآمد",
"activeSubs": "اشتراک فعال",
"activeTrials": "آزمایشی فعال",
"newTrials": "آزمایشی جدید",
"conversion": "تبدیل",
"renewals": "تمدید",
"addonRevenue": "درآمد خدمات اضافی"
},
"trials": {
"total": "کل آزمایشی",
"conversion": "نرخ تبدیل",
"avgDuration": "میانگین مدت",
"byProvider": "بر اساس منبع",
"dailyChart": "ثبت‌نام روزانه",
"registrations": "ثبت‌نام"
},
"sales": {
"totalSales": "کل فروش",
"avgOrder": "میانگین سفارش",
"topTariff": "تعرفه برتر",
"byTariff": "بر اساس تعرفه",
"byPeriod": "بر اساس دوره",
"dailyChart": "فروش روزانه"
},
"renewals": {
"total": "کل تمدیدها",
"rate": "نرخ تمدید",
"revenue": "درآمد",
"comparison": "مقایسه دوره",
"currentPeriod": "دوره فعلی",
"previousPeriod": "دوره قبلی",
"dailyChart": "تمدید روزانه",
"renewals": "تمدید"
},
"addons": {
"totalPurchases": "کل خرید",
"totalGb": "کل ترافیک",
"revenue": "درآمد",
"byPackage": "بر اساس بسته",
"dailyChart": "خرید روزانه",
"purchases": "خرید"
},
"deposits": {
"totalDeposits": "کل شارژ",
"totalAmount": "مبلغ کل",
"avgDeposit": "میانگین شارژ",
"byMethod": "بر اساس روش پرداخت",
"dailyChart": "شارژ روزانه",
"revenue": "درآمد"
},
"loadError": "بارگذاری آمار ناموفق بود"
},
"trafficUsage": {
"title": "مصرف ترافیک",
@@ -1700,9 +1774,7 @@
"totalSpending": "هزینه اشتراک",
"periodComparison": "مقایسه دوره‌ها",
"vsLastWeek": "نسبت به هفته قبل",
"topRegistrations": "بالاترین ثبت‌نام‌ها",
"noRegistrations": "هنوز ثبت‌نامی وجود ندارد",
"chartLoading": "در حال بارگذاری..."
"topRegistrations": "بالاترین ثبت‌نام‌ها"
},
"users": {
"title": "کاربران کمپین",
@@ -1752,7 +1824,8 @@
"approved": "تأیید شده",
"rejected": "رد شده",
"completed": "تکمیل شده",
"cancelled": "لغو شده"
"cancelled": "لغو شده",
"unknown": "ناشناخته"
},
"detail": {
"title": "جزئیات برداشت",

View File

@@ -730,6 +730,8 @@
},
"yourReferrals": "Ваши рефералы",
"noReferrals": "Пока нет рефералов. Поделитесь ссылкой, чтобы пригласить друзей!",
"anonymousUser": "Пользователь #{{id}}",
"anonymousReferral": "Реферал",
"user": "Пользователь",
"joined": "Присоединился",
"hasPaid": "Оплатил",
@@ -1061,7 +1063,8 @@
"roles": "Роли",
"roleAssign": "Назначение ролей",
"policies": "Политики доступа",
"auditLog": "Журнал аудита"
"auditLog": "Журнал аудита",
"salesStats": "Статистика продаж"
},
"panel": {
"title": "Панель администратора",
@@ -1093,7 +1096,78 @@
"rolesDesc": "Управление ролями и правами администраторов",
"roleAssignDesc": "Назначение и отзыв ролей пользователей",
"policiesDesc": "Настройка политик контроля доступа ABAC",
"auditLogDesc": "Просмотр активности системы и истории доступа"
"auditLogDesc": "Просмотр активности системы и истории доступа",
"salesStatsDesc": "Аналитика продаж и тренды"
},
"salesStats": {
"title": "Статистика продаж",
"subtitle": "Доход, триалы, подписки и продления",
"period": {
"week": "7 дней",
"month": "30 дней",
"quarter": "90 дней",
"all": "Всё время",
"custom": "Свой период"
},
"tabs": {
"trials": "Триалы",
"sales": "Продажи",
"renewals": "Продления",
"addons": "Доп. услуги",
"deposits": "Пополнения"
},
"summary": {
"revenue": "Доход",
"activeSubs": "Активные подписки",
"activeTrials": "Активные триалы",
"newTrials": "Новые триалы",
"conversion": "Конверсия",
"renewals": "Продления",
"addonRevenue": "Доп. услуги"
},
"trials": {
"total": "Всего триалов",
"conversion": "Конверсия",
"avgDuration": "Средняя длит.",
"byProvider": "По источнику регистрации",
"dailyChart": "Регистрации по дням",
"registrations": "Регистрации"
},
"sales": {
"totalSales": "Всего продаж",
"avgOrder": "Средний чек",
"topTariff": "Топ тариф",
"byTariff": "Продажи по тарифам",
"byPeriod": "По периоду подписки",
"dailyChart": "Продажи по дням"
},
"renewals": {
"total": "Всего продлений",
"rate": "Доля продлений",
"revenue": "Доход",
"comparison": "Сравнение периодов",
"currentPeriod": "Текущий период",
"previousPeriod": "Предыдущий период",
"dailyChart": "Продления по дням",
"renewals": "Продления"
},
"addons": {
"totalPurchases": "Всего покупок",
"totalGb": "Всего трафика",
"revenue": "Доход",
"byPackage": "По размеру пакета",
"dailyChart": "Покупки по дням",
"purchases": "Покупки"
},
"deposits": {
"totalDeposits": "Всего пополнений",
"totalAmount": "Общая сумма",
"avgDeposit": "Средний чек",
"byMethod": "По способу оплаты",
"dailyChart": "Пополнения по дням",
"revenue": "Доход"
},
"loadError": "Не удалось загрузить статистику"
},
"trafficUsage": {
"title": "Расход трафика",
@@ -2542,9 +2616,7 @@
"totalSpending": "Расход на подписки",
"periodComparison": "Сравнение периодов",
"vsLastWeek": "vs прошлая неделя",
"topRegistrations": "Топ регистрации",
"noRegistrations": "Пока нет регистраций",
"chartLoading": "Загрузка данных..."
"topRegistrations": "Топ регистрации"
},
"users": {
"title": "Пользователи кампании",

View File

@@ -536,6 +536,8 @@
},
"yourReferrals": "您的推荐",
"noReferrals": "暂无推荐。分享链接邀请好友!",
"anonymousUser": "用户 #{{id}}",
"anonymousReferral": "推荐人",
"user": "用户",
"joined": "加入时间",
"hasPaid": "已付款",
@@ -863,7 +865,8 @@
"roles": "角色",
"roleAssign": "角色分配",
"policies": "访问策略",
"auditLog": "审计日志"
"auditLog": "审计日志",
"salesStats": "销售统计"
},
"panel": {
"title": "管理面板",
@@ -895,7 +898,78 @@
"rolesDesc": "管理管理员角色和权限",
"roleAssignDesc": "分配和撤销用户角色",
"policiesDesc": "配置ABAC访问控制策略",
"auditLogDesc": "查看系统活动和访问历史"
"auditLogDesc": "查看系统活动和访问历史",
"salesStatsDesc": "销售分析与趋势"
},
"salesStats": {
"title": "销售统计",
"subtitle": "收入、试用、订阅和续订",
"period": {
"week": "7天",
"month": "30天",
"quarter": "90天",
"all": "全部",
"custom": "自定义"
},
"tabs": {
"trials": "试用",
"sales": "销售",
"renewals": "续订",
"addons": "附加服务",
"deposits": "充值"
},
"summary": {
"revenue": "收入",
"activeSubs": "活跃订阅",
"activeTrials": "活跃试用",
"newTrials": "新试用",
"conversion": "转化率",
"renewals": "续订",
"addonRevenue": "附加服务收入"
},
"trials": {
"total": "试用总数",
"conversion": "转化率",
"avgDuration": "平均时长",
"byProvider": "按注册来源",
"dailyChart": "每日注册",
"registrations": "注册"
},
"sales": {
"totalSales": "总销售",
"avgOrder": "平均订单",
"topTariff": "热门套餐",
"byTariff": "按套餐",
"byPeriod": "按订阅周期",
"dailyChart": "每日销售"
},
"renewals": {
"total": "续订总数",
"rate": "续订率",
"revenue": "收入",
"comparison": "期间对比",
"currentPeriod": "当前期间",
"previousPeriod": "上一期间",
"dailyChart": "每日续订",
"renewals": "续订"
},
"addons": {
"totalPurchases": "购买总数",
"totalGb": "总流量",
"revenue": "收入",
"byPackage": "按套餐大小",
"dailyChart": "每日购买",
"purchases": "购买"
},
"deposits": {
"totalDeposits": "充值总数",
"totalAmount": "总金额",
"avgDeposit": "平均充值",
"byMethod": "按支付方式",
"dailyChart": "每日充值",
"revenue": "收入"
},
"loadError": "加载统计失败"
},
"trafficUsage": {
"title": "流量使用",
@@ -1699,9 +1773,7 @@
"totalSpending": "订阅支出",
"periodComparison": "期间比较",
"vsLastWeek": "与上周对比",
"topRegistrations": "热门注册",
"noRegistrations": "暂无注册",
"chartLoading": "加载图表数据..."
"topRegistrations": "热门注册"
},
"users": {
"title": "活动用户",
@@ -1751,7 +1823,8 @@
"approved": "已批准",
"rejected": "已拒绝",
"completed": "已完成",
"cancelled": "已取消"
"cancelled": "已取消",
"unknown": "未知"
},
"detail": {
"title": "提现详情",