import { useCallback, useEffect, useState } from 'react'; import type { FiltersMap, OptionalFiltersMap } from '@wix/bex-core'; import { CursorFetchDataFn, OffsetFetchDataFn } from '@wix/bex-core/react'; import { UsePickerModalParamsBase } from './UsePickerModalParamsBase'; import { PickerModalState } from './PickerModalState'; import { configure } from '@wix/bex-utils/react-dom'; import { version as cairoVersion } from '../../version'; configure(); type PaginationModeConfig = | { paginationMode?: 'offset'; fetchData: OffsetFetchDataFn; } | { paginationMode: 'cursor'; fetchData: CursorFetchDataFn; }; export type UsePickerModalParams = Omit< UsePickerModalParamsBase, 'paginationMode' | 'fetchData' > & PaginationModeConfig; export type PikerModalFactory = ( config: UsePickerModalParams, ) => PickerModalState; export function useCreatePickerModalState(): PikerModalFactory { return useCallback( ( params: UsePickerModalParams, ) => new PickerModalState({ ...params, environment: { ...params.environment, uiLibVersion: cairoVersion, }, }), [], ); } export function useSyncPickerModalProps< T, F extends FiltersMap = OptionalFiltersMap, >( state: PickerModalState | null, { onSelect, disableAutoSelectOnSingleItem, }: Pick< UsePickerModalParams, 'onSelect' | 'disableAutoSelectOnSingleItem' >, ) { useEffect(() => { if (!state) { return; } state.onSelectRef.current = onSelect; }, [onSelect]); useState(() => { if (!state) { return; } if (state.isModalOpen) { state.prefetch(); } state.disableAutoSelectionRef.current = disableAutoSelectOnSingleItem; }); useEffect(() => { if (!state) { return; } state.disableAutoSelectionRef.current = disableAutoSelectOnSingleItem; }, [disableAutoSelectOnSingleItem]); } export function usePickerModalState< T, F extends FiltersMap = OptionalFiltersMap, >(params: UsePickerModalParams): PickerModalState { const createPickerModal = useCreatePickerModalState(); const [state] = useState(() => createPickerModal(params)); useSyncPickerModalProps(state, params); return state; }