import React from "react"; import { Box } from "lucide-react"; import { useTranslation } from "react-i18next"; import type { DockerContainer } from "@/types"; import { ContainerCard } from "./ContainerCard.tsx"; interface ContainerListProps { containers: DockerContainer[]; sessionId: string; onSelectContainer: (containerId: string) => void; selectedContainerId?: string | null; onRefresh?: () => void; search?: string; statusFilter?: string; } export function ContainerList({ containers, sessionId, onSelectContainer, selectedContainerId = null, onRefresh, search = "", statusFilter = "all", }: ContainerListProps): React.ReactElement { const { t } = useTranslation(); const filtered = React.useMemo(() => { return containers.filter((c) => { const name = c.name.startsWith("/") ? c.name.slice(1) : c.name; const matchesSearch = name.toLowerCase().includes(search.toLowerCase()) || c.image.toLowerCase().includes(search.toLowerCase()) || c.id.toLowerCase().includes(search.toLowerCase()); return ( matchesSearch && (statusFilter === "all" || c.state === statusFilter) ); }); }, [containers, search, statusFilter]); if (containers.length === 0) { return (
{t("docker.noContainersFound")} {t("docker.noContainersFoundHint")}
); } if (filtered.length === 0) { return (
{t("docker.noContainersMatchFilters")} {t("docker.noContainersMatchFiltersHint")}
); } return (
{filtered.map((container) => ( onSelectContainer(container.id)} isSelected={selectedContainerId === container.id} onRefresh={onRefresh} /> ))}
); }