import React from 'react';
import { Wrench, Search, Loader2 } from 'lucide-react';
import { Input } from '@/components/ui/input';
import { Badge } from '@/components/ui/badge';
import { Skeleton } from '@/components/ui/skeleton';
import { cn } from '@/lib/utils';
import type { McpServer, McpTool } from '@/components/hooks/useServers';
interface ToolsListProps {
tools: McpTool[];
selectedTool: McpTool | null;
selectedServer: McpServer | null;
isLoading: boolean;
error: string | null;
searchQuery: string;
onSearchChange: (query: string) => void;
onToolSelect: (tool: McpTool) => void;
}
export function ToolsList({
tools,
selectedTool,
selectedServer,
isLoading,
error,
searchQuery,
onSearchChange,
onToolSelect,
}: ToolsListProps) {
const filteredTools = tools.filter(
(tool) =>
tool.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
tool.description?.toLowerCase().includes(searchQuery.toLowerCase())
);
return (
{/* Header */}
Tools
{isLoading && tools.length === 0 && (
)}
{tools.length > 0 && (
{filteredTools.length}
)}
{tools.length > 0 && (
onSearchChange(e.target.value)}
className="h-8 text-sm pl-7"
/>
)}
{/* No Server Selected */}
{!selectedServer && (
Select a server
Choose a connected server to view its tools
)}
{/* Server Not Connected */}
{selectedServer && selectedServer.status !== 'connected' && (
Server not connected
"{selectedServer.name}" is {selectedServer.status}
)}
{/* Error State */}
{error && selectedServer?.status === 'connected' && !isLoading && (
Error loading tools
{error}
)}
{/* Loading State */}
{isLoading && selectedServer?.status === 'connected' && tools.length === 0 && (
{[1, 2, 3, 4].map((i) => (
))}
)}
{/* Empty State */}
{selectedServer &&
selectedServer.status === 'connected' &&
!isLoading &&
tools.length === 0 &&
!error && (
No tools available
No tools found for {selectedServer.name}
)}
{/* Tools List */}
{filteredTools.length > 0 && (
{filteredTools.map((tool) => (
))}
)}
{/* No Search Results */}
{filteredTools.length === 0 && tools.length > 0 && (
No tools match your search
Try a different search term
)}
);
}