import React, { useState, useEffect, useCallback, useMemo } from "react"; import { Card, CardContent, CardHeader } from "@/components/ui"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui"; import { Button } from "@/components/ui"; import { Loader2, AlertCircle } from "lucide-react"; import type { NamespaceInfo, PodInfo, ServiceInfo, DeploymentInfo, StatefulSetInfo, DaemonSetInfo } from "@/lib/tauriCommands"; import { listNamespacesCmd, listPodsCmd, listServicesCmd, listDeploymentsCmd, listStatefulsetsCmd, listDaemonsetsCmd } from "@/lib/tauriCommands"; import { PodList } from "./PodList"; import { ServiceList } from "./ServiceList"; import { DeploymentList } from "./DeploymentList"; import { StatefulSetList } from "./StatefulSetList"; import { DaemonSetList } from "./DaemonSetList"; type ResourceType = "pods" | "services" | "deployments" | "statefulsets" | "daemonsets"; interface ResourceBrowserProps { clusterId: string; } export function ResourceBrowser({ clusterId }: ResourceBrowserProps) { const [namespaces, setNamespaces] = useState([]); const [selectedNamespace, setSelectedNamespace] = useState("all"); const [resourceType, setResourceType] = useState("pods"); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [pods, setPods] = useState([]); const [services, setServices] = useState([]); const [deployments, setDeployments] = useState([]); const [statefulsets, setStatefulsets] = useState([]); const [daemonsets, setDaemonsets] = useState([]); const loadData = useCallback(async () => { setIsLoading(true); setError(null); try { const [namespacesData, podsData, servicesData, deploymentsData, statefulsetsData, daemonsetsData] = await Promise.all([ listNamespacesCmd(clusterId), selectedNamespace === "all" ? listPodsCmd(clusterId, "") : listPodsCmd(clusterId, selectedNamespace), selectedNamespace === "all" ? listServicesCmd(clusterId, "") : listServicesCmd(clusterId, selectedNamespace), selectedNamespace === "all" ? listDeploymentsCmd(clusterId, "") : listDeploymentsCmd(clusterId, selectedNamespace), selectedNamespace === "all" ? listStatefulsetsCmd(clusterId, "") : listStatefulsetsCmd(clusterId, selectedNamespace), selectedNamespace === "all" ? listDaemonsetsCmd(clusterId, "") : listDaemonsetsCmd(clusterId, selectedNamespace), ]); setNamespaces(namespacesData); setPods(podsData); setServices(servicesData); setDeployments(deploymentsData); setStatefulsets(statefulsetsData); setDaemonsets(daemonsetsData); } catch (err) { console.error("Failed to load resources:", err); setError(err instanceof Error ? err.message : "Failed to load resources"); } finally { setIsLoading(false); } }, [clusterId, selectedNamespace]); useEffect(() => { loadData(); }, [loadData, resourceType]); const namespaceOptions = useMemo(() => { const options = [{ name: "All Namespaces", value: "all" }]; namespaces.forEach(ns => { options.push({ name: ns.name, value: ns.name }); }); return options; }, [namespaces]); if (isLoading) { return (

Loading Kubernetes resources...

); } if (error) { return (

{error}

); } const renderResourceList = () => { switch (resourceType) { case "pods": return ; case "services": return ; case "deployments": return ; case "statefulsets": return ; case "daemonsets": return ; default: return null; } }; return (

Kubernetes Resources

Browse and manage your Kubernetes resources

setResourceType(v as ResourceType)}> Pods Services Deployments StatefulSets DaemonSets
{renderResourceList()}
); }