"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 && (
)}
{proxyPods.length > 0 && (
)}
);
}
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}
))}
);
}