47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { getBlockTypes } from '@wordpress/blocks';
|
|
import { applyCheckoutFilter } from '@woocommerce/blocks-checkout';
|
|
import { CART_STORE_KEY } from '@woocommerce/block-data';
|
|
import { select } from '@wordpress/data';
|
|
|
|
// List of core block types to allow in inner block areas.
|
|
const coreBlockTypes = [ 'core/paragraph', 'core/image', 'core/separator' ];
|
|
|
|
/**
|
|
* Gets a list of allowed blocks types under a specific parent block type.
|
|
*/
|
|
export const getAllowedBlocks = ( block: string ): string[] => {
|
|
const additionalCartCheckoutInnerBlockTypes = applyCheckoutFilter( {
|
|
filterName: 'additionalCartCheckoutInnerBlockTypes',
|
|
defaultValue: [],
|
|
extensions: select( CART_STORE_KEY ).getCartData().extensions,
|
|
arg: { block },
|
|
validation: ( value ) => {
|
|
if (
|
|
Array.isArray( value ) &&
|
|
value.every( ( item ) => typeof item === 'string' )
|
|
) {
|
|
return true;
|
|
}
|
|
throw new Error(
|
|
'allowedBlockTypes filters must return an array of strings.'
|
|
);
|
|
},
|
|
} );
|
|
|
|
// Convert to set here so that we remove duplicated block types.
|
|
return Array.from(
|
|
new Set( [
|
|
...getBlockTypes()
|
|
.filter( ( blockType ) =>
|
|
( blockType?.parent || [] ).includes( block )
|
|
)
|
|
.map( ( { name } ) => name ),
|
|
...coreBlockTypes,
|
|
...additionalCartCheckoutInnerBlockTypes,
|
|
] )
|
|
);
|
|
};
|