@findify/react-components
Version:
Findify react UI components
49 lines (48 loc) • 2.26 kB
JSX
/**
* @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>);
};