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