import { PickerModalState } from '../../hooks'; import React, { ReactElement, ReactNode, useMemo } from 'react'; import { FiltersMap } from '@wix/bex-core'; import { PromiseStatusError } from '@wix/bex-utils'; import { Box, CustomModalLayout, CustomModalLayoutProps, Loader, } from '@wix/design-system'; import { useReactive } from '@wix/bex-utils/react'; export interface PickerModalSplashProps extends Partial { state: PickerModalState; renderError: (params: { err: unknown; isOnline: boolean }) => ReactElement; } export function PickerModalSplash( props: PickerModalSplashProps, ) { const { state, renderError, onCloseButtonClick, ...rest } = props; const { minContentHeight, fetchPickerComponent, fetchFirstPage, fetchInitialProps, _isModalOpen, } = state; const fetchPickerComponentStatus = useReactive(fetchPickerComponent.status); const fetchFirstPageStatus = useReactive(fetchFirstPage.status); const fetchInitialPropsStatus = useReactive(fetchInitialProps.status); const fetchStatuses = useMemo( () => [ fetchPickerComponentStatus, fetchFirstPageStatus, fetchInitialPropsStatus, ], [fetchPickerComponentStatus, fetchFirstPageStatus, fetchInitialPropsStatus], ); const errorStatus = useMemo(() => { return fetchStatuses.find( (status): status is PromiseStatusError => status.type === 'error', ); }, [fetchStatuses]); const isFetching = useMemo(() => { return fetchStatuses.some( (status) => status.type === 'loading' || status.type === 'idle', ); }, [fetchStatuses]); let child: ReactNode; if (errorStatus) { child = renderError({ err: errorStatus.error, isOnline: true, }); child = ( {child} ); } else if (isFetching) { child = ( ); } return ( { _isModalOpen.value = false; onCloseButtonClick?.(event); }, autoFocus: true, }} {...rest} > {child} ); }