// Copyright (c) 2026 Ivan Vasilev // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. import { type NodeInfo, genLabel, cmpVersion, MIN_NODE_VERSION } from '../lib/shared'; import { IcoRefresh, IcoPlus, IcoTrash, IcoCopy, IcoSettings } from './icons'; // Сервер-бар: карточки серверов (core-локальный и ноды) + «Добавить сервер» и // (на мобильной) перезапуск AWG под ними. Общий для вкладок — показывает // серверы, между которыми переключается содержимое вкладки (пиры / абоненты). // Версия Forgetting на сервере, три состояния: совпадает с панелью — нейтральный чип; нода отстаёт // от панели (но не старше MIN_NODE_VERSION) или новее неё — жёлтый, стоит обновить; старше // MIN_NODE_VERSION или не сообщает версию (агент старше 0.3.4) — красный: хаб такую ноду не подключает. function versionChip(n: NodeInfo, panel: string | null) { if (n.pending) return null; let tip = '', level: '' | 'warn' | 'bad' = ''; if (!n.version) { level = 'bad'; tip = `Версия неизвестна: нода старше 0.3.4, панель с ней не работает — обнови её до ${MIN_NODE_VERSION} (install.sh → «Обновить»)`; } else if (!n.local && cmpVersion(n.version, MIN_NODE_VERSION) < 0) { level = 'bad'; tip = `Слишком старая версия: панель с ней не работает, нужна не ниже ${MIN_NODE_VERSION} — обнови ноду (install.sh → «Обновить»)`; } else if (panel && !n.local) { const d = cmpVersion(n.version, panel); if (d < 0) { level = 'warn'; tip = `Устарела: панель на ${panel} — обнови ноду (install.sh → «Обновить»)`; } else if (d > 0) { level = 'warn'; tip = `Нода новее панели (${panel}) — обнови панель`; } } const chip = ( {n.version ? `v${n.version}` : 'v?.?.?'} ); return tip ? {chip} : chip; } export default function ServerBar({ nodes, serverId, hubEnabled, panelVersion, onSelect, onAdd, onJoin, onDelete, onSettings, onRestartAwg, restarting, showRestart = true, }: { nodes: NodeInfo[]; panelVersion: string | null; serverId: number | null; hubEnabled: boolean; onSelect: (id: number) => void; onAdd: () => void; onJoin: (n: NodeInfo) => void; onDelete: (n: NodeInfo) => void; onSettings: (n: NodeInfo) => void; onRestartAwg: () => void; restarting: boolean; showRestart?: boolean; }) { return (