import React, { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui"; import { Scale, RotateCcw, Undo2, Pencil, Trash2 } from "lucide-react"; import type { DeploymentInfo } from "@/lib/tauriCommands"; import { scaleDeploymentCmd, restartDeploymentCmd, rollbackDeploymentCmd, deleteResourceCmd, getResourceYamlCmd, } from "@/lib/tauriCommands"; import { ResourceActionMenu } from "./ResourceActionMenu"; import { ConfirmDeleteDialog } from "./ConfirmDeleteDialog"; import { ScaleModal } from "./ScaleModal"; import { EditResourceModal } from "./EditResourceModal"; interface DeploymentListProps { deployments: DeploymentInfo[]; clusterId: string; namespace: string; onRefresh?: () => void; } type ActiveModal = | { type: "scale"; deployment: DeploymentInfo } | { type: "restart"; deployment: DeploymentInfo } | { type: "rollback"; deployment: DeploymentInfo } | { type: "edit"; deployment: DeploymentInfo; yaml: string } | { type: "delete"; deployment: DeploymentInfo } | null; export function DeploymentList({ deployments, clusterId, namespace, onRefresh }: DeploymentListProps) { const [activeModal, setActiveModal] = useState(null); const [isActing, setIsActing] = useState(false); const [actionError, setActionError] = useState(null); const openEdit = async (deployment: DeploymentInfo) => { setActionError(null); try { const yaml = await getResourceYamlCmd(clusterId, "deployments", namespace, deployment.name); setActiveModal({ type: "edit", deployment, yaml }); } catch (err) { setActionError(err instanceof Error ? err.message : String(err)); } }; const handleRestart = async () => { if (activeModal?.type !== "restart") return; setIsActing(true); try { await restartDeploymentCmd(clusterId, namespace, activeModal.deployment.name); setActiveModal(null); onRefresh?.(); } catch (err) { setActionError(err instanceof Error ? err.message : String(err)); } finally { setIsActing(false); } }; const handleRollback = async () => { if (activeModal?.type !== "rollback") return; setIsActing(true); try { await rollbackDeploymentCmd(clusterId, namespace, activeModal.deployment.name); setActiveModal(null); onRefresh?.(); } catch (err) { setActionError(err instanceof Error ? err.message : String(err)); } finally { setIsActing(false); } }; const handleDelete = async () => { if (activeModal?.type !== "delete") return; setIsActing(true); try { await deleteResourceCmd(clusterId, "deployments", namespace, activeModal.deployment.name); setActiveModal(null); onRefresh?.(); } finally { setIsActing(false); } }; return ( <> {actionError && (

{actionError}

)}
Name Ready Up-to-date Available Replicas Age Actions {deployments.length === 0 ? ( No deployments found ) : ( deployments.map((deployment) => ( {deployment.name} {deployment.ready} {deployment.up_to_date} {deployment.available} {deployment.replicas} {deployment.age} setActiveModal({ type: "scale", deployment }), }, { label: "Restart", icon: RotateCcw, onClick: () => setActiveModal({ type: "restart", deployment }), }, { label: "Rollback", icon: Undo2, onClick: () => setActiveModal({ type: "rollback", deployment }), }, { label: "Edit", icon: Pencil, onClick: () => openEdit(deployment), }, { label: "Delete", icon: Trash2, variant: "destructive", onClick: () => setActiveModal({ type: "delete", deployment }), }, ]} /> )) )}
{activeModal?.type === "scale" && ( { if (!o) setActiveModal(null); }} resourceType="Deployment" resourceName={activeModal.deployment.name} currentReplicas={activeModal.deployment.replicas} onScale={(replicas) => scaleDeploymentCmd(clusterId, namespace, activeModal.deployment.name, replicas).then(() => { setActiveModal(null); onRefresh?.(); }) } /> )} {activeModal?.type === "restart" && ( { if (!o) setActiveModal(null); }} resourceType="Deployment" resourceName={activeModal.deployment.name} isLoading={isActing} onConfirm={handleRestart} variant="delete" /> )} {activeModal?.type === "rollback" && ( { if (!o) setActiveModal(null); }} resourceType="Deployment" resourceName={activeModal.deployment.name} isLoading={isActing} onConfirm={handleRollback} variant="delete" /> )} {activeModal?.type === "edit" && ( { setActiveModal(null); onRefresh?.(); }} /> )} {activeModal?.type === "delete" && ( { if (!o) setActiveModal(null); }} resourceType="Deployment" resourceName={activeModal.deployment.name} isLoading={isActing} onConfirm={handleDelete} /> )} ); }