feat(admin): панельная идентичность под Remnawave 3.0.0

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.
This commit is contained in:
Fringg
2026-08-02 19:38:11 +03:00
parent 653d683835
commit e840ed2b60
3 changed files with 10 additions and 10 deletions

View File

@@ -151,16 +151,16 @@ export function SyncTab({
</div>
)}
{/* UUID info */}
{/* Panel identity */}
<div className="rounded-xl bg-dark-800/50 p-4">
{syncStatus?.subscription_tariff_name && (
<div className="mb-2 text-xs text-dark-500">{syncStatus.subscription_tariff_name}</div>
)}
<div className="mb-1 text-sm text-dark-400">Remnawave UUID</div>
<div className="mb-1 text-sm text-dark-400">Remnawave ID</div>
<div className="break-all font-mono text-sm text-dark-100">
{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')}
</div>
</div>