UNPKG

@woocommerce/data

Version:
51 lines (50 loc) 1.98 kB
/** * External dependencies */ import { createHigherOrderComponent } from '@wordpress/compose'; import { useDispatch, useSelect } from '@wordpress/data'; import { createElement, useEffect, useRef } from '@wordpress/element'; /** * Internal dependencies */ import { STORE_NAME } from './constants'; export const withOnboardingHydration = (data) => { let hydratedProfileItems = false; return createHigherOrderComponent((OriginalComponent) => (props) => { const onboardingRef = useRef(data); const { isResolvingGroup, hasFinishedResolutionGroup } = useSelect((select) => { const { isResolving, hasFinishedResolution } = select(STORE_NAME); return { isResolvingGroup: isResolving('getProfileItems', []), hasFinishedResolutionGroup: hasFinishedResolution('getProfileItems', []), }; }); const { startResolution, finishResolution, setProfileItems } = useDispatch(STORE_NAME); useEffect(() => { if (!onboardingRef.current) { return; } const { profileItems } = onboardingRef.current; if (!profileItems) { return; } if (profileItems && !hydratedProfileItems && // Ensure that profile items have finished resolving to prevent race conditions !isResolvingGroup && !hasFinishedResolutionGroup) { startResolution('getProfileItems', []); setProfileItems(profileItems, true); finishResolution('getProfileItems', []); hydratedProfileItems = true; } }, [ finishResolution, setProfileItems, startResolution, isResolvingGroup, hasFinishedResolutionGroup, ]); return createElement(OriginalComponent, { ...props }); }, 'withOnboardingHydration'); };