From a3a6fad9b76f9908b8240a05629d9d7eac1af98f Mon Sep 17 00:00:00 2001 From: Fringg Date: Wed, 18 Mar 2026 22:40:11 +0300 Subject: [PATCH 1/4] feat: display manual admin top-ups in sales statistics --- src/api/adminSalesStats.ts | 1 + src/constants/paymentMethods.ts | 1 + src/locales/en.json | 3 ++- src/locales/fa.json | 3 ++- src/locales/ru.json | 3 ++- src/locales/zh.json | 3 ++- src/pages/AdminSalesStats.tsx | 11 ++++++++++- 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/api/adminSalesStats.ts b/src/api/adminSalesStats.ts index 1adb5c3..7b5f261 100644 --- a/src/api/adminSalesStats.ts +++ b/src/api/adminSalesStats.ts @@ -12,6 +12,7 @@ export interface SalesStatsParams { export interface SalesSummary { total_revenue_kopeks: number; + manual_topup_kopeks: number; active_subscriptions: number; active_trials: number; new_trials: number; diff --git a/src/constants/paymentMethods.ts b/src/constants/paymentMethods.ts index 1589a81..22b2438 100644 --- a/src/constants/paymentMethods.ts +++ b/src/constants/paymentMethods.ts @@ -15,4 +15,5 @@ export const METHOD_LABELS: Record = { kassa_ai: 'Kassa AI', riopay: 'RioPay', severpay: 'SeverPay', + manual: 'Ручное пополнение', }; diff --git a/src/locales/en.json b/src/locales/en.json index 2e70d06..39a5bb3 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1166,7 +1166,8 @@ "newTrials": "New Trials", "conversion": "Conversion", "renewals": "Renewals", - "addonRevenue": "Add-on Revenue" + "addonRevenue": "Add-on Revenue", + "manualTopup": "Manual Top-ups" }, "trials": { "total": "Total Trials", diff --git a/src/locales/fa.json b/src/locales/fa.json index b416e8d..2a24e5a 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -1000,7 +1000,8 @@ "newTrials": "آزمایشی جدید", "conversion": "تبدیل", "renewals": "تمدید", - "addonRevenue": "درآمد خدمات اضافی" + "addonRevenue": "درآمد خدمات اضافی", + "manualTopup": "شارژ دستی" }, "trials": { "total": "کل آزمایشی", diff --git a/src/locales/ru.json b/src/locales/ru.json index e1d74f3..31017be 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1187,7 +1187,8 @@ "newTrials": "Новые триалы", "conversion": "Конверсия", "renewals": "Продления", - "addonRevenue": "Доп. услуги" + "addonRevenue": "Доп. услуги", + "manualTopup": "Ручные пополнения" }, "trials": { "total": "Всего триалов", diff --git a/src/locales/zh.json b/src/locales/zh.json index 0e5231b..d2fea20 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -1000,7 +1000,8 @@ "newTrials": "新试用", "conversion": "转化率", "renewals": "续订", - "addonRevenue": "附加服务收入" + "addonRevenue": "附加服务收入", + "manualTopup": "手动充值" }, "trials": { "total": "试用总数", diff --git a/src/pages/AdminSalesStats.tsx b/src/pages/AdminSalesStats.tsx index bf71998..ce9976d 100644 --- a/src/pages/AdminSalesStats.tsx +++ b/src/pages/AdminSalesStats.tsx @@ -82,7 +82,7 @@ export default function AdminSalesStats() { {t('admin.salesStats.loadError')} )} -
+
+
{/* Tabs */} From c579abe6a35cf86a7e001567eb1328b768b71772 Mon Sep 17 00:00:00 2001 From: Fringg Date: Wed, 18 Mar 2026 22:49:24 +0300 Subject: [PATCH 2/4] feat: display user promo group badge on dashboard --- src/pages/Dashboard.tsx | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index d98767f..30c81a8 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -15,6 +15,7 @@ import SubscriptionCardExpired from '../components/dashboard/SubscriptionCardExp import TrialOfferCard from '../components/dashboard/TrialOfferCard'; import StatsGrid from '../components/dashboard/StatsGrid'; import { giftApi } from '../api/gift'; +import { promoApi } from '../api/promo'; import PendingGiftCard from '../components/dashboard/PendingGiftCard'; import { API } from '../config/constants'; @@ -89,6 +90,13 @@ export default function Dashboard() { retry: false, }); + const { data: promoGroupData } = useQuery({ + queryKey: ['promo-group-discounts'], + queryFn: promoApi.getGroupDiscounts, + staleTime: 60_000, + retry: false, + }); + const activateTrialMutation = useMutation({ mutationFn: subscriptionApi.activateTrial, onSuccess: () => { @@ -227,7 +235,30 @@ export default function Dashboard() {

{t('dashboard.welcome', { name: user?.first_name || user?.username || '' })}

-

{t('dashboard.yourSubscription')}

+
+

{t('dashboard.yourSubscription')}

+ {promoGroupData?.group_name && ( + + + {promoGroupData.group_name} + + )} +
{/* Pending Gift Activations */} From 4a33a61641ac6bf325988a5d60a2d07cd15c2a71 Mon Sep 17 00:00:00 2001 From: Fringg Date: Wed, 18 Mar 2026 22:52:32 +0300 Subject: [PATCH 3/4] fix: handle long promo group names with truncation and flex-wrap --- src/pages/Dashboard.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index 30c81a8..e76c070 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -235,11 +235,11 @@ export default function Dashboard() {

{t('dashboard.welcome', { name: user?.first_name || user?.username || '' })}

-
+

{t('dashboard.yourSubscription')}

{promoGroupData?.group_name && ( - {promoGroupData.group_name} + {promoGroupData.group_name} )}
From aa8fbd1e23c9ee503b871d0de945eee5d4af4d2c Mon Sep 17 00:00:00 2001 From: Fringg Date: Wed, 18 Mar 2026 23:30:18 +0300 Subject: [PATCH 4/4] feat: clickable user link to user card in admin payments --- src/pages/AdminPayments.tsx | 54 ++++++++++++++++++++++++++++++------- src/types/index.ts | 1 + 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/pages/AdminPayments.tsx b/src/pages/AdminPayments.tsx index eea7686..174435d 100644 --- a/src/pages/AdminPayments.tsx +++ b/src/pages/AdminPayments.tsx @@ -478,17 +478,53 @@ export default function AdminPayments() {
{/* User info */} - {(payment.user_username || payment.user_telegram_id) && ( + {(payment.user_username || + payment.user_telegram_id || + payment.user_email) && (
{t('admin.payments.user')}:{' '} - {payment.user_username && ( - @{payment.user_username} - )} - {payment.user_username && payment.user_telegram_id && ( - · - )} - {payment.user_telegram_id && ( - TG: {payment.user_telegram_id} + {payment.user_id ? ( + + ) : ( + <> + {payment.user_username && ( + @{payment.user_username} + )} + {payment.user_username && + (payment.user_telegram_id || payment.user_email) && ( + · + )} + {payment.user_telegram_id && ( + + TG: {payment.user_telegram_id} + + )} + {!payment.user_telegram_id && payment.user_email && ( + {payment.user_email} + )} + )}
)} diff --git a/src/types/index.ts b/src/types/index.ts index 5c8d509..ad61a5e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -567,6 +567,7 @@ export interface PendingPayment { user_id?: number; user_telegram_id?: number; user_username?: string | null; + user_email?: string | null; } export interface ManualCheckResponse {