// 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 (