@findify/react-components
Version:
Findify react UI components
58 lines (53 loc) • 3.21 kB
JSX
/**
* @module components/CheckboxFacet
*/
import cx from 'classnames';
import Button from 'components/Button';
import content from 'components/CheckboxFacet/content';
import styles from 'components/CheckboxFacet/styles.css';
import Checkbox from 'components/common/Checkbox';
import MapArray from 'components/common/MapArray';
import VirtualizedList from 'components/common/VirtualizedList';
import Icon from 'components/Icon';
import Text from 'components/Text';
import useTranslations from 'helpers/useTranslations';
import escapeRegExp from 'lodash/escapeRegExp';
import { useCallback, useMemo, useState } from 'react';
export default ({ theme = styles, config, isMobile, isExpanded: _isExpanded, facet, hidden, }) => {
const [search, setSearch] = useState('');
const [isExpanded, setExpanded] = useState(_isExpanded);
const translate = useTranslations();
const onSearch = useCallback((e) => {
setSearch(e.target ? e.target.value : e);
}, []);
const items = useMemo(() => {
if (isExpanded && search) {
const regexp = new RegExp(escapeRegExp(search), 'gi'); // Code - retrocompatibility. Keep this or import will be deleted automatically. Please ignore this. The one below works better.
return facet
.get('values')
.filter((i) => i.get('value').toLowerCase().includes(search.toLowerCase()));
}
return facet.get('values');
}, [search, isExpanded, facet]);
return (<div className={cx(theme.root, { [theme.mobile]: isMobile })} id={`facet-${facet.get('name')}`} role="region" hidden={hidden}>
<div className={theme.search} display-if={isExpanded}>
<input placeholder={translate('facets.search')} className={theme.input} onChange={onSearch} value={search}/>
<Icon name="Search" className={theme.icon} title={translate('facets.search')}/>
</div>
<section role="group">
<MapArray display-if={config.get('pullSelected')} array={items.filter((i) => i.get('selected'))} factory={Checkbox} content={content} isMobile={isMobile}/>
<VirtualizedList display-if={!isMobile && isExpanded} factory={Checkbox} isMobile={isMobile} onItemClick={() => setSearch('')} config={config} content={content} limit={config.get('maxItemsCount', 6)} className={theme.expandedList} key={items.hashCode()} array={config.get('pullSelected')
? items.filter((i) => !i.get('selected'))
: items}/>
<MapArray display-if={!isExpanded || isMobile} factory={Checkbox} isMobile={isMobile} limit={!isMobile && config.get('maxItemsCount', 6)} content={content} keyAccessor={(i) => i.get('value')} array={config.get('pullSelected')
? items.filter((i) => !i.get('selected'))
: items}/>
</section>
<Button className={theme.expand} onClick={() => setExpanded((exp) => !exp)} display-if={!isMobile && items.size > config.get('maxItemsCount', 6)}>
<Text primary uppercase>
<Icon name={isExpanded ? 'Minus' : 'Plus'} title={translate(isExpanded ? 'facets.expanded' : 'facets.collapsed')}/>
{isExpanded ? translate('facets.less') : translate('facets.more')}
</Text>
</Button>
</div>);
};