import type { NodeProps } from "@xyflow/react";
import { Box, Cpu, HardDrive, Server } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { cn } from "@/lib/cn";
import type { ServerMetadata, TopologyNodeData } from "@/lib/topology-types";
import { CompactRow, CopyableCode, MetricRow, TopologyNodeCard } from "../topology-primitives";
export function ServerNode({ data, selected }: NodeProps) {
const nodeData = data as TopologyNodeData;
const metadata = nodeData.metadata as ServerMetadata;
const { server, readyPods, podCount, health } = metadata;
const { k8sNodes, connectedProxies, connectionInfo, metrics, pods } = metadata;
const restartCount = pods.reduce((sum, pod) => sum + (pod.restarts || 0), 0);
return (
}
iconClassName="bg-primary/10"
title={server.id}
description={server.description}
health={health}
>
{server.jar_type}
MC {server.minecraft_version}
{server.type}
{connectionInfo && (
{connectionInfo.type}
)}
{readyPods}/{podCount}
}
usage={metrics?.memoryUsage}
limit={`${server.memory_request}/${server.memory}MB`}
/>
}
usage={metrics?.cpuUsage}
limit={`${server.cpu_request || "N/A"}/${server.cpu_limit || "N/A"}`}
/>
{connectionInfo?.connectionString && (
{connectionInfo.note && (
{connectionInfo.note}
)}
)}
{pods.length > 0 && (
0 ? "text-warning" : "text-success"}
>
{restartCount}
{pods[0]?.age && {pods[0].age}}
{pods[0]?.ip && (
{pods[0].ip}
)}
)}
{(k8sNodes.length > 0 || connectedProxies.length > 0) && (
{connectedProxies.length > 0 && (
{connectedProxies.length} proxies
)}
{k8sNodes.length > 0 && (
}>
{k8sNodes[0]}
)}
)}
);
}