import React, { useMemo } from 'react'; import { Box, Stack, Text } from '@mantine/core'; import { type ToolRegistryEntry } from '../../data/toolRegistry'; import ToolButton from './toolPicker/ToolButton'; import { useTranslation } from 'react-i18next'; interface SearchResultsProps { filteredTools: [string, ToolRegistryEntry][]; onSelect: (id: string) => void; } const SearchResults: React.FC = ({ filteredTools, onSelect }) => { const { t } = useTranslation(); // 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 ( {t('toolPicker.noToolsFound', 'No tools found')} ); } return ( {groupedToolsByCategory.map(categoryGroup => ( {t(`toolPicker.subcategories.${categoryGroup.categoryName}`, 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;