// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const PropTypes = require('prop-types'); const classnames = require('classnames'); const debounce = require('lodash.debounce'); const { useTranslation } = require('react-i18next'); const { default: Icon } = require('@stremio/stremio-icons/react'); const { useRouteFocused } = require('stremio-router'); const Button = require('stremio/common/Button'); const useTorrent = require('stremio/common/useTorrent'); const { withCoreSuspender } = require('stremio/common/CoreSuspender'); const useSearchHistory = require('./useSearchHistory'); const useLocalSearch = require('./useLocalSearch'); const styles = require('./styles'); const useBinaryState = require('stremio/common/useBinaryState'); const { default: TextInput } = require('stremio/common/TextInput'); const SearchBar = React.memo(({ className, query, active }) => { const { t } = useTranslation(); const routeFocused = useRouteFocused(); const searchHistory = useSearchHistory(); const localSearch = useLocalSearch(); const { createTorrentFromMagnet } = useTorrent(); const [historyOpen, openHistory, closeHistory, ] = useBinaryState(query === null ? true : false); const [currentQuery, setCurrentQuery] = React.useState(query || ''); const searchInputRef = React.useRef(null); const containerRef = React.useRef(null); const searchBarOnClick = React.useCallback(() => { if (!active) { window.location = '#/search'; } }, [active]); const searchHistoryOnClose = React.useCallback((event) => { if (historyOpen && containerRef.current && !containerRef.current.contains(event.target)) { closeHistory(); } }, [historyOpen]); React.useEffect(() => { document.addEventListener('mousedown', searchHistoryOnClose); return () => { document.removeEventListener('mousedown', searchHistoryOnClose); }; }, [searchHistoryOnClose]); const queryInputOnChange = React.useCallback(() => { const value = searchInputRef.current.value; setCurrentQuery(value); openHistory(); try { createTorrentFromMagnet(value); } catch (error) { console.error('Failed to create torrent from magnet:', error); } }, [createTorrentFromMagnet]); const queryInputOnSubmit = React.useCallback((event) => { event.preventDefault(); const searchValue = `/search?search=${encodeURIComponent(event.target.value)}`; setCurrentQuery(searchValue); if (searchInputRef.current && searchValue) { window.location.hash = searchValue; closeHistory(); } }, []); const queryInputClear = React.useCallback(() => { searchInputRef.current.value = ''; setCurrentQuery(''); window.location.hash = '/search'; }, []); const updateLocalSearchDebounced = React.useCallback(debounce((query) => { localSearch.search(query); }, 250), []); React.useEffect(() => { updateLocalSearchDebounced(currentQuery); }, [currentQuery]); React.useEffect(() => { if (routeFocused && active) { searchInputRef.current.focus(); } }, [routeFocused, active]); React.useEffect(() => { return () => { updateLocalSearchDebounced.cancel(); }; }, []); return (
{ active ? :
{ t('SEARCH_OR_PASTE_LINK') }
} { currentQuery.length > 0 ? : } { historyOpen && (searchHistory?.items?.length || localSearch?.items?.length) ?
{ searchHistory?.items?.length > 0 ?
{ t('STREMIO_TV_SEARCH_HISTORY_TITLE') }
{ searchHistory.items.slice(0, 8).map(({ query, deepLinks }, index) => ( )) }
: null } { localSearch?.items?.length ?
{ t('SEARCH_SUGGESTIONS') }
{ localSearch.items.map(({ query, deepLinks }, index) => ( )) }
: null }
: null }
); }); SearchBar.displayName = 'SearchBar'; SearchBar.propTypes = { className: PropTypes.string, query: PropTypes.string, active: PropTypes.bool }; const SearchBarFallback = ({ className }) => { const { t } = useTranslation(); return ( ); }; SearchBarFallback.propTypes = SearchBar.propTypes; module.exports = withCoreSuspender(SearchBar, SearchBarFallback);