feat: add subscription reissue button with cooldown timer

- Add revokeSubscription API method
- Add reissue button in Additional Options with amber styling,
  destructive confirm dialog, 15-min cooldown with countdown timer,
  localStorage persistence across page reloads
- Add i18n keys in all 4 locales (en, ru, zh, fa)
This commit is contained in:
Fringg
2026-05-04 17:22:05 +03:00
parent 7d940091fa
commit f7cc445127
6 changed files with 138 additions and 0 deletions

View File

@@ -571,6 +571,14 @@
"selectServersHint": "Select servers to connect or disconnect",
"noServersAvailable": "No servers available to manage"
},
"revoke": {
"title": "Reissue Subscription",
"button": "Reissue Subscription",
"description": "New link, device reset",
"warning": "This will generate a new connection link, reset all connected devices, and invalidate the old link. Continue?",
"confirmBtn": "Reissue",
"cooldown": "Available in {{minutes}} min {{seconds}} sec"
},
"legacy": {
"selectTariffTitle": "Select a tariff to renew",
"selectTariffDescription": "Your current subscription was created before tariffs were introduced. To renew, please select one of the available tariffs.",

View File

@@ -402,6 +402,14 @@
"selectServersHint": "سرورها را برای اتصال یا قطع انتخاب کنید",
"noServersAvailable": "سرور قابل مدیریتی وجود ندارد"
},
"revoke": {
"title": "صدور مجدد اشتراک",
"button": "صدور مجدد اشتراک",
"description": "لینک جدید، بازنشانی دستگاه‌ها",
"warning": "این عمل لینک اتصال جدیدی تولید می‌کند، همه دستگاه‌های متصل را بازنشانی می‌کند و لینک قدیمی را نامعتبر می‌کند. ادامه؟",
"confirmBtn": "صدور مجدد",
"cooldown": "در {{minutes}} دقیقه {{seconds}} ثانیه دیگر"
},
"legacy": {
"selectTariffTitle": "یک تعرفه برای تمدید انتخاب کنید",
"selectTariffDescription": "اشتراک فعلی شما قبل از معرفی تعرفه‌ها ایجاد شده بود. برای تمدید، لطفاً یکی از تعرفه‌های موجود را انتخاب کنید.",

View File

@@ -599,6 +599,14 @@
"selectServersHint": "Выберите серверы для подключения или отключения",
"noServersAvailable": "Нет доступных серверов для управления"
},
"revoke": {
"title": "Перевыпуск подписки",
"button": "Перевыпустить подписку",
"description": "Новая ссылка, сброс устройств",
"warning": "Это действие сгенерирует новую ссылку подключения, сбросит все подключённые устройства и сделает старую ссылку недействительной. Продолжить?",
"confirmBtn": "Перевыпустить",
"cooldown": "Доступно через {{minutes}} мин. {{seconds}} сек."
},
"legacy": {
"selectTariffTitle": "Выберите тариф для продления",
"selectTariffDescription": "Ваша текущая подписка была создана до введения тарифов. Для продления необходимо выбрать один из доступных тарифов.",

View File

@@ -402,6 +402,14 @@
"selectServersHint": "选择要连接或断开的服务器",
"noServersAvailable": "没有可管理的服务器"
},
"revoke": {
"title": "重新签发订阅",
"button": "重新签发订阅",
"description": "新链接,设备重置",
"warning": "此操作将生成新的连接链接,重置所有已连接设备,并使旧链接失效。继续?",
"confirmBtn": "重新签发",
"cooldown": "{{minutes}}分{{seconds}}秒后可用"
},
"legacy": {
"selectTariffTitle": "选择续费套餐",
"selectTariffDescription": "您的当前订阅是在引入套餐之前创建的。要续费,请选择一个可用的套餐。",