diff --git a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js index 8f0163177..f75ba29a7 100644 --- a/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js +++ b/src/common/NavBar/HorizontalNavBar/SearchBar/SearchBar.js @@ -14,63 +14,79 @@ const styles = require('./styles'); const useSearchHistory = require('../../../../routes/Search/useSearchHistory'); const useLocalSearch = require('./useLocalSearch'); -const SearchBar = ({ className, query, active }) => { +const SearchBar = React.memo(({ className, query, active }) => { const { t } = useTranslation(); const routeFocused = useRouteFocused(); const searchHistory = useSearchHistory(); const { createTorrentFromMagnet } = useTorrent(); - const [inputValue, setInputValue] = React.useState(query || ''); - const localSearch = useLocalSearch(inputValue); - const [historyActive, setHistoryActive] = React.useState(true); + const [showHistory, setShowHistory] = React.useState(false); + const [currentQuery, setCurrentQuery] = React.useState(query || ''); + const localSearch = useLocalSearch(currentQuery); const searchInputRef = React.useRef(null); const searchHistoryRef = React.useRef(null); + const searchBarOnClick = React.useCallback(() => { if (!active) { window.location = '#/search'; } }, [active]); + const queryInputOnChange = React.useCallback(() => { - setInputValue(searchInputRef.current.value); - localSearch.dispatchSearch(); + const value = searchInputRef.current.value; + setCurrentQuery(value); + setShowHistory(true); try { - createTorrentFromMagnet(searchInputRef.current.value); - // eslint-disable-next-line no-empty - } catch { } - }, []); - const queryInputOnSubmit = React.useCallback((event) => { - if (searchInputRef.current !== null) { - const searchValue = event.target.innerText ? event.target.innerText : searchInputRef.current.value; - if (searchValue) { - const queryParams = new URLSearchParams([['search', searchValue]]); - window.location = `#/search?${queryParams.toString()}`; - setInputValue(searchValue); - if (event.key === 'Enter') { - setHistoryActive(false); - } - } + createTorrentFromMagnet(value); + } catch (error) { + console.error('Failed to create torrent from magnet:', error); + } + }, [createTorrentFromMagnet]); + + const queryInputOnSubmit = React.useCallback((searchValue, event) => { + event.preventDefault(); + if (searchInputRef.current && searchValue) { + window.location.hash = searchValue; + setShowHistory(false); } }, []); + + const queryInputClear = React.useCallback(() => { + searchInputRef.current.value = ''; + window.location.hash = '/search'; + }, []); + React.useEffect(() => { if (routeFocused && active) { searchInputRef.current.focus(); } - }, [routeFocused, active, query]); - const queryInputClear = React.useCallback(() => { - searchInputRef.current.value = ''; - setInputValue(''); - window.location = '#/search'; - }, []); - const handleBlur = (event) => { - if (!searchHistoryRef?.current?.contains(event.relatedTarget)) { - setHistoryActive(false); - } + }, [routeFocused, active]); + + const renderSearchHistoryItems = () => { + return ( +
+ {searchHistory.items.slice(0, 8).map((item, index) => ( + queryInputOnSubmit(`/search?search=${item.query}`, e)}> + {item.query} + + ))} +
+ ); }; - const handleClick = () => { - setHistoryActive((prev) => !prev); + const renderLocalSearchItems = () => { + return ( +
+
{ t('Recommendations') }
+ {localSearch.searchResults.map((item, index) => ( + queryInputOnSubmit(`/search?search=${item.name}`, e)}> + {item.name} + + ))} +
+ ); }; return ( -