woocommerce/plugins/woocommerce-blocks/assets/js/blocks-registry/register-inner-block.js

44 lines
1.5 KiB
JavaScript

/**
* Internal dependencies
*/
import { registeredBlocks } from './registered-blocks-init';
/**
* Asserts that an option is of the given type. Otherwise, throws an error.
*
* @throws Will throw an error if the type of the option doesn't match the expected type.
* @param {Object} options Object containing the option to validate.
* @param {string} optionName Name of the option to validate.
* @param {string} expectedType Type expected for the option.
*/
const assertOption = ( options, optionName, expectedType ) => {
if ( typeof options[ optionName ] !== expectedType ) {
throw new Error(
`Incorrect value for the ${ optionName } argument when registering an inner block. It must be a ${ expectedType }.`
);
}
};
/**
* Registers an inner block that can be added as a child of another block.
*
* @export
* @param {Object} options Options to use when registering the block.
* @param {string} options.main Name of the parent block.
* @param {string} options.blockName Name of the child block being registered.
* @param {Function} options.component React component used to render the child block.
*/
export function registerInnerBlock( options ) {
assertOption( options, 'main', 'string' );
assertOption( options, 'blockName', 'string' );
assertOption( options, 'component', 'function' );
const { main, blockName, component } = options;
if ( ! registeredBlocks[ main ] ) {
registeredBlocks[ main ] = {};
}
registeredBlocks[ main ][ blockName ] = component;
}