woocommerce/plugins/woocommerce-blocks/assets/js/blocks/shared/scripts/migration-utils.tsx

87 lines
2.5 KiB
TypeScript

/**
* External dependencies
*/
import { getSettingWithCoercion } from '@woocommerce/settings';
import { type BlockInstance } from '@wordpress/blocks';
import { select } from '@wordpress/data';
import { isBoolean } from '@woocommerce/types';
type GetBlocksClientIds = ( blocks: BlockInstance[] ) => string[];
export type IsBlockType = ( block: BlockInstance ) => boolean;
export type TransformBlock = (
block: BlockInstance,
innerBlock: BlockInstance[]
) => BlockInstance;
export type ProductGridLayoutTypes = 'flex' | 'list';
export type PostTemplateLayoutTypes = 'grid' | 'default';
export type ProductGridLayout = {
type: ProductGridLayoutTypes;
columns: number;
};
export type PostTemplateLayout = {
type: PostTemplateLayoutTypes;
columnCount: number;
};
const isProductsBlock: IsBlockType = ( block ) =>
block.name === 'core/query' &&
block.attributes.namespace === 'woocommerce/product-query';
const isProductCollectionBlock: IsBlockType = ( block ) =>
block.name === 'woocommerce/product-collection';
const getBlockClientIdsByPredicate = (
blocks: BlockInstance[],
predicate: ( block: BlockInstance ) => boolean
): string[] => {
let clientIds: string[] = [];
blocks.forEach( ( block ) => {
if ( predicate( block ) ) {
clientIds = [ ...clientIds, block.clientId ];
}
clientIds = [
...clientIds,
...getBlockClientIdsByPredicate( block.innerBlocks, predicate ),
];
} );
return clientIds;
};
const getProductsBlockClientIds: GetBlocksClientIds = ( blocks ) =>
getBlockClientIdsByPredicate( blocks, isProductsBlock );
const getProductCollectionBlockClientIds: GetBlocksClientIds = ( blocks ) =>
getBlockClientIdsByPredicate( blocks, isProductCollectionBlock );
const checkIfBlockCanBeInserted = (
clientId: string,
blockToBeInserted: string
) => {
// We need to duplicate checks that are happening within replaceBlocks method
// as replacement is initially blocked and there's no information returned
// that would determine if replacement happened or not.
// https://github.com/WordPress/gutenberg/issues/46740
const rootClientId =
select( 'core/block-editor' ).getBlockRootClientId( clientId ) ||
undefined;
return select( 'core/block-editor' ).canInsertBlockType(
blockToBeInserted,
rootClientId
);
};
const postTemplateHasSupportForGridView = getSettingWithCoercion(
'post_template_has_support_for_grid_view',
false,
isBoolean
);
export {
getProductsBlockClientIds,
getProductCollectionBlockClientIds,
checkIfBlockCanBeInserted,
postTemplateHasSupportForGridView,
};