import React, { useState, useRef, useEffect, ChangeEvent, KeyboardEvent, } from 'react'; import Icon from '@components/icons'; interface SearchModalProps { onSearch: (query: string) => void; searchResults: string[]; onExecute: (result: string) => void; } const SearchModal: React.FC = ({ onSearch, searchResults, onExecute, }) => { const [searchQuery, setSearchQuery] = useState(''); const [selectedItem, setSelectedItem] = useState(0); const inputRef = useRef(null); const modalRef = useRef(null); useEffect(() => { inputRef.current?.focus(); }, [inputRef]); useEffect(() => { if (searchResults.length > 0 && modalRef.current) { const selectedItemElement = modalRef.current.childNodes[ selectedItem ] as HTMLElement; if (selectedItemElement) { selectedItemElement.scrollIntoView({ behavior: 'smooth', block: 'center', }); } } }, [selectedItem, searchResults]); const handleKeyDown = (e: KeyboardEvent) => { const target = e.target as HTMLInputElement; if (target.id === 'file-search-input') { if (e.key === 'ArrowDown') { e.preventDefault(); setSelectedItem((prev) => (prev + 1) % searchResults.length); } else if (e.key === 'ArrowUp') { e.preventDefault(); setSelectedItem( (prev) => (prev - 1 + searchResults.length) % searchResults.length ); } else if (e.key === 'Enter') { e.preventDefault(); onExecute(searchResults[selectedItem]); } } }; const onClickLine = (index: number) => { setSelectedItem(index); onExecute(searchResults[index]); }; const getFileType = (filename: string) => { const fileName = filename.split('/').pop(); let fileType; if (fileName && fileName.indexOf('.') !== -1) { fileType = `file_type_${fileName.split('.').slice(-1)}`; } else { fileType = 'default_file'; } return fileType; }; return (
e.stopPropagation()}> ) => { setSearchQuery(e.target.value); setSelectedItem(0); onSearch(e.target.value); }} onKeyDown={handleKeyDown} placeholder="Search for files..." /> {searchResults.length > 0 && (
    {searchResults.map((result, index) => (
  • onClickLine(index)} > {result}
  • ))}
)}
); }; export default SearchModal;