UNPKG

@findify/react-components

Version:
38 lines (37 loc) 1.71 kB
/** * @module components/Facet */ import cx from 'classnames'; import Button from 'components/Button'; import Text from 'components/Text'; import Icon from 'components/Icon'; import Component from 'components/Facet/Component'; import { useCallback, useEffect, useMemo, useRef } from 'react'; import styles from 'components/Facet/styles.css'; export default ({ theme = styles, item, config: _config, isMobile, isHorizontal, onToggle, openFacets, }) => { const { current: config } = useRef(_config.merge(_config.getIn(['facets', 'filters', item.get('name')]))); const selectedItemsCount = useMemo(() => item.get('values').filter((item) => item.get('selected')).size, [item]); const title = config.get('label') || item.get('name'); const isOpen = openFacets.includes(item.get('name')); const onClick = useCallback(() => { onToggle(item.get('name')); }, []); useEffect(() => { window.dispatchEvent(new Event('resize')); }, [isOpen]); return (<div className={cx(theme.root, { [theme.horizontal]: isHorizontal, [theme.mobile]: isMobile, [theme.expanded]: isOpen, })}> <Button className={theme.title} onClick={onClick} aria-expanded={isOpen} aria-controls={`facet-${item.get('name')}`} tabIndex={0}> <Text primary uppercase className={theme.text}> {title} {selectedItemsCount ? `(${selectedItemsCount})` : ''} </Text> <Icon name={isOpen ? 'Minus' : 'Plus'} className={theme.icon} title={isOpen ? 'Collapse list' : 'Expand list'}/> </Button> <div className={theme.body} hidden={!isOpen}> <Component facet={item} config={config} isMobile={isMobile}/> </div> </div>); };