/**
* External dependencies
*/
import { useStoreProducts } from '@woocommerce/base-context/hooks';
import {
ProductDataContextProvider,
useProductDataContext,
} from '@woocommerce/shared-context';
const getProductById = ( products, id ) =>
products.find( ( product ) => product.id === id );
/**
* Loads the product from the API and adds to the context provider.
*
* @param {Object} props Component props.
*/
const OriginalComponentWithContext = ( props ) => {
const { productId, OriginalComponent, postId, product } = props;
const id = props?.isDescendentOfQueryLoop ? postId : productId;
const { products, productsLoading } = useStoreProducts( {
include: id,
} );
const productFromAPI = {
product:
id > 0 && products.length > 0
? getProductById( products, id )
: null,
isLoading: productsLoading,
};
if ( product ) {
return (
);
}
return (
);
};
/**
* This HOC sees if the Block is wrapped in Product Data Context, and if not, wraps it with context
* based on the productId attribute, if set.
*
* @param {Function} OriginalComponent Component being wrapped.
*/
export const withProductDataContext = ( OriginalComponent ) => {
return ( props ) => {
const productDataContext = useProductDataContext();
// If a product prop was provided, use this as the context for the tree.
if ( !! props.product || ! productDataContext.hasContext ) {
return (
);
}
return ;
};
};