Use current email content when previewing templates when swapping

[MAILPOET-6336]
This commit is contained in:
Rostislav Wolny
2024-12-04 13:59:51 +01:00
committed by Rostislav Wolný
parent 1fdda485d3
commit 10b2c2b648
4 changed files with 50 additions and 25 deletions

View File

@ -23,8 +23,11 @@ import { EditTemplateModal } from './edit-template-modal';
import { SelectTemplateModal } from '../template-select'; import { SelectTemplateModal } from '../template-select';
export function EmailTypeInfo() { export function EmailTypeInfo() {
const template = useSelect( const { template, currentEmailContent } = useSelect(
( select ) => select( storeName ).getCurrentTemplate(), ( select ) => ( {
template: select( storeName ).getCurrentTemplate(),
currentEmailContent: select( storeName ).getEditedEmailContent(),
} ),
[] []
); );
const [ isEditTemplateModalOpen, setEditTemplateModalOpen ] = const [ isEditTemplateModalOpen, setEditTemplateModalOpen ] =
@ -113,6 +116,7 @@ export function EmailTypeInfo() {
setSelectTemplateModalOpen( false ) setSelectTemplateModalOpen( false )
} }
closeCallback={ () => setSelectTemplateModalOpen( false ) } closeCallback={ () => setSelectTemplateModalOpen( false ) }
previewContent={ currentEmailContent }
/> />
) } ) }
</> </>

View File

@ -20,15 +20,20 @@ const BLANK_TEMPLATE = 'email-general';
export function SelectTemplateModal( { export function SelectTemplateModal( {
onSelectCallback, onSelectCallback,
closeCallback = null, closeCallback = null,
previewContent = '',
} ) { } ) {
const [ templates ] = usePreviewTemplates(); const [ templates ] = usePreviewTemplates( previewContent );
const hasTemplates = templates?.length > 0; const hasTemplates = templates?.length > 0;
const handleTemplateSelection = ( template: TemplatePreview ) => { const handleTemplateSelection = ( template: TemplatePreview ) => {
// When we provide previewContent, we don't want to reset the blocks
if ( ! previewContent ) {
void dispatch( editorStore ).resetEditorBlocks( void dispatch( editorStore ).resetEditorBlocks(
template.patternParsed template.emailParsed
); );
}
void dispatch( storeName ).setTemplateToPost( void dispatch( storeName ).setTemplateToPost(
template.slug, template.slug,
template.template.mailpoet_email_theme ?? {} template.template.mailpoet_email_theme ?? {}
@ -100,7 +105,9 @@ export function SelectTemplateModal( {
} }
> >
<BlockPreview <BlockPreview
blocks={ template.contentParsed } blocks={
template.previewContentParsed
}
viewportWidth={ 900 } viewportWidth={ 900 }
minHeight={ 300 } minHeight={ 300 }
additionalStyles={ [ additionalStyles={ [

View File

@ -34,7 +34,9 @@ function setPostContentInnerBlocks(
} ); } );
} }
export function usePreviewTemplates(): TemplatePreview[][] { export function usePreviewTemplates(
customEmailContent = ''
): TemplatePreview[][] {
const { templates, patterns } = useSelect( ( select ) => { const { templates, patterns } = useSelect( ( select ) => {
const contentBlockId = const contentBlockId =
// @ts-expect-error getBlocksByName is not defined in types // @ts-expect-error getBlocksByName is not defined in types
@ -52,23 +54,35 @@ export function usePreviewTemplates(): TemplatePreview[][] {
}; };
}, [] ); }, [] );
if ( ! templates || ! patterns.length ) { if ( ! templates || ( ! patterns.length && ! customEmailContent ) ) {
return [ [] ]; return [ [] ];
} }
let contentPatternBlocksGeneral = null;
let contentPatternBlocks = null;
const parsedCustomEmailContent =
customEmailContent && parse( customEmailContent );
// If there is a custom email content passed from outside we use it as email content for preview
// otherwise we pick first suitable from patterns
if ( parsedCustomEmailContent ) {
contentPatternBlocksGeneral = parsedCustomEmailContent;
contentPatternBlocks = parsedCustomEmailContent;
} else {
// Pick first pattern that comes from mailpoet and is for general email template // Pick first pattern that comes from mailpoet and is for general email template
const contentPatternBlocksGeneral = patterns.find( contentPatternBlocksGeneral = patterns.find(
( pattern ) => ( pattern ) =>
// eslint-disable-next-line @typescript-eslint/no-unsafe-return // eslint-disable-next-line @typescript-eslint/no-unsafe-return
pattern?.templateTypes?.includes( 'email-general-template' ) pattern?.templateTypes?.includes( 'email-general-template' )
)?.blocks as BlockInstance[]; )?.blocks as BlockInstance[];
// Pick first pattern that comes from mailpoet and is for template with header and footer content separated // Pick first pattern that comes from mailpoet and is for template with header and footer content separated
const contentPatternBlocks = patterns.find( contentPatternBlocks = patterns.find(
( pattern ) => ( pattern ) =>
// eslint-disable-next-line @typescript-eslint/no-unsafe-return // eslint-disable-next-line @typescript-eslint/no-unsafe-return
pattern?.templateTypes?.includes( 'email-template' ) pattern?.templateTypes?.includes( 'email-template' )
)?.blocks as BlockInstance[]; )?.blocks as BlockInstance[];
}
return [ return [
templates.map( ( template: EmailTemplatePreview ): TemplatePreview => { templates.map( ( template: EmailTemplatePreview ): TemplatePreview => {
@ -83,8 +97,8 @@ export function usePreviewTemplates(): TemplatePreview[][] {
return { return {
slug: template.slug, slug: template.slug,
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
contentParsed: parsedTemplate, previewContentParsed: parsedTemplate,
patternParsed: emailParsed:
template.slug === 'email-general' template.slug === 'email-general'
? contentPatternBlocksGeneral ? contentPatternBlocksGeneral
: contentPatternBlocks, : contentPatternBlocks,

View File

@ -225,8 +225,8 @@ export type EmailTemplatePreview = Omit<
export type TemplatePreview = { export type TemplatePreview = {
slug: string; slug: string;
contentParsed: BlockInstance[]; previewContentParsed: BlockInstance[];
patternParsed: BlockInstance[]; emailParsed: BlockInstance[];
template: EmailTemplatePreview; template: EmailTemplatePreview;
}; };