diff --git a/mailpoet/assets/js/src/email_editor/engine/components/layout_styles.tsx b/mailpoet/assets/js/src/email_editor/engine/components/layout_styles.tsx
new file mode 100644
index 0000000000..f5fbf6c31f
--- /dev/null
+++ b/mailpoet/assets/js/src/email_editor/engine/components/layout_styles.tsx
@@ -0,0 +1,25 @@
+import { useSelect } from '@wordpress/data';
+import { store as editorStore } from '@wordpress/editor';
+import { EmailData } from 'email_editor/engine/types';
+
+export function LayoutStyles() {
+ const { emailData } = useSelect((select) => ({
+ emailData:
+ (select(editorStore).getEditedPostAttribute(
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ // The getEditedPostAttribute accepts an attribute but typescript thinks it doesn't
+ 'email_data',
+ ) as EmailData) ?? null,
+ }));
+
+ const css = `
+ .edit-post-visual-editor__content-area {
+ max-width: ${emailData.layout_styles.width}px;
+ }
+ .edit-post-visual-editor {
+ background: ${emailData.layout_styles.background};
+ }`;
+
+ return ;
+}
diff --git a/mailpoet/assets/js/src/email_editor/engine/types.ts b/mailpoet/assets/js/src/email_editor/engine/types.ts
new file mode 100644
index 0000000000..69eaed4c49
--- /dev/null
+++ b/mailpoet/assets/js/src/email_editor/engine/types.ts
@@ -0,0 +1,6 @@
+export type EmailData = {
+ layout_styles: {
+ width: number;
+ background: string;
+ };
+};
diff --git a/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.scss b/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.scss
index 4c7ad49897..52154674f2 100644
--- a/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.scss
+++ b/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.scss
@@ -10,11 +10,6 @@
flex-grow: 0;
height: auto;
margin: 0 auto;
- max-width: 660px;
- }
-
- .edit-post-visual-editor {
- background: #ccc;
}
// We don't use the huge title input in the email editor
diff --git a/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.tsx b/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.tsx
index 255adbaefa..14a9ed69c6 100644
--- a/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.tsx
+++ b/mailpoet/assets/js/src/email_editor/integrations/MailPoet/email_editor.tsx
@@ -3,6 +3,7 @@ import { useSelect, select as directSelect } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';
import { store as editorStore } from '@wordpress/editor';
import { NextButtonSlot } from 'email_editor/engine/components/next_button_slot';
+import { LayoutStyles } from 'email_editor/engine/components/layout_styles';
import { useDisableWelcomeGuide } from 'email_editor/engine/hooks';
import { NextButton } from './components/next_button';
import { MailPoetEmailData } from './types';
@@ -28,9 +29,12 @@ function Editor() {
useDisableWelcomeGuide();
return (
-
-
-
+ <>
+
+
+
+
+ >
);
}
diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php
index bcfba5c3c9..e233a0a01d 100644
--- a/mailpoet/lib/DI/ContainerConfigurator.php
+++ b/mailpoet/lib/DI/ContainerConfigurator.php
@@ -315,6 +315,7 @@ class ContainerConfigurator implements IContainerConfigurator {
// Email Editor
$container->autowire(\MailPoet\EmailEditor\Engine\EmailEditor::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\AssetsCleaner::class)->setPublic(true);
+ $container->autowire(\MailPoet\EmailEditor\Engine\EmailApiController::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\Renderer::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\BlocksRenderer::class)->setPublic(true);
$container->autowire(\MailPoet\EmailEditor\Engine\Renderer\BlocksRegistry::class)->setPublic(true);
diff --git a/mailpoet/lib/EmailEditor/Engine/EmailApiController.php b/mailpoet/lib/EmailEditor/Engine/EmailApiController.php
new file mode 100644
index 0000000000..3fb9ec4921
--- /dev/null
+++ b/mailpoet/lib/EmailEditor/Engine/EmailApiController.php
@@ -0,0 +1,41 @@
+stylesController = $stylesController;
+ }
+
+ /**
+ * @return array - Email specific data such styles.
+ */
+ public function getEmailData(): array {
+ return [
+ 'layout_styles' => $this->stylesController->getEmailLayoutStyles(),
+ ];
+ }
+
+ /**
+ * Update Email specific data we store.
+ */
+ public function saveEmailData(array $data, \WP_Post $emailPost): void {
+ // Here comes code saving of Email specific data that will be passed on 'email_data' attribute
+ }
+
+ public function getEmailDataSchema(): array {
+ return Builder::object([
+ 'layout_styles' => Builder::object([
+ 'width' => Builder::integer(),
+ 'background' => Builder::string(),
+ ]),
+ ])->toArray();
+ }
+}
diff --git a/mailpoet/lib/EmailEditor/Engine/EmailEditor.php b/mailpoet/lib/EmailEditor/Engine/EmailEditor.php
index 8284a603ef..3374acdc61 100644
--- a/mailpoet/lib/EmailEditor/Engine/EmailEditor.php
+++ b/mailpoet/lib/EmailEditor/Engine/EmailEditor.php
@@ -15,15 +15,20 @@ class EmailEditor {
/** @var StylesController */
private $stylesController;
+ /** @var EmailApiController */
+ private $emailApiController;
+
/**
* @param AssetsCleaner $assetsCleaner
*/
public function __construct(
AssetsCleaner $assetsCleaner,
- StylesController $stylesController
+ StylesController $stylesController,
+ EmailApiController $emailApiController
) {
$this->assetsCleaner = $assetsCleaner;
$this->stylesController = $stylesController;
+ $this->emailApiController = $emailApiController;
}
public function initialize(): void {
@@ -32,6 +37,7 @@ class EmailEditor {
add_filter('block_editor_settings_all', [$this, 'updateBlockEditorSettings'], 100, 2);
do_action('mailpoet_email_editor_initialized');
$this->registerEmailPostTypes();
+ $this->extendEmailPostApi();
}
/**
@@ -89,6 +95,15 @@ class EmailEditor {
$this->assetsCleaner->cleanupBlockEditorAssets();
}
+ public function extendEmailPostApi() {
+ $emailPostTypes = array_column($this->getPostTypes(), 'name');
+ register_rest_field($emailPostTypes, 'email_data', [
+ 'get_callback' => [$this->emailApiController, 'getEmailData'],
+ 'update_callback' => [$this->emailApiController, 'saveEmailData'],
+ 'schema' => $this->emailApiController->getEmailDataSchema(),
+ ]);
+ }
+
public function updateBlockEditorSettings(array $settings, \WP_Block_Editor_Context $blockEditorContext): array {
$emailPostTypes = array_column($this->getPostTypes(), 'name');
if (!$blockEditorContext->post || !in_array($blockEditorContext->post->post_type, $emailPostTypes, true)) {
diff --git a/mailpoet/lib/EmailEditor/Integrations/MailPoet/EmailEditor.php b/mailpoet/lib/EmailEditor/Integrations/MailPoet/EmailEditor.php
index 5a50ec4502..4a04d33ea1 100644
--- a/mailpoet/lib/EmailEditor/Integrations/MailPoet/EmailEditor.php
+++ b/mailpoet/lib/EmailEditor/Integrations/MailPoet/EmailEditor.php
@@ -11,24 +11,6 @@ use MailPoet\WP\Functions as WPFunctions;
class EmailEditor {
const MAILPOET_EMAIL_POST_TYPE = 'mailpoet_email';
- /**
- * Default styles applied to the email. These are going to be replaced by style settings.
- * This is currently more af a proof of concept that we can apply styles to the email.
- * In the future we will probably add some sort of StylesController that will fetch/build styles for specific email.
- * @var string
- */
- const DEFAULT_EMAIL_STYLES = "
- body { font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; }
- p { font-size: 16px; }
- h1 { font-size: 32px; }
- h2 { font-size: 24px; }
- h3 { font-size: 18px; }
- h4 { font-size: 16px; }
- h5 { font-size: 14px; }
- h6 { font-size: 12px; }
- ";
-
-
/** @var WPFunctions */
private $wp;