import React, { ReactElement, useEffect, useState } from 'react'; import { FiltersMap } from '@wix/bex-core'; import { runInAction } from 'mobx'; import { useCreatePickerContentState } from '../../hooks/usePickerContent'; import { PickerContentState } from '../../state'; import { PickerContentProps } from './PickerContent'; import { PickerContentAdditionalStep } from './PickerContentAdditionalStep'; import { PickerContentItemsSelection } from './PickerContentItemsSelection'; import { PickerContentBaseWrapped } from './PickerContentBaseWrapped'; import { fromMultipleSelectionToBoolean } from '../MaxSelection'; import { observer } from 'mobx-react-lite'; import type { PickerContentAdditionalStepProps } from './PickerContentAdditionalStep'; import { Box, Loader } from '@wix/design-system'; export interface PickerContentWrappedProps extends PickerContentProps, Pick< PickerContentAdditionalStepProps, 'autoAdditionalStepOnInitialSelect' > { renderPickerContent: (params: { state: PickerContentState; renderItem: PickerContentProps['renderItem']; }) => ReactElement; } function _PickerContentWrapped( props: PickerContentWrappedProps, ) { const { state: params, renderPickerContent, primaryButtonOnClick, backButtonOnClick, continueButtonOnClick, } = props; const createPickerContentState = useCreatePickerContentState(); const [state] = useState(() => params instanceof PickerContentState ? params : createPickerContentState(params), ); useEffect(() => { return state.init({ autoAdditionalStepOnInitialSelect: props.autoAdditionalStepOnInitialSelect, }); }, [state]); const { isAdditionalStepShown, setIsAdditionalStepShown, isAutoAdditionalStepPending, } = state; const { picker, modalState } = state; const { _isModalOpen } = modalState; const primaryOnClick = ({ currentLevel, numLevels, }: { currentLevel: number; numLevels: number; }) => { picker.onPrimaryButtonClick({ currentLevel, numLevels }); runInAction(() => { modalState.onPrimaryButtonClick( state, state.additionalStep?.additionalData, ); }); primaryButtonOnClick?.(); }; const secondaryOnClick = () => { picker.onSecondaryButtonOnClick(); _isModalOpen.value = false; props?.secondaryButtonOnClick?.(); }; const onCloseButtonClick = ( event: React.MouseEvent, ) => { picker.onCloseButtonClick(); _isModalOpen.value = false; props?.onCloseButtonClick?.(event); }; const { collection: { translate: t }, } = picker; const selectedValue = picker.collection.bulkSelect.selectedValues?.[0]; const hasAdditionalStep = React.useMemo( () => selectedValue && props?.hasAdditionalStep?.({ item: selectedValue, }), [selectedValue, props?.hasAdditionalStep], ); if (isAutoAdditionalStepPending) { return ( ); } return isAdditionalStepShown ? ( { picker.onBackButtonClick(); setIsAdditionalStepShown(false); backButtonOnClick?.({ item: selectedValue }); }} primaryButtonOnClick={() => { primaryOnClick({ currentLevel: 2, numLevels: 2 }); }} secondaryButtonOnClick={secondaryOnClick} onCloseButtonClick={onCloseButtonClick} /> ) : ( { if ( // currently additional step supports only single selection !fromMultipleSelectionToBoolean(props?.multiple) && hasAdditionalStep && selectedValue ) { picker.onContinueButtonClick(); setIsAdditionalStepShown(true); continueButtonOnClick?.({ item: selectedValue }); } else { primaryOnClick({ currentLevel: 1, numLevels: 1 }); } }} primaryButtonText={ hasAdditionalStep ? t('cairo.continue') : props.primaryButtonText || t('cairo.continue') } secondaryButtonOnClick={secondaryOnClick} renderPickerContent={renderPickerContent} onCloseButtonClick={onCloseButtonClick} /> ); } export const PickerContentWrapped = observer(_PickerContentWrapped);