woocommerce/plugins/woocommerce-blocks/assets/js/blocks/classic-template/utils.ts

109 lines
2.7 KiB
TypeScript

/**
* External dependencies
*/
import {
type Block,
type BlockInstance,
getBlockType,
createBlock,
} from '@wordpress/blocks';
/**
* Internal dependencies
*/
import { TEMPLATES } from './constants';
import { TemplateDetails, InheritedAttributes } from './types';
// Finds the most appropriate template details object for specific template keys such as single-product-hoodie.
export function getTemplateDetailsBySlug(
parsedTemplate: string,
templates: TemplateDetails
) {
const templateKeys = Object.keys( templates );
let templateDetails = null;
for ( let i = 0; templateKeys.length > i; i++ ) {
const keyToMatch = parsedTemplate.substr( 0, templateKeys[ i ].length );
const maybeTemplate = templates[ keyToMatch ];
if ( maybeTemplate ) {
templateDetails = maybeTemplate;
break;
}
}
return templateDetails;
}
export function isClassicTemplateBlockRegisteredWithAnotherTitle(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
block: Block< any > | undefined,
parsedTemplate: string
) {
const templateDetails = getTemplateDetailsBySlug(
parsedTemplate,
TEMPLATES
);
return block?.title !== templateDetails?.title;
}
export function hasTemplateSupportForClassicTemplateBlock(
parsedTemplate: string,
templates: TemplateDetails
): boolean {
return getTemplateDetailsBySlug( parsedTemplate, templates ) ? true : false;
}
export const createArchiveTitleBlock = (
variationName: string,
inheritedAttributes: InheritedAttributes
) => {
const queryTitleBlockName = 'core/query-title';
const queryTitleBlockVariations =
getBlockType( queryTitleBlockName )?.variations || [];
const archiveTitleVariation = queryTitleBlockVariations.find(
( { name }: { name: string } ) => name === variationName
);
if ( ! archiveTitleVariation ) {
return null;
}
const { attributes } = archiveTitleVariation;
const extendedAttributes = {
...attributes,
...inheritedAttributes,
showPrefix: false,
};
return createBlock( queryTitleBlockName, extendedAttributes );
};
export const createRowBlock = (
innerBlocks: Array< BlockInstance >,
inheritedAttributes: InheritedAttributes
) => {
const groupBlockName = 'core/group';
const rowVariationName = `group-row`;
const groupBlockVariations =
getBlockType( groupBlockName )?.variations || [];
const rowVariation = groupBlockVariations.find(
( { name }: { name: string } ) => name === rowVariationName
);
if ( ! rowVariation ) {
return null;
}
const { attributes } = rowVariation;
const extendedAttributes = {
...attributes,
...inheritedAttributes,
layout: {
...attributes.layout,
justifyContent: 'space-between',
},
};
return createBlock( groupBlockName, extendedAttributes, innerBlocks );
};