import { useTranslation } from "react-i18next"; import { useEffect, useState, useRef } from "react"; import classNames from "classnames"; import { resolveIcon } from "./services/item"; export default function HomepageSearch({bookmarksAndServices, searchString, setSearchString, isOpen, close}) { const { t } = useTranslation(); const searchField = useRef(); const [results, setResults] = useState([]); const [currentItemIndex, setCurrentItemIndex] = useState(null); function resetAndClose() { setSearchString(""); close(false); } function handleSearchChange(event) { setSearchString(event.target.value.toLowerCase()) } function handleSearchKeyDown(event) { if (event.key === "Escape") { resetAndClose(); } else if (event.key === "Enter" && results.length) { resetAndClose(); const result = results[currentItemIndex]; window.open(result.href, '_blank'); } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); event.preventDefault(); } else if (event.key === "ArrowUp" && currentItemIndex > 0) { setCurrentItemIndex(currentItemIndex - 1); event.preventDefault(); } } function handleItemClick() { resetAndClose(); } useEffect(() => { if (searchString.length === 0) setResults([]); else { const newResults = bookmarksAndServices.filter(r => r.name.toLowerCase().includes(searchString)); setResults(newResults); if (newResults.length) { setCurrentItemIndex(0); } } }, [searchString, bookmarksAndServices]) const [hidden, setHidden] = useState(true); useEffect(() => { if (isOpen) { searchField.current.focus(); setHidden(false); } else { setTimeout(() => { setHidden(true); }, 300); // disable on close } }, [isOpen]) return (