UNPKG

@findify/react-components

Version:
87 lines (81 loc) 3.57 kB
/** * @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>); });