From d070e900bb5ffc7c9ebdaef2b52332811ba78aa8 Mon Sep 17 00:00:00 2001 From: Adam Cassis Date: Tue, 3 Sep 2024 09:33:08 +0200 Subject: [PATCH 1/6] fix(constant-contact): handle contact retrieval error --- .../class-newspack-newsletters-constant-contact-sdk.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/service-providers/constant_contact/class-newspack-newsletters-constant-contact-sdk.php b/includes/service-providers/constant_contact/class-newspack-newsletters-constant-contact-sdk.php index a14e4b526..99a3b88f7 100644 --- a/includes/service-providers/constant_contact/class-newspack-newsletters-constant-contact-sdk.php +++ b/includes/service-providers/constant_contact/class-newspack-newsletters-constant-contact-sdk.php @@ -644,7 +644,7 @@ public function remove_contacts_from_lists( $contact_ids, $list_ids ) { public function upsert_contact( $email_address, $data = [] ) { $contact = $this->get_contact( $email_address ); $body = []; - if ( $contact ) { + if ( $contact && ! \is_wp_error( $contact ) ) { $body = [ 'email_address' => get_object_vars( $contact->email_address ), 'list_memberships' => $contact->list_memberships, From 71826f64b0c1ceb3112beca008e1be628833e324 Mon Sep 17 00:00:00 2001 From: Adam Cassis Date: Tue, 3 Sep 2024 10:16:55 +0200 Subject: [PATCH 2/6] test: fix tests - avoid network requests --- .../class-newspack-newsletters-renderer.php | 6 +- tests/test-renderer.php | 72 +++++++++++++------ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/includes/class-newspack-newsletters-renderer.php b/includes/class-newspack-newsletters-renderer.php index c5d28d78e..f48bb39f5 100644 --- a/includes/class-newspack-newsletters-renderer.php +++ b/includes/class-newspack-newsletters-renderer.php @@ -1012,8 +1012,8 @@ function ( $block ) { * Embed block. */ case 'core/embed': - $oembed = _wp_oembed_get_object(); - $data = $oembed->get_data( $attrs['url'] ); + $oembed = apply_filters( 'newspack_newsletters_get_oembed_object', _wp_oembed_get_object() ); + $data = $oembed->get_data( $attrs['url'] ); if ( ! $data || empty( $data->type ) ) { break; @@ -1063,7 +1063,7 @@ function ( $block ) { 'height' => $data->height, 'href' => $attrs['url'], ); - $markup .= ''; + $markup .= ''; if ( ! empty( $caption ) ) { $markup .= '' . esc_html( $caption ) . ' - ' . esc_html( $data->provider_name ) . ''; } diff --git a/tests/test-renderer.php b/tests/test-renderer.php index 97546f830..1c2897d67 100755 --- a/tests/test-renderer.php +++ b/tests/test-renderer.php @@ -57,28 +57,48 @@ public function test_render_mjml_component() { } /** - * Test embed blocks rendering. + * Filter the OEmbed return value. + * + * @param array $data The data to return. */ - public function test_render_embed_blocks() { - // Make the embed request return a static custom response. + public function set_oembed_value( $data = [] ) { + global $newspack_newsletters_test_oembed_data; + $newspack_newsletters_test_oembed_data = $data; add_filter( - 'http_response', - function( $response ) { - $response['body'] = wp_json_encode( - array_merge( - json_decode( $response['body'], true ), - [ - 'title' => 'Embed', - 'url' => 'embed.com', - 'thumbnail_url' => 'embed.com/image', - 'html' => '
Embed
', - ] - ) - ); - return $response; + 'newspack_newsletters_get_oembed_object', + function() { + return new class() { + public function get_data() { // phpcs:disable Squiz.Commenting.FunctionComment.Missing + global $newspack_newsletters_test_oembed_data; + return (object) array_merge( + [ + 'title' => 'Embed', + 'url' => 'embed.com', + 'width' => 480, + 'height' => 360, + 'thumbnail_url' => 'embed.com/image', + 'thumbnail_width' => 480, + 'thumbnail_height' => 360, + 'html' => 'Embed', + ], + $newspack_newsletters_test_oembed_data + ); + } + }; } ); + } + /** + * Test embed blocks rendering. + */ + public function test_render_embed_blocks() { + $this->set_oembed_value( + [ + 'type' => 'video', + 'provider_name' => 'YouTube', + ] + ); // Video embed. $inner_html = '
https://www.youtube.com/watch?v=aIRgcb3cQ1Q
'; $this->assertEquals( @@ -97,6 +117,12 @@ function( $response ) { 'Renders image from video embed block with title as caption' ); + $this->set_oembed_value( + [ + 'type' => 'photo', + 'provider_name' => 'Flickr', + ] + ); // Image with custom caption. $inner_html = '
https://flickr.com/photos/thomashawk/9274246246
Automattic
'; $this->assertEquals( @@ -111,13 +137,19 @@ function( $response ) { 'innerHTML' => $inner_html, ] ), - 'Automattic - Flickr', + 'Automattic - Flickr', 'Renders image with inline figcaption as caption' ); // Rich embed as HTML. - $inner_html = '
https://twitter.com/automattic/status/1395447061336711181
'; - $rendered_string = Newspack_Newsletters_Renderer::render_mjml_component( + $inner_html = '
https://twitter.com/automattic/status/1395447061336711181
'; + $this->set_oembed_value( + [ + 'type' => 'rich', + 'provider_name' => 'Twitter', + ] + ); + $rendered_string = Newspack_Newsletters_Renderer::render_mjml_component( [ 'blockName' => 'core/embed', 'attrs' => [ From 99718ade77007750c305368100a35dad9d194205 Mon Sep 17 00:00:00 2001 From: Adam Cassis Date: Tue, 3 Sep 2024 10:26:52 +0200 Subject: [PATCH 3/6] fix(usage-reports): add error handling --- .../class-newspack-newsletters-mailchimp-usage-reports.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/includes/service-providers/mailchimp/class-newspack-newsletters-mailchimp-usage-reports.php b/includes/service-providers/mailchimp/class-newspack-newsletters-mailchimp-usage-reports.php index cd2d06495..06739c89d 100644 --- a/includes/service-providers/mailchimp/class-newspack-newsletters-mailchimp-usage-reports.php +++ b/includes/service-providers/mailchimp/class-newspack-newsletters-mailchimp-usage-reports.php @@ -99,7 +99,7 @@ private static function get_list_activity_reports( $days_in_past_count = 1 ) { * Get usage reports for last n days. * * @param int $days_in_past How many days in past. - * @return Newspack_Newsletters_Service_Provider_Usage_Report[] Usage reports. + * @return Newspack_Newsletters_Service_Provider_Usage_Report[]|WP_Error Usage reports or error. */ public static function get_usage_reports( $days_in_past ) { @@ -179,10 +179,13 @@ public static function get_usage_reports( $days_in_past ) { /** * Creates a usage report. * - * @return Newspack_Newsletters_Service_Provider_Usage_Report Usage report. + * @return Newspack_Newsletters_Service_Provider_Usage_Report|WP_Error Usage report or error. */ public static function get_usage_report() { $reports = self::get_usage_reports( 1 ); + if ( \is_wp_error( $reports ) ) { + return $reports; + } return reset( $reports ); } } From f3abbf179c5d1790658875251d2e49b25736eaac Mon Sep 17 00:00:00 2001 From: Adam Cassis Date: Tue, 3 Sep 2024 10:32:00 +0200 Subject: [PATCH 4/6] fix(usage-reports): error handling in active campaign reports --- ...s-newspack-newsletters-active-campaign-usage-reports.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/includes/service-providers/active_campaign/class-newspack-newsletters-active-campaign-usage-reports.php b/includes/service-providers/active_campaign/class-newspack-newsletters-active-campaign-usage-reports.php index 682c415f1..b17e01bcd 100644 --- a/includes/service-providers/active_campaign/class-newspack-newsletters-active-campaign-usage-reports.php +++ b/includes/service-providers/active_campaign/class-newspack-newsletters-active-campaign-usage-reports.php @@ -144,11 +144,15 @@ private static function get_default_campaign_data() { */ private function get_campaign_data( $last_n_days ) { $last_campaigns_data = get_option( self::LAST_CAMPAIGNS_DATA_OPTION_NAME ); - $campaigns_data = self::get_default_campaign_data(); $current_campaign_data = $this->get_current_campaign_data( $last_n_days ); + if ( \is_wp_error( $current_campaign_data ) ) { + return $current_campaign_data; + } update_option( self::LAST_CAMPAIGNS_DATA_OPTION_NAME, $current_campaign_data ); + $campaigns_data = self::get_default_campaign_data(); + if ( ! $last_campaigns_data ) { // No data about campaigns yet, so there is nothing to compare the new data with. return $campaigns_data; From b8a92325b0152a8973f584666899f552bb4bf7dc Mon Sep 17 00:00:00 2001 From: dkoo Date: Tue, 3 Sep 2024 15:02:29 -0600 Subject: [PATCH 5/6] perf: remove CodeMirror to reduce bundle size & speed --- package-lock.json | 45 ------------------------ package.json | 2 -- src/newsletter-editor/styling/index.js | 34 +++--------------- src/newsletter-editor/styling/style.scss | 24 +++++++++++-- 4 files changed, 27 insertions(+), 78 deletions(-) diff --git a/package-lock.json b/package-lock.json index bd199d02a..ad55e6268 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,7 @@ "version": "3.1.0", "license": "GPL-2.0-or-later", "dependencies": { - "@uiw/react-codemirror": "^3.2.10", "classnames": "^2.5.1", - "csslint": "^1.0.5", "mjml-browser": "^4.15.3", "newspack-components": "^3.0.0", "qs": "^6.13.0" @@ -5733,20 +5731,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@uiw/react-codemirror": { - "version": "3.2.10", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.9", - "codemirror": "^5.65.8" - }, - "peerDependencies": { - "@babel/runtime": ">=7.11.0", - "codemirror": ">=5.49.2", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "dev": true, @@ -9102,13 +9086,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/clone": { - "version": "2.1.2", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-deep": { "version": "0.2.4", "dev": true, @@ -9163,10 +9140,6 @@ "node": ">= 0.12.0" } }, - "node_modules/codemirror": { - "version": "5.65.16", - "license": "MIT" - }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "dev": true, @@ -9838,20 +9811,6 @@ "node": ">=4" } }, - "node_modules/csslint": { - "version": "1.0.5", - "license": "MIT", - "dependencies": { - "clone": "~2.1.0", - "parserlib": "~1.1.1" - }, - "bin": { - "csslint": "dist/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cssnano": { "version": "6.1.2", "dev": true, @@ -20955,10 +20914,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parserlib": { - "version": "1.1.1", - "license": "MIT" - }, "node_modules/parseurl": { "version": "1.3.3", "dev": true, diff --git a/package.json b/package.json index af6a29f45..72417cd68 100644 --- a/package.json +++ b/package.json @@ -39,9 +39,7 @@ "url": "https://github.com/Automattic/newspack-newsletters/issues" }, "dependencies": { - "@uiw/react-codemirror": "^3.2.10", "classnames": "^2.5.1", - "csslint": "^1.0.5", "mjml-browser": "^4.15.3", "newspack-components": "^3.0.0", "qs": "^6.13.0" diff --git a/src/newsletter-editor/styling/index.js b/src/newsletter-editor/styling/index.js index e17faf97a..6e9a5a9d5 100644 --- a/src/newsletter-editor/styling/index.js +++ b/src/newsletter-editor/styling/index.js @@ -3,6 +3,7 @@ /** * WordPress dependencies */ +import { PlainText } from '@wordpress/block-editor'; import { compose, useInstanceId } from '@wordpress/compose'; import { ColorPicker, BaseControl, Panel, PanelBody, PanelRow } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; @@ -10,30 +11,11 @@ import { useSelect, withDispatch, withSelect } from '@wordpress/data'; import { useEffect, useRef } from '@wordpress/element'; import SelectControlWithOptGroup from '../../components/select-control-with-optgroup/'; -/** - * External dependencies - */ -import { CSSLint } from 'csslint'; -import CodeMirror from '@uiw/react-codemirror'; -// eslint-disable-next-line import/no-extraneous-dependencies -import 'codemirror/mode/css/css'; -// eslint-disable-next-line import/no-extraneous-dependencies -import 'codemirror/addon/lint/lint'; -// eslint-disable-next-line import/no-extraneous-dependencies -import 'codemirror/addon/lint/lint.css'; -// eslint-disable-next-line import/no-extraneous-dependencies -import 'codemirror/addon/lint/css-lint'; - /** * Internal dependencies */ import './style.scss'; -/** - * Add CSSLint to global scope for CodeMirror. - */ -window.CSSLint = window.CSSLint || CSSLint; - const fontOptgroups = [ { label: __( 'Sans Serif', 'newspack-newsletters' ), @@ -264,18 +246,12 @@ export const Styling = compose( [ ) } hideLabelFromVision > - editPost( { meta: { custom_css: instance.getValue() } } ) } - options={ { - gutters: [ 'CodeMirror-lint-markers' ], - height: 'auto', - indentWithTabs: true, - mode: 'css', - lint: true, - } } + onChange={ content => editPost( { meta: { custom_css: content } } ) } + aria-label={ __( 'Custom CSS', 'newspack-newsletters' ) } + placeholder={ __( 'Write custom CSS…', 'newspack-newsletters' ) } /> diff --git a/src/newsletter-editor/styling/style.scss b/src/newsletter-editor/styling/style.scss index 06da1b24d..c721f80fb 100644 --- a/src/newsletter-editor/styling/style.scss +++ b/src/newsletter-editor/styling/style.scss @@ -26,8 +26,28 @@ .components-base-control { max-width: 100%; } - .CodeMirror { - border: 1px solid wp-colors.$gray-700; + .block-editor-plain-text { + background: #fff !important; + border: 1px solid #1e1e1e !important; + border-radius: 2px !important; + box-shadow: none !important; + box-sizing: border-box; + color: #1e1e1e !important; + direction: ltr; + font-family: Menlo, Consolas, monaco, monospace !important; + font-size: 16px !important; + max-height: 250px; + padding: 12px !important; + } + @media (min-width: 600px) { + .block-editor-plain-text { + font-size: 13px !important; + } + } + .block-editor-plain-text:focus { + border-color: var(--wp-admin-theme-color) !important; + box-shadow: 0 0 0 1px var(--wp-admin-theme-color) !important; + outline: 2px solid #0000 !important; } } } From 94c3748b6e0cd596cc5ef5b85dfba9123e92cf61 Mon Sep 17 00:00:00 2001 From: Adam Cassis Date: Wed, 4 Sep 2024 09:53:28 +0200 Subject: [PATCH 6/6] Update includes/class-newspack-newsletters-renderer.php Co-authored-by: leogermani --- includes/class-newspack-newsletters-renderer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/class-newspack-newsletters-renderer.php b/includes/class-newspack-newsletters-renderer.php index f48bb39f5..954798d3a 100644 --- a/includes/class-newspack-newsletters-renderer.php +++ b/includes/class-newspack-newsletters-renderer.php @@ -1012,6 +1012,11 @@ function ( $block ) { * Embed block. */ case 'core/embed': + /** + * Filters the retrieval of the WP oEmbed object. Used for testing purposes + * + * @param WP_oEmbed $oembed WP_oEmbed object. + */ $oembed = apply_filters( 'newspack_newsletters_get_oembed_object', _wp_oembed_get_object() ); $data = $oembed->get_data( $attrs['url'] );