-
{t('subscription.traffic', 'Трафик')}
-
- {formatTrafficDisplay(subscription.traffic_used_gb, subscription.traffic_limit_gb)}
+ {/* Traffic mini progress bar */}
+ {isActive && (
+
+
+
+ {t('subscription.traffic', 'Трафик')}
+
+
+ {isUnlimited
+ ? '∞'
+ : `${trafficUsed.toFixed(1)} / ${trafficLimit} ${t('common.units.gb', 'ГБ')}`}
+
-
-
-
{t('subscription.devices', 'Устройства')}
-
{subscription.device_limit}
-
-
-
{t('subscription.until', 'До')}
-
{formatDate(subscription.end_date)}
-
-
-
- {subscription.is_trial && (
-
-
- {t('subscription.trial', 'Тестовая')}
-
+ {!isUnlimited && (
+
+ )}
)}
+
+ {/* Stats row */}
+
+
+
+ {subscription.device_limit}
+
+
+
+ {formatDate(subscription.end_date, i18n.language)}
+
+ {subscription.autopay_enabled && (
+
+
+ {t('subscription.autopay', 'Автопродление')}
+
+ )}
+
);
}
diff --git a/src/pages/Subscription.tsx b/src/pages/Subscription.tsx
index 4347dae..d177749 100644
--- a/src/pages/Subscription.tsx
+++ b/src/pages/Subscription.tsx
@@ -265,6 +265,7 @@ export default function Subscription() {
mutationFn: () => subscriptionApi.togglePause(subscriptionId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['subscription', subscriptionId] });
+ queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
queryClient.invalidateQueries({ queryKey: ['balance'] });
},
});
@@ -290,6 +291,7 @@ export default function Subscription() {
mutationFn: () => subscriptionApi.purchaseDevices(devicesToAdd, subscriptionId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['subscription', subscriptionId] });
+ queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
queryClient.invalidateQueries({ queryKey: ['devices', subscriptionId] });
queryClient.invalidateQueries({ queryKey: ['device-price'] });
setShowDeviceTopup(false);
@@ -321,6 +323,7 @@ export default function Subscription() {
mutationFn: () => subscriptionApi.reduceDevices(targetDeviceLimit, subscriptionId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['subscription', subscriptionId] });
+ queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
queryClient.invalidateQueries({ queryKey: ['devices', subscriptionId] });
queryClient.invalidateQueries({ queryKey: ['device-reduction-info', subscriptionId] });
setShowDeviceReduction(false);
@@ -339,6 +342,7 @@ export default function Subscription() {
mutationFn: (gb: number) => subscriptionApi.purchaseTraffic(gb, subscriptionId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['subscription', subscriptionId] });
+ queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
setShowTrafficTopup(false);
setSelectedTrafficPackage(null);
},
@@ -364,6 +368,7 @@ export default function Subscription() {
mutationFn: (countries: string[]) => subscriptionApi.updateCountries(countries, subscriptionId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['subscription', subscriptionId] });
+ queryClient.invalidateQueries({ queryKey: ['subscriptions-list'] });
queryClient.invalidateQueries({ queryKey: ['countries', subscriptionId] });
setShowServerManagement(false);
},
diff --git a/src/pages/Subscriptions.tsx b/src/pages/Subscriptions.tsx
index 228766e..c328125 100644
--- a/src/pages/Subscriptions.tsx
+++ b/src/pages/Subscriptions.tsx
@@ -2,20 +2,47 @@ import { useQuery } from '@tanstack/react-query';
import { useNavigate } from 'react-router';
import { useTranslation } from 'react-i18next';
import { subscriptionApi } from '../api/subscription';
+import { useTheme } from '../hooks/useTheme';
+import { getGlassColors } from '../utils/glassTheme';
import SubscriptionListCard from '../components/subscription/SubscriptionListCard';
function EmptyState({ onBuy }: { onBuy: () => void }) {
const { t } = useTranslation();
+ const { isDark } = useTheme();
+ const g = getGlassColors(isDark);
+
return (
-
-
📋
-
{t('subscriptions.empty', 'Нет подписок')}
-
+
+
+
+ {t('subscriptions.empty', 'Нет подписок')}
+
+
{t('subscriptions.emptyDesc', 'У вас пока нет активных подписок')}
@@ -26,6 +53,8 @@ function EmptyState({ onBuy }: { onBuy: () => void }) {
export default function Subscriptions() {
const { t } = useTranslation();
const navigate = useNavigate();
+ const { isDark } = useTheme();
+ const g = getGlassColors(isDark);
const { data, isLoading } = useQuery({
queryKey: ['subscriptions-list'],
@@ -45,12 +74,18 @@ export default function Subscriptions() {
return (
-
{t('subscriptions.title', 'Мои подписки')}
+
+ {t('subscriptions.title', 'Мои подписки')}
+
{isLoading && (
{[1, 2].map((i) => (
-
+
))}
)}
@@ -70,9 +105,18 @@ export default function Subscriptions() {
{!isLoading && subscriptions.length > 0 && (
)}