"use client" import type { IpsecCertInfoDto, IpsecPeerDto, IpsecServerSummaryDto } from "@mmapp/contracts/ipsec" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { cn } from "@/lib/utils" import { GlobeIcon, KeyRoundIcon, NetworkIcon, PencilIcon, ShieldCheckIcon, Trash2Icon, } from "lucide-react" function Row({ label, value, mono = true }: { label: string; value: string; mono?: boolean }) { return (
{label} {value || "—"}
) } function OriginBadge({ managed }: { managed: boolean }) { return managed ? null : ( RouterOS ) } function PeerRow({ peer, onEdit, onDelete, }: { peer: IpsecPeerDto onEdit?: (peer: IpsecPeerDto) => void onDelete?: (peer: IpsecPeerDto) => void }) { const summary = [ peer.exchangeMode, peer.address, peer.passive ? "passive" : undefined, peer.certificate, peer.profile, ].filter(Boolean).join(" · ") return (
{peer.name} {peer.disabled ? выкл : null}

{summary || "—"}

{onEdit ? ( ) : null} {onDelete ? ( ) : null}
) } function CertRow({ cert, onDelete, }: { cert: IpsecCertInfoDto onDelete?: (cert: IpsecCertInfoDto) => void }) { const roleLabel = cert.role === "ca" ? "CA" : cert.role === "server" ? "сервер" : cert.role === "client" ? "клиент" : "прочий" return (
{cert.name} {roleLabel} {cert.trusted === false ? не trusted : null}

{[cert.commonName, cert.expiresAt ? `до ${cert.expiresAt}` : undefined].filter(Boolean).join(" · ") || "—"}

{onDelete ? ( ) : null}
) } export interface IpsecServerGridProps { servers: IpsecServerSummaryDto[] onInit?: (row: IpsecServerSummaryDto) => void onRemove?: (row: IpsecServerSummaryDto) => void onEditPeer?: (serverId: string, peer: IpsecPeerDto) => void onDeletePeer?: (serverId: string, peer: IpsecPeerDto) => void onDeleteCert?: (serverId: string, cert: IpsecCertInfoDto) => void } function IpsecServerGrid({ servers, onInit, onRemove, onEditPeer, onDeletePeer, onDeleteCert, }: IpsecServerGridProps) { return (
{servers.map((s) => { const certs = s.certs ?? [] return (

{s.serverName}

{s.serverEndpoint ?? "endpoint не определён"}

{s.peers.length > 0 ? ( {s.peers.length} peer ) : ( нет peer )}

Peer / серверы

{s.peers.length > 0 ? (
{s.peers.map((p) => ( onEditPeer(s.serverId, peer) : undefined} onDelete={onDeletePeer ? (peer) => onDeletePeer(s.serverId, peer) : undefined} /> ))}
) : (

Peers не найдены

)}

Сертификаты

{certs.length > 0 ? (
{certs.map((c) => ( onDeleteCert(s.serverId, cert) : undefined} /> ))}
) : (

Сертификаты не найдены

)}
{s.initialized && onRemove ? ( ) : null}
) })} {servers.length === 0 ? (
Серверы не найдены
) : null}
) } export { IpsecServerGrid }