import React, { useEffect, useState } from 'react'; import { CollectionFilterState, DropdownCollectionFilterState, } from '../../state'; import { observer } from 'mobx-react-lite'; import { CollectionState, FiltersMap } from '@wix/bex-core'; import { SingleSelectFilterBase, SingleSelectFilterBaseProps, } from '../SingleSelectFilterBase'; import { ListItem, useBuildGroupedOptions, useBuildOption } from '../../hooks'; import { useWixPatternsContainer } from '@wix/bex-core/react'; import { useFilterToolbarState, FilterTranslationProvider, } from '../../providers'; import { useFilterCollectionStates } from '../../hooks/useFilterCollectionStates'; import { CollectionFilterInitialFetchTimingProps, useCollectionFilterInitialFetchTiming, } from '../../hooks/useCollectionFilterInitialFetchTiming'; export interface SingleSelectFilterProps extends Omit< SingleSelectFilterBaseProps, 'keyedItems' | 'options' | 'dropdownSelect' >, CollectionFilterInitialFetchTimingProps { /** * Collection state object to fetch the items for the dropdown list.
* Create using [useFilterCollection](./?path=/story/features-filter-hooks--usefiltercollection) or [useStaticListFilterCollection](./?path=/story/features-filter-hooks--usestaticlistfiltercollection). * @external */ collection: CollectionState; /** * A function that returns a [ListItemSelectProps](https://www.docs.wixdesignsystem.com/?path=/story/components-form-dropdownlistitems--listitemselect) extended by `{sectionId?: string}`
* (Optional) * @external */ renderItem?: (item: V, index: number) => ListItem; /** * A function that returns [ListItemSectionProps](https://www.docs.wixdesignsystem.com/?path=/story/components-form-dropdownlistitems--listitemsection)
* According to make it works you need return `sectionId` in `renderItem` method.
* ⚠️ Server should return section items sorted by sections in strict order. Otherwise, when using infinite scrolling the behavior of the sections will be unexpected (see sections example).
* (Optional) * @external */ renderSection?: SingleSelectFilterBaseProps['renderSection']; } function _SingleSelectFilter( props: SingleSelectFilterProps, ) { const { filter, collection, renderItem, renderSection, ...rest } = props; const container = useWixPatternsContainer(); const toolbar = useFilterToolbarState(); const [collectionFilter] = useState( () => new CollectionFilterState({ collection, filter, }), ); const [{ dropdownSelect, init }] = useState( () => new DropdownCollectionFilterState({ collectionFilter, resetOnClose: false, container, toolbar, }), ); const { query: { search }, } = collection; const { skipInitialFetch, onFocus } = useCollectionFilterInitialFetchTiming(props); useEffect(() => init({ skipInitialFetch }), []); const { result: { keyedItems }, fetchedLastPage, } = collection; const options = useBuildGroupedOptions({ items: keyedItems.map( useBuildOption({ filter, renderItem, }), ), renderSection, }); const { fixedFooter, showInitialLoader } = useFilterCollectionStates({ collection, fixedFooter: rest.fixedFooter, }); return ( { collection.search(e.target.value, { clearResult: true }); }} onFocus={onFocus} filter={filter} options={options} renderItem={renderItem} dropdownSelect={dropdownSelect} hasMore={!showInitialLoader && !fetchedLastPage} loadMore={collection.fetchNextPageIfNeeded} /> ); } const SingleSelectFilterInternal = observer(_SingleSelectFilter); export function SingleSelectFilter( props: SingleSelectFilterProps, ) { return ( ); }