feat: add multi-channel subscription blocking UI and admin management

- Channel subscription blocking screen with per-channel status display
- Safe URL handling with protocol validation (no open redirect)
- Race-condition-safe subscription check with useRef guard
- Admin channel management page with create, toggle, delete
- Error handlers on all admin mutations with haptic feedback
- Proper type guard for channel subscription error detection
- Accessibility: aria-labels on icon-only buttons
- Localization: en, ru, zh, fa translations
This commit is contained in:
Fringg
2026-02-24 02:50:52 +03:00
parent 8ea9a1d6a0
commit a767fe96d3
12 changed files with 758 additions and 113 deletions

View File

@@ -883,7 +883,8 @@
"updates": "Обновления",
"pinnedMessages": "Закреплённые",
"partners": "Партнёры",
"withdrawals": "Выводы"
"withdrawals": "Выводы",
"channelSubscriptions": "Обязательные каналы"
},
"panel": {
"title": "Панель администратора",
@@ -910,7 +911,8 @@
"updatesDesc": "Версии бота и кабинета",
"pinnedMessagesDesc": "Управление закреплёнными сообщениями",
"partnersDesc": "Управление заявками партнёров и комиссиями",
"withdrawalsDesc": "Проверка и обработка заявок на вывод"
"withdrawalsDesc": "Проверка и обработка заявок на вывод",
"channelSubscriptionsDesc": "Управление обязательными подписками на каналы"
},
"trafficUsage": {
"title": "Расход трафика",
@@ -1323,6 +1325,28 @@
"editMessage": "Редактировать",
"cantDeleteActive": "Нельзя удалить активное сообщение"
},
"channelSubscriptions": {
"title": "Обязательные каналы",
"subtitle": "Пользователи должны подписаться на эти каналы",
"addChannel": "Добавить канал",
"empty": "Каналы не настроены",
"enabled": "Активен",
"disabled": "Отключён",
"enable": "Включить",
"disable": "Отключить",
"delete": "Удалить",
"deleteConfirm": "Удалить этот канал?",
"sortOrder": "Порядок",
"form": {
"title": "Название",
"channelId": "ID канала",
"channelIdHint": "@username или -100XXXXXXXXXX",
"channelLink": "Ссылка на канал",
"channelLinkHint": "https://t.me/channel",
"submit": "Добавить",
"cancel": "Отмена"
}
},
"settings": {
"title": "Настройки системы",
"allCategories": "Все категории",
@@ -3699,7 +3723,9 @@
"waitSeconds": "Подождите {{seconds}} сек.",
"hint": "После подписки нажмите кнопку проверки",
"notSubscribed": "Вы ещё не подписались на канал",
"checkError": "Ошибка проверки. Попробуйте позже."
"checkError": "Ошибка проверки. Попробуйте позже.",
"subscribed": "Подписан",
"channelsRequired": "Подпишитесь на все каналы ниже для продолжения"
},
"blacklisted": {
"title": "Доступ запрещён",