64 lines
3.2 KiB
TypeScript
64 lines
3.2 KiB
TypeScript
// 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 ServerInfo, genLabel } from '../lib/shared';
|
|
import { IcoRefresh } from './icons';
|
|
|
|
// Сервер-бар: карточка активного сервера + (на мобильной) перезапуск AWG под
|
|
// ней. Общий для вкладок — показывает сервер, к которому относится содержимое
|
|
// вкладки (пиры / абоненты).
|
|
export default function ServerBar({
|
|
serverInfo, serverOnline, onRestartAwg, restarting,
|
|
showRestart = true,
|
|
}: {
|
|
serverInfo: ServerInfo | null;
|
|
serverOnline: boolean;
|
|
onRestartAwg: () => void;
|
|
restarting: boolean;
|
|
showRestart?: boolean;
|
|
}) {
|
|
return (
|
|
<div className="server-bar">
|
|
{serverInfo && (
|
|
<div className="server-card server-card--active">
|
|
{/* toggle — виден на мобильном вместо чипа */}
|
|
<div
|
|
className={`server-toggle${serverOnline ? ' server-toggle--on' : ''}`}
|
|
aria-hidden="true"
|
|
>
|
|
<div className="server-toggle-thumb" />
|
|
</div>
|
|
{/* чип онлайн/офлайн — виден на десктопе */}
|
|
<span className={`chip chip--${serverOnline ? 'online' : 'offline'} server-online-chip`}>
|
|
<span className="chip-dot" />
|
|
</span>
|
|
<div className="server-card-info">
|
|
<span className="server-card-name">{serverInfo.name}</span>
|
|
<span className="server-card-ip">{serverInfo.ip}</span>
|
|
{(serverInfo.mod || serverInfo.tools) ? (
|
|
<span
|
|
className="tip-wrap server-gen-wrap"
|
|
data-tip={`модуль ${serverInfo.mod || '?'} · tools ${serverInfo.tools || '?'}`}
|
|
>
|
|
<span className="chip chip--offline server-gen-chip">{genLabel(serverInfo.gen)}</span>
|
|
</span>
|
|
) : (
|
|
<span className="chip chip--offline server-gen-chip">{genLabel(serverInfo.gen)}</span>
|
|
)}
|
|
</div>
|
|
<span className="server-card-peers">{serverInfo.peers} peers</span>
|
|
</div>
|
|
)}
|
|
{/* Перезапуск AWG — только на мобильной (на десктопе кнопка в углу). */}
|
|
{showRestart && (
|
|
<button
|
|
className={`btn btn--tonal awg-restart-mobile${restarting ? ' spinning' : ''}`}
|
|
onClick={onRestartAwg}
|
|
disabled={restarting}
|
|
>
|
|
<IcoRefresh /> {restarting ? 'Перезапуск…' : 'Перезапустить AWG'}
|
|
</button>
|
|
)}
|
|
</div>
|
|
);
|
|
} |