// Copyright (C) 2017-2023 Smart code 203358507 const React = require('react'); const { useNavigate } = require('react-router'); const { useSearchParams } = require('react-router-dom'); 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 { default: useRouteFocused } = require('stremio/common/useRouteFocused'); const Button = require('stremio/components/Button').default; const TextInput = require('stremio/components/TextInput').default; const { default: usePlayUrl } = require('stremio/common/usePlayUrl'); 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 SearchBar = React.memo(({ className, query, active }) => { const { t } = useTranslation(); const routeFocused = useRouteFocused(); const searchHistory = useSearchHistory(); const localSearch = useLocalSearch(); const navigate = useNavigate(); const { handlePlayUrl } = usePlayUrl(); const [historyOpen, openHistory, closeHistory, ] = useBinaryState(query === null ? true : false); const [currentQuery, setCurrentQuery] = React.useState(query || ''); const [, setSearchParams] = useSearchParams(); const searchInputRef = React.useRef(null); const containerRef = React.useRef(null); const searchBarOnClick = React.useCallback(() => { if (!active) { navigate('/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(); }, []); const queryInputOnPaste = React.useCallback((event) => { const pasted = event.clipboardData.getData('text'); if (pasted) { handlePlayUrl(pasted); } }, [handlePlayUrl]); const queryInputOnSubmit = React.useCallback((event) => { event.preventDefault(); const searchValue = `/search?search=${encodeURIComponent(event.target.value)}`; setCurrentQuery(searchValue); if (searchInputRef.current && searchValue) { setSearchParams({ search: event.target.value }); closeHistory(); } }, []); const queryInputClear = React.useCallback(() => { searchInputRef.current.value = ''; setCurrentQuery(''); setSearchParams({}); navigate('/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);