feat: add LIMITED subscription status support with traffic-exhausted UX

- Add is_limited to Subscription type
- Show yellow traffic-exhausted badge on Subscription and AdminUsers pages
- SubscriptionCardExpired: amber theme with warning icon and buy-traffic CTA for limited
- Dashboard: route limited subscriptions to SubscriptionCardExpired
- Subscription page: show additional options (buy traffic) for limited subs
- Use is_limited boolean instead of status string comparison
- Add trafficLimited translations for ru, en, zh, fa
- AdminUserDetail StatusBadge: add limited yellow styling
This commit is contained in:
Fringg
2026-03-12 18:33:37 +03:00
parent d9bfb8427c
commit b4f9f332cf
10 changed files with 281 additions and 126 deletions

View File

@@ -171,6 +171,7 @@
"telegramRetryFailed": "Authorization failed. Close the app and try again.",
"telegramReopenHint": "If the problem persists, close and reopen the app",
"telegramNotConfigured": "Telegram bot is not configured",
"telegramUnavailable": "Telegram login is temporarily unavailable",
"authenticating": "Authenticating...",
"orOpenInApp": "Or open the bot in the app",
"loginFailed": "Login Failed",
@@ -290,6 +291,9 @@
"inactive": "Inactive",
"trialStatus": "Trial",
"expired": "Expired",
"trafficLimited": "Traffic Exhausted",
"trafficLimitedTitle": "Traffic Limit Reached",
"trafficLimitedDescription": "Your traffic has been exhausted. Purchase additional traffic below to continue using VPN.",
"expiresAt": "Expires at",
"daysLeft": "Days left",
"devices": "Devices",

View File

@@ -163,6 +163,7 @@
"telegramRetryFailed": "تایید هویت ناموفق بود. برنامه را ببندید و دوباره باز کنید.",
"telegramReopenHint": "اگر مشکل ادامه دارد، برنامه را ببندید و دوباره باز کنید",
"telegramNotConfigured": "ربات تلگرام پیکربندی نشده",
"telegramUnavailable": "ورود از طریق تلگرام موقتاً در دسترس نیست",
"authenticating": "در حال تایید هویت...",
"orOpenInApp": "یا ربات را در برنامه باز کنید",
"loginFailed": "ورود ناموفق",
@@ -250,6 +251,9 @@
"inactive": "غیرفعال",
"trialStatus": "دوره آزمایشی",
"expired": "منقضی شده",
"trafficLimited": "ترافیک تمام شده",
"trafficLimitedTitle": "محدودیت ترافیک",
"trafficLimitedDescription": "ترافیک شما تمام شده است. برای ادامه استفاده از VPN، ترافیک اضافی خریداری کنید.",
"expiresAt": "تاریخ انقضا",
"daysLeft": "روز باقی‌مانده",
"devices": "دستگاه‌ها",

View File

@@ -174,6 +174,7 @@
"telegramRetryFailed": "Авторизация не удалась. Закройте приложение и откройте заново.",
"telegramReopenHint": "Если проблема повторяется — закройте и откройте приложение заново",
"telegramNotConfigured": "Telegram бот не настроен",
"telegramUnavailable": "Вход через Telegram временно недоступен",
"authenticating": "Авторизация...",
"orOpenInApp": "Или откройте бота в приложении",
"loginFailed": "Ошибка входа",
@@ -302,6 +303,9 @@
"inactive": "Неактивна",
"trialStatus": "Пробный период",
"expired": "Истекла",
"trafficLimited": "Трафик исчерпан",
"trafficLimitedTitle": "Трафик закончился",
"trafficLimitedDescription": "Ваш трафик исчерпан. Докупите дополнительный трафик ниже, чтобы продолжить пользоваться VPN.",
"expiresAt": "Действует до",
"daysLeft": "Осталось дней",
"devices": "Устройства",

View File

@@ -163,6 +163,7 @@
"telegramRetryFailed": "授权失败。请关闭应用后重新打开。",
"telegramReopenHint": "如果问题持续存在,请关闭并重新打开应用",
"telegramNotConfigured": "Telegram机器人未配置",
"telegramUnavailable": "Telegram登录暂时不可用",
"authenticating": "正在验证...",
"orOpenInApp": "或在应用中打开机器人",
"loginFailed": "登录失败",
@@ -250,6 +251,9 @@
"inactive": "无效",
"trialStatus": "试用期",
"expired": "已过期",
"trafficLimited": "流量已用尽",
"trafficLimitedTitle": "流量已达上限",
"trafficLimitedDescription": "您的流量已用尽。请在下方购买额外流量以继续使用VPN。",
"expiresAt": "到期时间",
"daysLeft": "剩余天数",
"devices": "设备",