From dc1422c50298b682d0138b0952905a6892d42288 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Thu, 12 Mar 2026 17:28:44 +0100 Subject: [PATCH 1/7] Add Send newsletter by default toggle to settings --- .../settings/sections/newsletter-section.tsx | 12 ++++- .../packages/newsletter/src/settings/types.ts | 1 + .../_inc/client/newsletter/newsletter.jsx | 48 ++++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx index f500fe6d9219..d22ecf2935d1 100644 --- a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx @@ -72,6 +72,16 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'boolean' as const, Edit: 'toggle' as const, }, + { + id: 'wpcom_newsletter_send_default', + label: __( 'Send newsletter by default', 'jetpack-newsletter' ), + type: 'boolean' as const, + Edit: 'toggle' as const, + description: __( + 'When on, the newsletter option will be pre-selected each time you publish. You can change it before publishing any post.', + 'jetpack-newsletter' + ), + }, ]; return ( @@ -88,7 +98,7 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'regular', labelPosition: 'top', }, - fields: [ 'subscriptions' ], + fields: [ 'subscriptions', 'wpcom_newsletter_send_default' ], } } onChange={ handleChange } /> diff --git a/projects/packages/newsletter/src/settings/types.ts b/projects/packages/newsletter/src/settings/types.ts index 690e6eece5f1..1affd1c2ea20 100644 --- a/projects/packages/newsletter/src/settings/types.ts +++ b/projects/packages/newsletter/src/settings/types.ts @@ -22,6 +22,7 @@ export interface NewsletterSettings { jetpack_post_date_in_email: boolean; jetpack_subscriptions_reply_to: 'comment' | 'author' | 'no-reply'; jetpack_subscriptions_from_name: string; + wpcom_newsletter_send_default: boolean; wpcom_newsletter_categories_enabled: boolean; wpcom_newsletter_categories: string[]; subscription_options?: { diff --git a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx index 98a113719169..5d7997b9c9b8 100644 --- a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx +++ b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx @@ -1,4 +1,4 @@ -import { getRedirectUrl } from '@automattic/jetpack-components'; +import { getRedirectUrl, ToggleControl } from '@automattic/jetpack-components'; import { __ } from '@wordpress/i18n'; import { useCallback } from 'react'; import { connect } from 'react-redux'; @@ -19,6 +19,8 @@ import { isWpAdminSubscriberManagementEnabled, getSiteAdminUrl } from 'state/ini import { getModule } from 'state/modules'; import { SUBSCRIPTIONS_MODULE_NAME } from './constants'; +const NEWSLETTER_SEND_DEFAULT_OPTION = 'wpcom_newsletter_send_default'; + const trackViewSubsClick = () => { analytics.tracks.recordJetpackClick( 'manage-subscribers' ); }; @@ -41,7 +43,9 @@ function Newsletter( props ) { siteHasConnectedUser, wpAdminSubscriberManagementEnabled, siteAdminUrl, + newsletterSendDefault, updateOptions, + updateFormStateAndSaveOptionValue, getOptionValue, refreshSettings, } = props; @@ -71,6 +75,14 @@ function Newsletter( props ) { ); }; + const handleEmailPostToSubsDefaultToggle = useCallback( () => { + const newValue = ! newsletterSendDefault; + updateFormStateAndSaveOptionValue( NEWSLETTER_SEND_DEFAULT_OPTION, newValue ); + analytics.tracks.recordEvent( 'jetpack_newsletter_set_send_default', { + enabled: newValue, + } ); + }, [ newsletterSendDefault, updateFormStateAndSaveOptionValue ] ); + const toggleModule = useCallback( module => { const status = getOptionValue( module ); @@ -129,6 +141,39 @@ function Newsletter( props ) { + + + { __( 'Send newsletter by default', 'jetpack' ) } + + } + /> + + { getSubClickableCard() } ); @@ -145,6 +190,7 @@ export default withModuleSettingsFormHelpers( siteHasConnectedUser: hasConnectedOwner( state ), wpAdminSubscriberManagementEnabled: isWpAdminSubscriberManagementEnabled( state ), siteAdminUrl: getSiteAdminUrl( state ), + newsletterSendDefault: ownProps.getOptionValue( NEWSLETTER_SEND_DEFAULT_OPTION ), }; } )( Newsletter ) ); From 3f5863eec9ca6f6bcdfa678edc71e23df869964c Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Thu, 12 Mar 2026 17:51:07 +0100 Subject: [PATCH 2/7] Add changelog entries --- .../newsletter/changelog/add-newsletter-send-default-setting | 4 ++++ .../jetpack/changelog/add-newsletter-send-default-setting | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 projects/packages/newsletter/changelog/add-newsletter-send-default-setting create mode 100644 projects/plugins/jetpack/changelog/add-newsletter-send-default-setting diff --git a/projects/packages/newsletter/changelog/add-newsletter-send-default-setting b/projects/packages/newsletter/changelog/add-newsletter-send-default-setting new file mode 100644 index 000000000000..5a1713bf7b51 --- /dev/null +++ b/projects/packages/newsletter/changelog/add-newsletter-send-default-setting @@ -0,0 +1,4 @@ +Significance: patch +Type: changed + +Add Send newsletter by default toggle to Newsletter settings section. diff --git a/projects/plugins/jetpack/changelog/add-newsletter-send-default-setting b/projects/plugins/jetpack/changelog/add-newsletter-send-default-setting new file mode 100644 index 000000000000..f39177d9c5a9 --- /dev/null +++ b/projects/plugins/jetpack/changelog/add-newsletter-send-default-setting @@ -0,0 +1,4 @@ +Significance: patch +Type: other + +Newsletter: Add Send newsletter by default toggle to settings. From a38aec90fe9099712f5bf3e24ab8acc3bb1beee1 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Thu, 12 Mar 2026 18:30:20 +0100 Subject: [PATCH 3/7] Add tests for Send newsletter by default toggle --- .../_inc/client/newsletter/test/component.js | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/projects/plugins/jetpack/_inc/client/newsletter/test/component.js b/projects/plugins/jetpack/_inc/client/newsletter/test/component.js index f1b219d36895..f2ed2acec5f5 100644 --- a/projects/plugins/jetpack/_inc/client/newsletter/test/component.js +++ b/projects/plugins/jetpack/_inc/client/newsletter/test/component.js @@ -23,7 +23,9 @@ describe( 'Newsletter', () => { wpAdminSubscriberManagementEnabled: true, siteAdminUrl: 'https://example.org/wp-admin/', getOptionValue: () => true, + newsletterSendDefault: true, updateOptions: jest.fn().mockResolvedValue( {} ), + updateFormStateAndSaveOptionValue: jest.fn(), refreshSettings: jest.fn(), }; @@ -116,4 +118,38 @@ describe( 'Newsletter', () => { expect( screen.getByRole( 'link', { name: 'Manage all subscribers' } ) ).toBeInTheDocument(); } ); } ); + + describe( 'Send newsletter by default toggle', () => { + it( 'renders the toggle', () => { + render( , { initialState } ); + expect( screen.getByText( 'Send newsletter by default' ) ).toBeInTheDocument(); + } ); + + it( 'is checked when newsletterSendDefault is true', () => { + render( , { initialState } ); + const toggle = screen.getByLabelText( 'Send newsletter by default' ); + expect( toggle ).toBeChecked(); + } ); + + it( 'is unchecked when newsletterSendDefault is false', () => { + const propsWithSendDefaultFalse = { + ...defaultProps, + getOptionValue: option => ( option === 'wpcom_newsletter_send_default' ? false : true ), + }; + render( , { initialState } ); + const toggle = screen.getByLabelText( 'Send newsletter by default' ); + expect( toggle ).not.toBeChecked(); + } ); + + it( 'is disabled and unchecked when subscriptions are inactive', () => { + const propsWithSubscriptionsInactive = { + ...defaultProps, + getOptionValue: option => ( option === 'subscriptions' ? false : true ), + }; + render( , { initialState } ); + const toggle = screen.getByLabelText( 'Send newsletter by default' ); + expect( toggle ).not.toBeChecked(); + expect( toggle ).toBeDisabled(); + } ); + } ); } ); From 34ce296672fb30566eb4a2a32530f8785dbc79bf Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Thu, 12 Mar 2026 23:09:32 +0100 Subject: [PATCH 4/7] Address review feedback: match event name to option, clarify editor panel --- .../newsletter/src/settings/sections/newsletter-section.tsx | 2 +- .../plugins/jetpack/_inc/client/newsletter/newsletter.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx index d22ecf2935d1..a0ee7fcce35c 100644 --- a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx @@ -78,7 +78,7 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'boolean' as const, Edit: 'toggle' as const, description: __( - 'When on, the newsletter option will be pre-selected each time you publish. You can change it before publishing any post.', + 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', 'jetpack-newsletter' ), }, diff --git a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx index 5d7997b9c9b8..51dd71c9afe8 100644 --- a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx +++ b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx @@ -78,7 +78,7 @@ function Newsletter( props ) { const handleEmailPostToSubsDefaultToggle = useCallback( () => { const newValue = ! newsletterSendDefault; updateFormStateAndSaveOptionValue( NEWSLETTER_SEND_DEFAULT_OPTION, newValue ); - analytics.tracks.recordEvent( 'jetpack_newsletter_set_send_default', { + analytics.tracks.recordEvent( 'jetpack_set_wpcom_newsletter_send_default', { enabled: newValue, } ); }, [ newsletterSendDefault, updateFormStateAndSaveOptionValue ] ); @@ -148,7 +148,7 @@ function Newsletter( props ) { module={ subscriptions } support={ { text: __( - 'When on, the newsletter option will be pre-selected each time you publish. You can change it before publishing any post.', + 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', 'jetpack' ), link: getRedirectUrl( 'jetpack-support-subscriptions', { From 78e400ebe9a8b9f056dfb7cd8103490bd1571f67 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Mon, 16 Mar 2026 13:56:00 +0100 Subject: [PATCH 5/7] Move send-default toggle to Email content section and update copy --- .../settings/sections/email-content-section.tsx | 16 +++++++++++++++- .../src/settings/sections/newsletter-section.tsx | 12 +----------- .../_inc/client/newsletter/newsletter.jsx | 2 +- .../_inc/client/newsletter/test/component.js | 10 +++++----- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/projects/packages/newsletter/src/settings/sections/email-content-section.tsx b/projects/packages/newsletter/src/settings/sections/email-content-section.tsx index ef79ba3e0eae..953a6122cf87 100644 --- a/projects/packages/newsletter/src/settings/sections/email-content-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/email-content-section.tsx @@ -37,6 +37,16 @@ export function EmailContentSection( { }: EmailContentSectionProps ): JSX.Element { const isSitePublic = getNewsletterScriptData()?.isSitePublic ?? true; const fields: Field< NewsletterSettings >[] = [ + { + id: 'wpcom_newsletter_send_default', + label: __( 'Email new posts to subscribers by default', 'jetpack-newsletter' ), + type: 'boolean' as const, + Edit: 'toggle' as const, + description: __( + 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', + 'jetpack-newsletter' + ), + }, { id: 'wpcom_featured_image_in_email', label: __( "Include the post's featured image in the new post emails", 'jetpack-newsletter' ), @@ -89,7 +99,11 @@ export function EmailContentSection( { type: 'regular', labelPosition: 'top', }, - fields: [ 'wpcom_featured_image_in_email', 'wpcom_subscription_emails_use_excerpt' ], + fields: [ + 'wpcom_newsletter_send_default', + 'wpcom_featured_image_in_email', + 'wpcom_subscription_emails_use_excerpt', + ], } } onChange={ onChange } /> diff --git a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx index a0ee7fcce35c..f500fe6d9219 100644 --- a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx @@ -72,16 +72,6 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'boolean' as const, Edit: 'toggle' as const, }, - { - id: 'wpcom_newsletter_send_default', - label: __( 'Send newsletter by default', 'jetpack-newsletter' ), - type: 'boolean' as const, - Edit: 'toggle' as const, - description: __( - 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', - 'jetpack-newsletter' - ), - }, ]; return ( @@ -98,7 +88,7 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'regular', labelPosition: 'top', }, - fields: [ 'subscriptions', 'wpcom_newsletter_send_default' ], + fields: [ 'subscriptions' ], } } onChange={ handleChange } /> diff --git a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx index 51dd71c9afe8..0441b9a51986 100644 --- a/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx +++ b/projects/plugins/jetpack/_inc/client/newsletter/newsletter.jsx @@ -168,7 +168,7 @@ function Newsletter( props ) { onChange={ handleEmailPostToSubsDefaultToggle } label={ - { __( 'Send newsletter by default', 'jetpack' ) } + { __( 'Email new posts to subscribers by default', 'jetpack' ) } } /> diff --git a/projects/plugins/jetpack/_inc/client/newsletter/test/component.js b/projects/plugins/jetpack/_inc/client/newsletter/test/component.js index f2ed2acec5f5..56cc7b1db116 100644 --- a/projects/plugins/jetpack/_inc/client/newsletter/test/component.js +++ b/projects/plugins/jetpack/_inc/client/newsletter/test/component.js @@ -119,15 +119,15 @@ describe( 'Newsletter', () => { } ); } ); - describe( 'Send newsletter by default toggle', () => { + describe( 'Email new posts to subscribers by default toggle', () => { it( 'renders the toggle', () => { render( , { initialState } ); - expect( screen.getByText( 'Send newsletter by default' ) ).toBeInTheDocument(); + expect( screen.getByText( 'Email new posts to subscribers by default' ) ).toBeInTheDocument(); } ); it( 'is checked when newsletterSendDefault is true', () => { render( , { initialState } ); - const toggle = screen.getByLabelText( 'Send newsletter by default' ); + const toggle = screen.getByLabelText( 'Email new posts to subscribers by default' ); expect( toggle ).toBeChecked(); } ); @@ -137,7 +137,7 @@ describe( 'Newsletter', () => { getOptionValue: option => ( option === 'wpcom_newsletter_send_default' ? false : true ), }; render( , { initialState } ); - const toggle = screen.getByLabelText( 'Send newsletter by default' ); + const toggle = screen.getByLabelText( 'Email new posts to subscribers by default' ); expect( toggle ).not.toBeChecked(); } ); @@ -147,7 +147,7 @@ describe( 'Newsletter', () => { getOptionValue: option => ( option === 'subscriptions' ? false : true ), }; render( , { initialState } ); - const toggle = screen.getByLabelText( 'Send newsletter by default' ); + const toggle = screen.getByLabelText( 'Email new posts to subscribers by default' ); expect( toggle ).not.toBeChecked(); expect( toggle ).toBeDisabled(); } ); From 77bebf5367a83034452d04d37324185c7ce7d1d3 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Tue, 17 Mar 2026 22:09:32 +0100 Subject: [PATCH 6/7] Move send-default toggle to Newsletter section and show on Simple sites --- .../newsletter/src/settings/index.tsx | 4 +-- .../sections/email-content-section.tsx | 16 +-------- .../settings/sections/newsletter-section.tsx | 33 +++++++++++++++---- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/projects/packages/newsletter/src/settings/index.tsx b/projects/packages/newsletter/src/settings/index.tsx index 2f21b9f2c577..192a7df837b0 100644 --- a/projects/packages/newsletter/src/settings/index.tsx +++ b/projects/packages/newsletter/src/settings/index.tsx @@ -9,7 +9,7 @@ import { GlobalNotices, useGlobalNotices, } from '@automattic/jetpack-components'; -import { getSiteType, isSimpleSite } from '@automattic/jetpack-script-data'; +import { getSiteType } from '@automattic/jetpack-script-data'; import { Notice, Disabled, Spinner } from '@wordpress/components'; import { createRoot, useCallback, useEffect, useState, useMemo } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; @@ -391,7 +391,7 @@ function NewsletterSettingsApp(): JSX.Element | null { - { ! isSimpleSite() && } + diff --git a/projects/packages/newsletter/src/settings/sections/email-content-section.tsx b/projects/packages/newsletter/src/settings/sections/email-content-section.tsx index 953a6122cf87..ef79ba3e0eae 100644 --- a/projects/packages/newsletter/src/settings/sections/email-content-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/email-content-section.tsx @@ -37,16 +37,6 @@ export function EmailContentSection( { }: EmailContentSectionProps ): JSX.Element { const isSitePublic = getNewsletterScriptData()?.isSitePublic ?? true; const fields: Field< NewsletterSettings >[] = [ - { - id: 'wpcom_newsletter_send_default', - label: __( 'Email new posts to subscribers by default', 'jetpack-newsletter' ), - type: 'boolean' as const, - Edit: 'toggle' as const, - description: __( - 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', - 'jetpack-newsletter' - ), - }, { id: 'wpcom_featured_image_in_email', label: __( "Include the post's featured image in the new post emails", 'jetpack-newsletter' ), @@ -99,11 +89,7 @@ export function EmailContentSection( { type: 'regular', labelPosition: 'top', }, - fields: [ - 'wpcom_newsletter_send_default', - 'wpcom_featured_image_in_email', - 'wpcom_subscription_emails_use_excerpt', - ], + fields: [ 'wpcom_featured_image_in_email', 'wpcom_subscription_emails_use_excerpt' ], } } onChange={ onChange } /> diff --git a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx index f500fe6d9219..6d20cf96b1c2 100644 --- a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx @@ -3,7 +3,7 @@ */ import analytics from '@automattic/jetpack-analytics'; import { getRedirectUrl } from '@automattic/jetpack-components'; -import { getSiteType } from '@automattic/jetpack-script-data'; +import { getSiteType, isSimpleSite } from '@automattic/jetpack-script-data'; import { Card, CardHeader, @@ -63,17 +63,36 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): }, [ siteType ] ); const fields: Field< NewsletterSettings >[] = [ + ...( ! isSimpleSite() + ? [ + { + id: 'subscriptions', + label: __( + 'Let visitors subscribe to this site and receive emails when you publish a post', + 'jetpack-newsletter' + ), + type: 'boolean' as const, + Edit: 'toggle' as const, + }, + ] + : [] ), { - id: 'subscriptions', - label: __( - 'Let visitors subscribe to this site and receive emails when you publish a post', - 'jetpack-newsletter' - ), + id: 'wpcom_newsletter_send_default', + label: __( 'Email new posts to subscribers by default', 'jetpack-newsletter' ), type: 'boolean' as const, Edit: 'toggle' as const, + description: __( + 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', + 'jetpack-newsletter' + ), }, ]; + const formFields = [ + ...( ! isSimpleSite() ? [ 'subscriptions' ] : [] ), + 'wpcom_newsletter_send_default', + ]; + return ( @@ -88,7 +107,7 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): type: 'regular', labelPosition: 'top', }, - fields: [ 'subscriptions' ], + fields: formFields, } } onChange={ handleChange } /> From 9a1b2859e5e529da37e15c2654fc6a2e3ec14499 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini Date: Wed, 18 Mar 2026 00:46:02 +0100 Subject: [PATCH 7/7] Disable send-default toggle when subscriptions is off --- .../settings/sections/newsletter-section.tsx | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx index 6d20cf96b1c2..6ef0cae66190 100644 --- a/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx +++ b/projects/packages/newsletter/src/settings/sections/newsletter-section.tsx @@ -10,6 +10,7 @@ import { CardBody, CardFooter, ExternalLink, + ToggleControl, __experimentalHeading as Heading, // eslint-disable-line @wordpress/no-unsafe-wp-apis } from '@wordpress/components'; import { DataForm, type Field } from '@wordpress/dataviews/wp'; @@ -80,7 +81,25 @@ export function NewsletterSection( { data, onChange }: NewsletterSectionProps ): id: 'wpcom_newsletter_send_default', label: __( 'Email new posts to subscribers by default', 'jetpack-newsletter' ), type: 'boolean' as const, - Edit: 'toggle' as const, + Edit( { field, onChange: onChangeField, data: formData } ) { + const handleToggle = useCallback( () => { + onChangeField( + field.setValue( { + item: formData, + value: ! field.getValue( { item: formData } ), + } ) + ); + }, [ onChangeField, field, formData ] ); + return ( + + ); + }, description: __( 'When on, the newsletter option will be pre-selected each time you publish. You can change it in the newsletter panel in the editor before publishing any post.', 'jetpack-newsletter'