From e840ed2b60f5e525cb290ce5bddc70ef6dfe8a66 Mon Sep 17 00:00:00 2001 From: Fringg Date: Sun, 2 Aug 2026 19:38:11 +0300 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B0=D1=8F=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=20Rem?= =?UTF-8?q?nawave=203.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remnawave 3.0.0 удалил `uuid` из модели пользователя — панельный аккаунт адресуется числовым `id`, и бот переименовал соответствующие поля своего API. Без этих правок вкладка Sync показывала бы «не привязан» у ВСЕХ пользователей: оба операнда стали бы undefined, причём без ошибки TS — интерфейсы продолжали бы декларировать несуществующие поля. Типы: `UserDetailResponse.remnawave_uuid` → `remnawave_id: number | null`, `PanelSyncStatusResponse.remnawave_uuid` → `remnawave_id`, `SyncToPanelResponse.panel_uuid` → `panel_user_id`, `PanelUserInfo.uuid` → `id: number` (бэкенд отдаёт его обязательным). В SyncTab используется `??`, а не `||`: идентификатор числовой, и `0` нужно отличать от отсутствия значения. Ярлык — «Remnawave ID». Локаль: ключ настройки бота переименован в TRAFFIC_EXCLUDED_USER_IDS, подпись обновлена — значения теперь числовые id, а не UUID. --- src/api/adminUsers.ts | 8 ++++---- src/components/admin/userDetail/SyncTab.tsx | 10 +++++----- src/locales/ru.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/api/adminUsers.ts b/src/api/adminUsers.ts index ef47cda..abd4863 100644 --- a/src/api/adminUsers.ts +++ b/src/api/adminUsers.ts @@ -142,7 +142,7 @@ export interface UserDetailResponse { promo_offer_discount_source: string | null; promo_offer_discount_expires_at: string | null; recent_transactions: UserTransactionItem[]; - remnawave_uuid: string | null; + remnawave_id: number | null; } export interface UserPanelInfo { @@ -271,7 +271,7 @@ export interface UserAvailableTariffsResponse { // Sync types export interface PanelUserInfo { - uuid: string | null; + id: number; short_uuid: string | null; username: string | null; status: string | null; @@ -295,7 +295,7 @@ export interface SyncToPanelResponse { success: boolean; message: string; action: string; - panel_uuid: string | null; + panel_user_id: number | null; changes: Record; errors: string[]; } @@ -303,7 +303,7 @@ export interface SyncToPanelResponse { export interface PanelSyncStatusResponse { user_id: number; telegram_id: number; - remnawave_uuid: string | null; + remnawave_id: number | null; subscription_id: number | null; subscription_tariff_name: string | null; last_sync: string | null; diff --git a/src/components/admin/userDetail/SyncTab.tsx b/src/components/admin/userDetail/SyncTab.tsx index d88565d..f508926 100644 --- a/src/components/admin/userDetail/SyncTab.tsx +++ b/src/components/admin/userDetail/SyncTab.tsx @@ -151,16 +151,16 @@ export function SyncTab({ )} - {/* UUID info */} + {/* Panel identity */}
{syncStatus?.subscription_tariff_name && (
{syncStatus.subscription_tariff_name}
)} -
Remnawave UUID
+
Remnawave ID
- {syncStatus?.remnawave_uuid || - user.remnawave_uuid || - t('admin.users.detail.sync.notLinked')} + {/* Remnawave 3.0.0 identifies a panel user by a numeric id, so 0 is not + a valid id but ?? would still render it — check for null explicitly. */} + {syncStatus?.remnawave_id ?? user.remnawave_id ?? t('admin.users.detail.sync.notLinked')}
diff --git a/src/locales/ru.json b/src/locales/ru.json index 0e1e6a1..080e88f 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -2580,7 +2580,7 @@ "Traffic Daily Check Enabled": "Ежедневная проверка", "Traffic Daily Check Time": "Время проверки", "Traffic Daily Threshold Gb": "Порог в день (ГБ)", - "Traffic Excluded User Uuids": "Исключённые UUID", + "Traffic Excluded User Ids": "Исключённые ID пользователей панели", "Traffic Fast Check Enabled": "Быстрая проверка", "Traffic Fast Check Interval Minutes": "Интервал (мин)", "Traffic Fast Check Threshold Gb": "Порог (ГБ)",