"use client" import { useState } from "react" import { cn } from "@/lib/utils" import { ClipboardCopyIcon } from "lucide-react" import type { BgpSessionRow } from "@/lib/bgp/types" import { fmtBgpNum, rscBgpSnippet } from "@/lib/bgp/helpers" function CapChip({ cap }: { cap: string }) { return ( {cap} ) } function PrefixBar({ rx, tx, active }: { rx: number; tx: number; active: number }) { const max = Math.max(rx, 1) return (
{[ { label: "Получено", val: rx, color: "bg-[var(--chart-rx)]", w: rx / max }, { label: "Активных", val: active, color: "bg-[var(--chart-1)]", w: active / max }, { label: "Отправлено", val: tx, color: "bg-[var(--chart-tx)]", w: Math.min(tx / max, 1) }, ].map((r) => (
{r.label}
0 ? 2 : 0)}%` }} />
{fmtBgpNum(r.val)}
))}
) } function BgpSessionDetail({ session }: { session: BgpSessionRow }) { const [copied, setCopied] = useState(false) function copy() { navigator.clipboard.writeText(rscBgpSnippet(session)).then(() => { setCopied(true) setTimeout(() => setCopied(false), 1800) }) } return (
{[ { label: "Router ID", value: session.routerId }, { label: "Hold / KA", value: `${session.holdTime}s / ${session.keepalive}s` }, { label: "AFI/SAFI", value: session.afi }, { label: "Сообщения ↓/↑", value: `${fmtBgpNum(session.inputMessages)} / ${fmtBgpNum(session.outputMessages)}`, }, ].map(({ label, value }) => (

{label}

{value}

))}
{session.state === "Established" && (

Префиксы

)} {session.capabilities.length > 0 && (

Capabilities

{session.capabilities.map((c) => ( ))}
)} {session.lastError && (

{session.lastError}

)}

RouterOS Export

            {rscBgpSnippet(session)}
          
) } export { BgpSessionDetail }