@woocommerce/data
Version:
WooCommerce Admin data store and utilities
37 lines (36 loc) • 1.32 kB
JavaScript
/**
* External dependencies
*/
import { createHigherOrderComponent } from '@wordpress/compose';
import { useSelect, useDispatch } from '@wordpress/data';
import { createElement, useEffect } from '@wordpress/element';
/**
* Internal dependencies
*/
import { STORE_NAME } from './constants';
/**
* Higher-order component used to hydrate navigation data.
*
* @param {Object} data Data object with menu items and site information.
* @param {MenuItem[]} data.menuItems Menu items to hydrate.
*/
export const withNavigationHydration = (data) => createHigherOrderComponent((OriginalComponent) => (props) => {
const shouldHydrate = useSelect((select) => {
if (!data) {
return;
}
const { isResolving, hasFinishedResolution } = select(STORE_NAME);
return (!isResolving('getMenuItems') &&
!hasFinishedResolution('getMenuItems'));
});
const { startResolution, finishResolution, setMenuItems } = useDispatch(STORE_NAME);
useEffect(() => {
if (!shouldHydrate) {
return;
}
startResolution('getMenuItems', []);
setMenuItems(data.menuItems);
finishResolution('getMenuItems', []);
}, [shouldHydrate]);
return createElement(OriginalComponent, { ...props });
}, 'withNavigationHydration');