woocommerce/plugins/woocommerce-blocks/assets/js/hocs/with-store-cart-api-hydrati...

58 lines
1.4 KiB
JavaScript

/**
* External dependencies
*/
import { useRef } from '@wordpress/element';
import { getSetting } from '@woocommerce/settings';
import { CART_STORE_KEY } from '@woocommerce/block-data';
import { useSelect } from '@wordpress/data';
/**
* Hydrate Cart API data.
*
* Makes cart data available without an API request to wc/store/cart/.
*/
const useStoreCartApiHydration = () => {
const cartData = useRef( getSetting( 'cartData' ) );
useSelect( ( select, registry ) => {
if ( ! cartData.current ) {
return;
}
const { isResolving, hasFinishedResolution } = select( CART_STORE_KEY );
const {
receiveCart,
receiveError,
startResolution,
finishResolution,
} = registry.dispatch( CART_STORE_KEY );
if (
! isResolving( 'getCartData', [] ) &&
! hasFinishedResolution( 'getCartData', [] )
) {
startResolution( 'getCartData', [] );
if ( cartData.current?.code?.includes( 'error' ) ) {
receiveError( cartData.current );
} else {
receiveCart( cartData.current );
}
finishResolution( 'getCartData', [] );
}
}, [] );
};
/**
* HOC that calls the useStoreCartApiHydration hook.
*
* @param {Function} OriginalComponent Component being wrapped.
*/
const withStoreCartApiHydration = ( OriginalComponent ) => {
return ( props ) => {
useStoreCartApiHydration();
return <OriginalComponent { ...props } />;
};
};
export default withStoreCartApiHydration;