import { forwardRef, useState, useCallback, useMemo, Ref } from 'react'; import { Search, X } from 'lucide-react'; import { useSetRecoilState } from 'recoil'; import debounce from 'lodash/debounce'; import { useLocalize } from '~/hooks'; import { cn } from '~/utils'; import store from '~/store'; type SearchBarProps = { clearSearch: () => void; }; const SearchBar = forwardRef((props: SearchBarProps, ref: Ref) => { const { clearSearch } = props; const setSearchQuery = useSetRecoilState(store.searchQuery); const [showClearIcon, setShowClearIcon] = useState(false); const [text, setText] = useState(''); const localize = useLocalize(); const clearText = useCallback(() => { setShowClearIcon(false); setSearchQuery(''); clearSearch(); setText(''); }, [setSearchQuery, clearSearch]); const handleKeyUp = (e: React.KeyboardEvent) => { const { value } = e.target as HTMLInputElement; if (e.key === 'Backspace' && value === '') { clearText(); } }; const sendRequest = useCallback((value: string) => setSearchQuery(value), [setSearchQuery]); const debouncedSendRequest = useMemo(() => debounce(sendRequest, 350), [sendRequest]); const onChange = (e: React.FormEvent) => { const { value } = e.target as HTMLInputElement; setShowClearIcon(value.length > 0); setText(value); debouncedSendRequest(value); }; return (
{} { e.code === 'Space' ? e.stopPropagation() : null; }} placeholder={localize('com_nav_search_placeholder')} onKeyUp={handleKeyUp} />
); }); export default SearchBar;