UNPKG

@findify/react-components

Version:
56 lines (54 loc) 2.61 kB
/** * @module components/search/DesktopFacets */ import Branch from 'components/common/Branch'; import MapArray from 'components/common/MapArray'; import Facet from 'components/Facet'; import Sticky from 'components/common/Sticky'; import Title from 'components/search/DesktopFacets/Title'; import { useFacets } from '@findify/react-connect'; import { memo, useCallback, useMemo, useState } from 'react'; import useTranslations from 'helpers/useTranslations'; import { useEvents, emit } from 'helpers/emmiter'; import styles from 'components/search/DesktopFacets/styles.css'; const DefaultContent = ({ theme, children, title }) => (<section className={theme.root} role="region" aria-label={title} tabIndex={0}> <div className={theme.container}>{children}</div> </section>); export default memo(({ theme = styles }) => { const { facets, meta, onReset, config } = useFacets(); const translate = useTranslations(); const [isHorizontal, isHidable, isSticky, isAccordion] = useMemo(() => [ config.getIn(['facets', 'position']) === 'top', config.getIn(['facets', 'hidable']), config.getIn(['facets', 'sticky']), config.getIn(['facets', 'accordion']), ], []); const [visible, setVisible] = useState(true); /** Generate initial list of opened facets */ const [openFacets, setFacetsStates] = useState(config .getIn(['facets', 'filters']) .filter((f) => !f.get('initiallyCollapsed')) .keySeq() .toArray()); const toggleFacet = (name) => setFacetsStates((facets) => { const isOpen = facets.includes(name); if (isAccordion) return isOpen ? [] : [name]; return isOpen ? [...facets.filter((k) => k !== name)] : [...facets, name]; }); useEvents({ showFacets: () => setVisible(true), toggleFacet: (name) => toggleFacet(name), }); const hideFacets = useCallback(() => { emit('hideFacets'); setVisible(false); }, []); return (<Branch display-if={!isHidable || visible} theme={{ container: theme.container, root: isHorizontal ? theme.horizontal : theme.root, }} condition={isSticky} title={translate('facets.filters')} left={Sticky} right={DefaultContent} stickToTop={isHorizontal} offset={isHorizontal ? 0 : 25}> <Title meta={meta} theme={theme} onReset={onReset} onHide={hideFacets} hidable={isHidable}/> <MapArray array={facets} factory={Facet} config={config} isHorizontal={isHorizontal} onToggle={toggleFacet} openFacets={openFacets} keyAccessor={(i) => i.get('name')}/> </Branch>); });