import React, { useEffect, useState, useCallback } from "react"; import { AlertCircle, RefreshCw, CheckCircle2, XCircle } from "lucide-react"; import { listKubeconfigsCmd, listNodesCmd } from "@/lib/tauriCommands"; import type { KubeconfigInfo, NodeInfo } from "@/lib/tauriCommands"; interface ClusterDetailsProps { clusterId: string; } interface InfoRowProps { label: string; value: React.ReactNode; mono?: boolean; testId?: string; } function InfoRow({ label, value, mono, testId }: InfoRowProps) { return (
{label}

{value}

); } export function ClusterDetails({ clusterId }: ClusterDetailsProps) { const [kubeconfig, setKubeconfig] = useState(null); const [nodes, setNodes] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [notFound, setNotFound] = useState(false); const loadData = useCallback(async () => { setLoading(true); setError(null); setNotFound(false); try { const [kubeconfigs, nodesData] = await Promise.all([ listKubeconfigsCmd(), listNodesCmd(clusterId), ]); const found = kubeconfigs.find((k) => k.id === clusterId) ?? null; if (!found) { setNotFound(true); } else { setKubeconfig(found); setNodes(nodesData); } } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setLoading(false); } }, [clusterId]); useEffect(() => { void loadData(); }, [loadData]); if (loading) { return (
Loading cluster details…
); } if (error) { return (

Failed to load cluster details

{error}

); } if (notFound || !kubeconfig) { return (

Cluster not found

No kubeconfig found for cluster ID: {clusterId}

); } return (

Cluster Details

Cluster ID: {clusterId}

{/* Basic Information */}

Basic Information

Active ) : ( Inactive ) } />
{/* Node table */}

Nodes ({nodes.length})

{nodes.length === 0 ? (
No nodes found for this cluster
) : (
{nodes.map((node) => ( ))}
Name Status Roles Kubelet Version Age
{node.name} {node.status} {node.roles || "—"} {node.kubelet_version} {node.age}
)}
); }