2023-09-19 05:54:19 +00:00
|
|
|
/* eslint-disable @woocommerce/dependency-group */
|
|
|
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import { useMemo } from '@wordpress/element';
|
|
|
|
import { parse } from '@wordpress/blocks';
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
|
|
|
import { usePatterns, Pattern, PatternWithBlocks } from './use-patterns';
|
|
|
|
|
|
|
|
// TODO: It might be better to create an API endpoint to get the templates.
|
2023-09-21 05:30:57 +00:00
|
|
|
export const LARGE_BUSINESS_TEMPLATES = {
|
2023-09-19 05:54:19 +00:00
|
|
|
template1: [
|
|
|
|
'a8c/cover-image-with-left-aligned-call-to-action',
|
|
|
|
'woocommerce-blocks/featured-products-5-item-grid',
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'woocommerce-blocks/featured-category-triple',
|
|
|
|
'a8c/3-column-testimonials',
|
|
|
|
'a8c/quotes-2',
|
|
|
|
'woocommerce-blocks/social-follow-us-in-social-media',
|
|
|
|
],
|
|
|
|
template2: [
|
|
|
|
'woocommerce-blocks/hero-product-split',
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'woocommerce-blocks/featured-category-triple',
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'a8c/three-columns-with-images-and-text',
|
|
|
|
'woocommerce-blocks/testimonials-3-columns',
|
|
|
|
'a8c/subscription',
|
|
|
|
],
|
|
|
|
template3: [
|
|
|
|
'a8c/call-to-action-7',
|
|
|
|
'a8c/3-column-testimonials',
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'woocommerce-blocks/featured-category-cover-image',
|
|
|
|
'woocommerce-blocks/featured-products-5-item-grid',
|
|
|
|
'woocommerce-blocks/featured-products-5-item-grid',
|
|
|
|
'woocommerce-blocks/social-follow-us-in-social-media',
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
2023-09-21 05:30:57 +00:00
|
|
|
export const SMALL_MEDIUM_BUSINESS_TEMPLATES = {
|
2023-09-19 05:54:19 +00:00
|
|
|
template1: [
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'woocommerce-blocks/testimonials-single',
|
|
|
|
'woocommerce-blocks/hero-product-3-split',
|
|
|
|
'a8c/contact-8',
|
|
|
|
],
|
|
|
|
template2: [
|
|
|
|
'a8c/about-me-4',
|
|
|
|
'a8c/product-feature-with-buy-button',
|
|
|
|
'woocommerce-blocks/featured-products-fresh-and-tasty',
|
|
|
|
'a8c/subscription',
|
|
|
|
'woocommerce-blocks/testimonials-3-columns',
|
|
|
|
'a8c/contact-with-map-on-the-left',
|
|
|
|
],
|
|
|
|
template3: [
|
|
|
|
'a8c/heading-and-video',
|
|
|
|
'a8c/3-column-testimonials',
|
|
|
|
'woocommerce-blocks/product-hero',
|
|
|
|
'a8c/quotes-2',
|
|
|
|
'a8c/product-feature-with-buy-button',
|
|
|
|
'a8c/simple-two-column-layout',
|
|
|
|
'woocommerce-blocks/social-follow-us-in-social-media',
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
2023-09-21 01:47:59 +00:00
|
|
|
const TEMPLATES = {
|
|
|
|
template1: LARGE_BUSINESS_TEMPLATES.template1,
|
|
|
|
template2: LARGE_BUSINESS_TEMPLATES.template2,
|
|
|
|
template3: LARGE_BUSINESS_TEMPLATES.template3,
|
|
|
|
template4: SMALL_MEDIUM_BUSINESS_TEMPLATES.template1,
|
|
|
|
template5: SMALL_MEDIUM_BUSINESS_TEMPLATES.template2,
|
|
|
|
template6: SMALL_MEDIUM_BUSINESS_TEMPLATES.template3,
|
|
|
|
};
|
|
|
|
|
2023-09-21 05:30:57 +00:00
|
|
|
export const getTemplatePatterns = (
|
2023-09-19 05:54:19 +00:00
|
|
|
template: string[],
|
|
|
|
patternsByName: Record< string, Pattern >
|
|
|
|
) =>
|
|
|
|
template
|
|
|
|
.map( ( patternName: string ) => {
|
|
|
|
const pattern = patternsByName[ patternName ];
|
|
|
|
if ( pattern && pattern.content ) {
|
|
|
|
return {
|
|
|
|
...pattern,
|
|
|
|
// @ts-ignore - Passing options is valid, but not in the type.
|
|
|
|
blocks: parse( pattern.content, {
|
|
|
|
__unstableSkipMigrationLogs: true,
|
|
|
|
} ),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
} )
|
|
|
|
.filter( ( pattern ) => pattern !== null ) as PatternWithBlocks[];
|
|
|
|
|
2023-09-21 05:30:57 +00:00
|
|
|
export const patternsToNameMap = ( blockPatterns: Pattern[] ) =>
|
|
|
|
blockPatterns.reduce(
|
|
|
|
( acc: Record< string, Pattern >, pattern: Pattern ) => {
|
|
|
|
acc[ pattern.name ] = pattern;
|
|
|
|
return acc;
|
|
|
|
},
|
|
|
|
{}
|
|
|
|
);
|
|
|
|
|
2023-09-19 05:54:19 +00:00
|
|
|
export const useHomeTemplates = () => {
|
|
|
|
const { blockPatterns, isLoading } = usePatterns();
|
|
|
|
|
2023-09-21 05:30:57 +00:00
|
|
|
const patternsByName = useMemo(
|
|
|
|
() => patternsToNameMap( blockPatterns ),
|
|
|
|
[ blockPatterns ]
|
|
|
|
);
|
2023-09-19 05:54:19 +00:00
|
|
|
|
|
|
|
const homeTemplates = useMemo( () => {
|
|
|
|
if ( isLoading ) return {};
|
2023-09-21 01:47:59 +00:00
|
|
|
const recommendedTemplates = TEMPLATES;
|
2023-09-19 05:54:19 +00:00
|
|
|
|
|
|
|
return Object.entries( recommendedTemplates ).reduce(
|
|
|
|
(
|
|
|
|
acc: Record< string, PatternWithBlocks[] >,
|
|
|
|
[ templateName, template ]
|
|
|
|
) => {
|
|
|
|
if ( templateName in recommendedTemplates ) {
|
|
|
|
acc[ templateName ] = getTemplatePatterns(
|
|
|
|
template,
|
|
|
|
patternsByName
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return acc;
|
|
|
|
},
|
|
|
|
{}
|
|
|
|
);
|
|
|
|
}, [ isLoading, patternsByName ] );
|
|
|
|
|
|
|
|
return {
|
|
|
|
homeTemplates,
|
|
|
|
isLoading,
|
|
|
|
};
|
|
|
|
};
|