@findify/react-components
Version:
Findify react UI components
87 lines (81 loc) • 3.57 kB
JSX
/**
* @module components/search/MobileFacets
*/
import Branch from 'components/common/Branch';
import FacetTitles from 'components/search/MobileFacets/Titles';
import Component from 'components/Facet/Component';
import Button from 'components/Button';
import cx from 'classnames';
import Icon from 'components/Icon';
import Text from 'components/Text';
import styles from 'components/search/MobileFacets/styles.css';
import { useFacets, useQuery } from '@findify/react-connect';
import { memo, useCallback, useMemo, useState } from 'react';
import useTranslations from 'helpers/useTranslations';
const FacetContent = ({ active, config, theme = styles, }) => {
const _config = config.merge(config.getIn(['facets', 'filters', active.get('name')]));
return (<div className={cx(theme.container, theme[_config.get('type')])}>
<Component isExpanded isMobile type={_config.get('type')} facet={active} config={_config}/>
</div>);
};
export default memo(({ theme = styles, hideModal }) => {
const { facets, config, update } = useFacets();
const { query } = useQuery();
const translate = useTranslations();
const [activeFacetName, setActiveFacet] = useState(null);
const total = useMemo(() => query
.get('filters')
?.reduce((acc, filter) => acc +
(/category[2-9]/.test(filter.get('name'))
? 0
: filter.get('values').size), 0) || 0, [query]);
const activeFacet = useMemo(() => facets.find((f) => f.get('name') === activeFacetName), [activeFacetName]);
const filtersSelected = useMemo(() => {
if (!activeFacet)
return 0;
return activeFacet.get('values').filter((item) => item.get('selected'))
.size;
}, [activeFacet]);
const selectFacet = useCallback((name) => {
setActiveFacet(name || null);
}, []);
const onReset = useCallback(() => {
update('filters', (f) => f?.clear());
}, []);
return (<div className={cx(theme.modal, 'mobile')}>
<div className={theme.header}>
<div className={theme.title}>
<Text primary uppercase display-if={!activeFacet}>
{translate('facets.filters')}
</Text>
<Text secondary uppercase display-if={!activeFacet && total} className={theme.filterCount}>
({total})
</Text>
<Text primary uppercase display-if={activeFacet}>
{config
.getIn(['facets', 'filters', activeFacet?.get('name')])
?.get('label')}
</Text>
<Text secondary uppercase display-if={activeFacet && filtersSelected} className={theme.filterCount}>
({filtersSelected})
</Text>
</div>
<Button onClick={activeFacet ? selectFacet : hideModal} className={theme.backButton}>
<Icon name="ArrowBack" title={translate('facets.back')}/>
</Button>
<Button display-if={query?.get('filters')?.size} onClick={onReset}>
<Text secondary uppercase>
{translate('facets.clearAll')}
</Text>
</Button>
</div>
<div className={theme.body}>
<Branch config={config} theme={theme} selectFacet={selectFacet} active={facets.find((f) => f.get('name') === activeFacetName)} facets={facets} condition={activeFacet} right={FacetTitles} left={FacetContent}/>
</div>
<Button className={theme.footer} onClick={activeFacet ? selectFacet : hideModal}>
{activeFacet
? translate('facets.done')
: translate('facets.seeResults')}
</Button>
</div>);
});