import { useCallback, useState } from 'react'; import { CollectionState, Filter, FiltersMap, OptionalFiltersMap, } from '@wix/bex-core'; import { CollectionConfig, CollectionConfigWithConditionals, CursorFetchDataFn, OffsetFetchDataFn, useCreateCollection, } from '@wix/bex-core/react'; type FiltersConfig = F extends OptionalFiltersMap ? { filters?: {} } : { filters: F }; type PaginationModeConfig = | { paginationMode?: 'offset'; fetchData: OffsetFetchDataFn; } | { paginationMode: 'cursor'; fetchData: CursorFetchDataFn; }; export type FilterCollectionConfig = Omit< CollectionConfig, | 'itemKey' | 'itemName' | 'filters' | 'paginationMode' | 'fetchData' | 'fetchErrorMessage' > & FiltersConfig & PaginationModeConfig; export type FilterCollectionFactory = ( filter: Filter, config: FilterCollectionConfig, ) => CollectionState; export function useCreateFilterCollection(): FilterCollectionFactory { const createCollection = useCreateCollection(); return useCallback( ( filter: Filter, config: FilterCollectionConfig, ) => { return createCollection({ itemKey: filter.itemKey, itemName: filter.itemName, ...config, fetchErrorMessage: () => null, filters: config.filters ?? {}, } as CollectionConfigWithConditionals); }, [], ); } export function useFilterCollection< T, F extends FiltersMap = OptionalFiltersMap, >( filter: Filter, config: FilterCollectionConfig, ): CollectionState { const createFilterCollection = useCreateFilterCollection(); const [collection] = useState(() => createFilterCollection(filter, { ...config, queryOptions: { refetchOnMount: false, retryOnMount: false, }, }), ); return collection; }