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