UNPKG

@findify/react-components

Version:
49 lines (48 loc) 2.26 kB
/** * @module layouts/Autocomplete/FullscreenWithInput */ import { useSuggestions } from '@findify/react-connect'; import useTranslations from 'helpers/useTranslations'; import { useAutocompleteLogic } from 'layouts/Autocomplete/withAutocompleteLogic'; import React, { useCallback, useEffect, useRef } from 'react'; import Icon from 'components/Icon'; import Layout from 'components/autocomplete/Layout'; import styles from 'layouts/Autocomplete/FullscreenWithInput/styles.css'; export default ({ theme = styles, config }) => { const { suggestions, meta, update } = useSuggestions(); const input = useRef(null); const translate = useTranslations(); const { closeAutocomplete } = useAutocompleteLogic(); const isTrendingSearches = !meta.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); }, []); useEffect(() => { if (input.current) input.current?.focus(); }, []); return (<div display-if={suggestions?.size > 0} className={theme.wrapper}> <div display-if={config.get('overlay')} className={theme.overlay} onClick={closeAutocomplete}/> <section className={theme.root} data-findify-autocomplete={true} tabIndex={0}> <div className={theme.header}> <form onSubmit={onSubmit}> <input defaultValue={meta.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.container} config={config} isTrendingSearches={isTrendingSearches}/> </section> </div>); };