UNPKG

@findify/react-components

Version:
57 lines (55 loc) 2.42 kB
import styles from 'layouts/Autocomplete/Sidebar/styles.css'; import { useQuery, useSuggestions } from '@findify/react-connect'; import { useCallback, useEffect, useRef } from 'react'; import Drawer from 'components/common/Drawer'; import Icon from 'components/Icon'; import useTranslations from 'helpers/useTranslations'; import Layout from 'components/autocomplete/Layout'; export default ({ theme = styles, config }) => { const { suggestions, update } = useSuggestions(); const { query } = useQuery(); const translate = useTranslations(); const input = useRef(null); const isTrendingSearches = !query.get('q'); const onExit = useCallback(() => { window.findify.emit('autocompleteFocusLost', config.get('widgetKey')); }, []); const onSubmit = useCallback(() => { window.findify.emit('search', config.get('widgetKey'), input.current?.value); onExit(); }, []); const onInputChange = useCallback((e) => { const { value } = e.target; update('q', value); }, []); const onFocusOut = useCallback((e) => { e.stopImmediatePropagation(); if (e.relatedTarget !== input.current) return; }, []); useEffect(() => { if (input.current) { setTimeout(() => input.current?.focus(), 500); } document.addEventListener('focusout', onFocusOut, true); return () => { document.removeEventListener('focusout', onFocusOut); }; }, []); return (<Drawer hideModal={onExit}> <div className={theme.root} data-findify-autocomplete={true} tabIndex={0}> <div display-if={config.get('overlay')} className={theme.backdrop}/> <div className={theme.header}> <form onSubmit={onSubmit}> <input defaultValue={query.get('q')} className={theme.input} ref={input} onChange={onInputChange} placeholder={translate('autocomplete.placeholder')}/> </form> <div className={theme.icons}> <Icon onClick={onSubmit} className={theme.searchIcon} name={'Search'} width={18} height={18}/> <div className={theme.iconDivider}/> <Icon onClick={onExit} className={theme.xIcon} name={'XMobile'} width={13} height={13}/> </div> </div> <Layout className={theme.content} config={config} isTrendingSearches={isTrendingSearches}/> </div> </Drawer>); };