"use client" import { useState } from "react" import type { WireGuardPeer } from "@/lib/data" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { ArrowDownIcon, ArrowUpIcon, CodeXmlIcon, KeyRoundIcon, Trash2Icon, } from "lucide-react" function fmtBytes(n: number | undefined): string { if (n === undefined || !Number.isFinite(n) || n < 0) return "—" if (n >= 1_000_000_000) return `${(n / 1_000_000_000).toFixed(1)} ГБ` if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)} МБ` if (n >= 1_000) return `${(n / 1_000).toFixed(0)} КБ` return `${n} Б` } function truncKey(key: string): string { if (key.length <= 20) return key return `${key.slice(0, 8)}…${key.slice(-8)}` } function peerKey(peer: WireGuardPeer, index: number): string { return peer.id ?? peer.rosId ?? peer.publicKey ?? String(index) } function WireGuardPeersDetail({ peers, interfaceName, onDeletePeer, onExportPeer, }: { peers: WireGuardPeer[] interfaceName: string onDeletePeer?: (peerId: string) => void onExportPeer?: (peerId: string) => void }) { const [page, setPage] = useState(0) const lastPage = Math.max(0, Math.ceil(peers.length / 50) - 1) const currentPage = Math.min(page, lastPage) const offset = currentPage * 50 if (page > lastPage) setPage(lastPage) if (peers.length === 0) { return (
Нет пиров
) } return (

Пиры {offset + 1}–{Math.min(offset + 50, peers.length)} из {peers.length}

{peers.length > 50 &&
}
{peers.slice(offset, offset + 50).map((peer, index) => { const id = peerKey(peer, offset + index) return (
{peer.name || truncKey(peer.publicKey)}
Allowed IPs: {peer.allowedIps.join(", ")}
Последнее рукопожатие: {peer.latestHandshake?.trim() || "Нет данных"}
Endpoint: {peer.endpoint ?? "—"}
{onExportPeer && ( )} {onDeletePeer && ( )}
) })}
) } export { WireGuardPeersDetail, fmtBytes, truncKey }