import React, { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui"; import { Badge } from "@/components/ui"; import { FileText, Terminal, Link, Pencil, Trash2, Zap } from "lucide-react"; import type { PodInfo } from "@/lib/tauriCommands"; import { deleteResourceCmd, forceDeleteResourceCmd, getResourceYamlCmd } from "@/lib/tauriCommands"; import { ResourceActionMenu } from "./ResourceActionMenu"; import { ConfirmDeleteDialog } from "./ConfirmDeleteDialog"; import { LogsModal } from "./LogsModal"; import { ShellExecModal } from "./ShellExecModal"; import { AttachModal } from "./AttachModal"; import { EditResourceModal } from "./EditResourceModal"; interface PodListProps { pods: PodInfo[]; clusterId: string; namespace: string; onRefresh?: () => void; } type ActiveModal = | { type: "logs"; pod: PodInfo } | { type: "shell"; pod: PodInfo } | { type: "attach"; pod: PodInfo } | { type: "edit"; pod: PodInfo; yaml: string } | { type: "delete"; pod: PodInfo } | { type: "force-delete"; pod: PodInfo } | null; export function PodList({ pods, clusterId, namespace, onRefresh }: PodListProps) { const [activeModal, setActiveModal] = useState(null); const [isDeleting, setIsDeleting] = useState(false); const [editError, setEditError] = useState(null); const getPodStatusColor = (status: string) => { switch (status.toLowerCase()) { case "running": return "bg-green-500"; case "pending": return "bg-yellow-500"; case "succeeded": case "completed": return "bg-blue-500"; case "failed": case "error": return "bg-red-500"; default: return "bg-gray-500"; } }; const openEdit = async (pod: PodInfo) => { setEditError(null); try { const yaml = await getResourceYamlCmd(clusterId, "pods", namespace, pod.name); setActiveModal({ type: "edit", pod, yaml }); } catch (err) { setEditError(err instanceof Error ? err.message : String(err)); } }; const handleDelete = async (force: boolean) => { const modal = activeModal; if (!modal || (modal.type !== "delete" && modal.type !== "force-delete")) return; setIsDeleting(true); try { if (force) { await forceDeleteResourceCmd(clusterId, "pods", namespace, modal.pod.name); } else { await deleteResourceCmd(clusterId, "pods", namespace, modal.pod.name); } setActiveModal(null); onRefresh?.(); } finally { setIsDeleting(false); } }; const currentPod = activeModal && activeModal.type !== "edit" ? activeModal.pod : null; return ( <> {editError && (

{editError}

)}
Name Status Ready Age Actions {pods.length === 0 ? ( No pods found ) : ( pods.map((pod) => ( {pod.name} {pod.status} {pod.ready} {pod.age} setActiveModal({ type: "logs", pod }), }, { label: "Shell", icon: Terminal, onClick: () => setActiveModal({ type: "shell", pod }), }, { label: "Attach", icon: Link, onClick: () => setActiveModal({ type: "attach", pod }), }, { label: "Edit", icon: Pencil, onClick: () => openEdit(pod), }, { label: "Delete", icon: Trash2, variant: "destructive", onClick: () => setActiveModal({ type: "delete", pod }), }, { label: "Force Delete", icon: Zap, variant: "destructive", hidden: !( pod.status.toLowerCase() === "running" || pod.status.toLowerCase() === "pending" ), onClick: () => setActiveModal({ type: "force-delete", pod }), }, ]} /> )) )}
{activeModal?.type === "logs" && ( { if (!o) setActiveModal(null); }} clusterId={clusterId} namespace={namespace} podName={activeModal.pod.name} containers={activeModal.pod.containers} /> )} {activeModal?.type === "shell" && ( { if (!o) setActiveModal(null); }} clusterId={clusterId} namespace={namespace} podName={activeModal.pod.name} containers={activeModal.pod.containers} /> )} {activeModal?.type === "attach" && ( { if (!o) setActiveModal(null); }} clusterId={clusterId} namespace={namespace} podName={activeModal.pod.name} containers={activeModal.pod.containers} /> )} {activeModal?.type === "edit" && ( { setActiveModal(null); onRefresh?.(); }} /> )} {activeModal?.type === "delete" && currentPod && ( { if (!o) setActiveModal(null); }} resourceType="Pod" resourceName={currentPod.name} isLoading={isDeleting} onConfirm={() => handleDelete(false)} /> )} {activeModal?.type === "force-delete" && currentPod && ( { if (!o) setActiveModal(null); }} resourceType="Pod" resourceName={currentPod.name} variant="force-delete" isLoading={isDeleting} onConfirm={() => handleDelete(true)} /> )} ); }