UNPKG

@findify/react-components

Version:
45 lines (44 loc) 1.71 kB
/** * @module layouts/Autocomplete */ import { createElement, useMemo } from 'react'; import { useConfig } from '@findify/react-connect'; import { portal } from 'helpers/createPortal'; import Loadable from 'react-loadable'; import useMedia from 'helpers/useMedia'; import { LayoutTypes } from './types'; /** * Layout factory is used to wrap Autocomplete layout in a div, containing data-findify-autocomplete-wrapper attribute, * which it requires in order to work correctly * @param type View type needed * @param props Props for React component */ const layoutFactory = (type, props) => () => { const Component = useMemo(() => Loadable({ loader: LayoutTypes[type], loading: () => null }), []); return (<div data-findify-autocomplete-wrapper="true"> <Component {...props}/> </div>); }; /** * Used to render view either in a portal or in place * @param type View type needed * @param props Props for React component */ const renderView = (type, props) => (type === 'sidebar' ? portal : createElement)(layoutFactory(type, props)); const Autocomplete = ({ isTrendingSearches, ...rest }) => { const { config } = useConfig(); const [isMobile, isDesktop] = useMedia([config.get('mobileBreakpoint')]); const size = isDesktop ? 'desktop' : 'mobile'; const viewType = config.getIn([size, 'template']); const isFullScreen = viewType === 'fullscreen'; return renderView(isFullScreen ? 'dropdown' : viewType, { ...rest, config: config.merge(config.get(size)), isMobile, isFullScreen, isTrendingSearches, }); }; export default process.env.HOT ? require('react-hot-loader').hot(module)(Autocomplete) : Autocomplete;