import React, { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui"; import { Badge } from "@/components/ui"; import { Pencil, Trash2 } from "lucide-react"; import type { ServiceInfo } from "@/lib/tauriCommands"; import { deleteResourceCmd, getResourceYamlCmd } from "@/lib/tauriCommands"; import { ResourceActionMenu } from "./ResourceActionMenu"; import { ConfirmDeleteDialog } from "./ConfirmDeleteDialog"; import { EditResourceModal } from "./EditResourceModal"; interface ServiceListProps { services: ServiceInfo[]; clusterId: string; namespace: string; onRefresh?: () => void; } type ActiveModal = | { type: "edit"; svc: ServiceInfo; yaml: string } | { type: "delete"; svc: ServiceInfo } | null; export function ServiceList({ services, clusterId, namespace: _namespace, onRefresh }: ServiceListProps) { const [activeModal, setActiveModal] = useState(null); const [isDeleting, setIsDeleting] = useState(false); const [actionError, setActionError] = useState(null); const getServiceTypeColor = (type: string) => { switch (type.toLowerCase()) { case "clusterip": return "bg-blue-500"; case "nodeport": return "bg-purple-500"; case "loadbalancer": return "bg-green-500"; case "externalname": return "bg-gray-500"; default: return "bg-gray-500"; } }; const openEdit = async (svc: ServiceInfo) => { setActionError(null); try { const yaml = await getResourceYamlCmd(clusterId, "services", svc.namespace, svc.name); setActiveModal({ type: "edit", svc, yaml }); } catch (err) { setActionError(err instanceof Error ? err.message : String(err)); } }; const handleDelete = async () => { if (activeModal?.type !== "delete") return; setIsDeleting(true); try { await deleteResourceCmd(clusterId, "services", activeModal.svc.namespace, activeModal.svc.name); setActiveModal(null); onRefresh?.(); } finally { setIsDeleting(false); } }; return ( <> {actionError && (

{actionError}

)}
Name Type Cluster IP External IP Ports Age Actions {services.length === 0 ? ( No services found ) : ( services.map((service) => ( {service.name} {service.type} {service.cluster_ip} {service.external_ip || "N/A"}
{service.ports.map((port) => (
{port.name ? `${port.name}: ` : ""} {port.port}/{port.protocol} {port.target_port && ` → ${port.target_port}`}
))}
{service.age} openEdit(service), }, { label: "Delete", icon: Trash2, variant: "destructive", onClick: () => setActiveModal({ type: "delete", svc: service }), }, ]} />
)) )}
{activeModal?.type === "edit" && ( { setActiveModal(null); onRefresh?.(); }} /> )} {activeModal?.type === "delete" && ( { if (!o) setActiveModal(null); }} resourceType="Service" resourceName={activeModal.svc.name} isLoading={isDeleting} onConfirm={handleDelete} /> )} ); }