import React, { useMemo } from 'react'; import { Box, Stack, Text } from '@mantine/core'; import { type ToolRegistryEntry } from '../../data/toolRegistry'; import ToolButton from './toolPicker/ToolButton'; interface SearchResultsProps { filteredTools: [string, ToolRegistryEntry][]; onSelect: (id: string) => void; } const SearchResults: React.FC = ({ filteredTools, onSelect }) => { // Group tools by subcategory and remove duplicates const groupedToolsByCategory = useMemo(() => { const categoryToToolsMap: Record> = {}; const processedToolIds = new Set(); // Process each tool, skipping duplicates and grouping by subcategory filteredTools.forEach(([toolId, toolEntry]) => { // Skip if we've already processed this tool ID (deduplication) if (processedToolIds.has(toolId)) return; processedToolIds.add(toolId); // Use subcategory or default to 'General' if not specified const categoryName = toolEntry?.subcategory || 'General'; // Initialize category array if it doesn't exist if (!categoryToToolsMap[categoryName]) { categoryToToolsMap[categoryName] = []; } categoryToToolsMap[categoryName].push({ id: toolId, tool: toolEntry }); }); // Convert to sorted array format for rendering return Object.entries(categoryToToolsMap) .sort(([categoryA], [categoryB]) => categoryA.localeCompare(categoryB)) .map(([categoryName, toolsInCategory]) => ({ categoryName, toolsInCategory })); }, [filteredTools]); if (groupedToolsByCategory.length === 0) { return ( No tools found ); } return ( {groupedToolsByCategory.map(categoryGroup => ( {categoryGroup.categoryName} {categoryGroup.toolsInCategory.map(({ id, tool }) => ( ))} {/* bottom spacer within each group not strictly required, outer list can add a spacer if needed */} ))} {/* global spacer to allow scrolling past last row in search mode */}
); }; export default SearchResults;