"use client"; import { Box } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { Sheet, SheetContent, SheetHeader, SheetTitle } from "@/components/ui/sheet"; import type { K8sNodeMetadata, ProxyMetadata, ServerMetadata, TopologyNodeData, } from "@/lib/topology-types"; import { DetailRow, DetailSection, HealthBadge } from "../topology-primitives"; interface NodeDetailsPanelProps { node: TopologyNodeData | null; open: boolean; onClose: () => void; } export function NodeDetailsPanel({ node, open, onClose }: NodeDetailsPanelProps) { if (!node) return null; return ( {node.label}
{node.type === "server" ? "Minecraft Server" : node.type === "proxy" ? "Reverse Proxy" : "Kubernetes Node"} {node.status}
{node.type === "server" && } {node.type === "proxy" && } {node.type === "k8s-node" && ( )}
); } function ServerDetails({ metadata }: { metadata: ServerMetadata }) { const { server, podCount, readyPods, pods, k8sNodes, connectedProxies } = metadata; return (
{server.description && } {connectedProxies.length > 0 && ( )}
); } function ProxyDetails({ metadata }: { metadata: ProxyMetadata }) { const { proxy, podCount, readyPods, pods, k8sNodes, connectedServers } = metadata; return (
{proxy.description && } {connectedServers.length > 0 && ( )}
); } function K8sNodeDetails({ metadata }: { metadata: K8sNodeMetadata }) { const { node, podCount, serverPods, proxyPods } = metadata; return (
{node.version && } {node.internalIP && } {node.externalIP && } {node.hostname && } {serverPods.length > 0 && (

Server Pods:

)} {proxyPods.length > 0 && (

Proxy Pods:

)}
); } function KubernetesWorkloadDetails({ podCount, readyPods, pods, k8sNodes, }: Pick) { return ( <> {k8sNodes.length > 0 && (
Running on {k8sNodes.length} K8s node(s):
)} {pods.map((pod) => (
{pod.name}
Status: {pod.status} • {pod.ready}
Restarts: {pod.restarts}
{pod.nodeName && (
Node: {pod.nodeName}
)}
))} ); } function IdentifierList({ items, className, withMargin = true, }: { items: string[]; className: string; withMargin?: boolean; }) { return (
{items.map((item) => (
{item}
))}
); }