@woocommerce/data
Version:
WooCommerce Admin data store and utilities
43 lines (42 loc) • 1.6 kB
JavaScript
/**
* External dependencies
*/
import { createHigherOrderComponent } from '@wordpress/compose';
import { useDispatch, useSelect } from '@wordpress/data';
import { createElement, useRef, useEffect } from '@wordpress/element';
/**
* Internal dependencies
*/
import { STORE_NAME } from './constants';
export const withSettingsHydration = (group, settings) => createHigherOrderComponent((OriginalComponent) => (props) => {
const settingsRef = useRef(settings);
const { startResolution, finishResolution, updateSettingsForGroup, clearIsDirty, } = useDispatch(STORE_NAME);
const { isResolvingGroup, hasFinishedResolutionGroup } = useSelect((select) => {
const { isResolving, hasFinishedResolution } = select(STORE_NAME);
return {
isResolvingGroup: isResolving('getSettings', [
group,
]),
hasFinishedResolutionGroup: hasFinishedResolution('getSettings', [group]),
};
}, []);
useEffect(() => {
if (!settingsRef.current) {
return;
}
if (!isResolvingGroup && !hasFinishedResolutionGroup) {
startResolution('getSettings', [group]);
updateSettingsForGroup(group, settingsRef.current);
clearIsDirty(group);
finishResolution('getSettings', [group]);
}
}, [
isResolvingGroup,
hasFinishedResolutionGroup,
finishResolution,
updateSettingsForGroup,
startResolution,
clearIsDirty,
]);
return createElement(OriginalComponent, { ...props });
}, 'withSettingsHydration');