"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 }