diff --git a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx index d340fa72d2..23341e7b8a 100644 --- a/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx +++ b/apps/admin-x-settings/src/components/settings/email/newsletters/NewsletterDetailModal.tsx @@ -533,17 +533,18 @@ const NewsletterDetailModalContent: React.FC<{newsletter: Newsletter; onlyOne: b savingDelay: 500, onSave: async () => { const {newsletters: [updatedNewsletter], meta: {sent_email_verification: [emailToVerify] = []} = {}} = await editNewsletter(formState); ``; + const previousFrom = renderSenderEmail(updatedNewsletter, config, defaultEmailAddress); + const previousReplyTo = renderReplyToEmail(updatedNewsletter, config, supportEmailAddress, defaultEmailAddress) || previousFrom; + let title; let prompt; if (emailToVerify && emailToVerify === 'sender_email') { - const previousFrom = renderSenderEmail(updatedNewsletter, config, defaultEmailAddress); title = 'Confirm newsletter email address'; prompt = <>We‘ve sent a confirmation email to {formState.sender_email}. Until the address has been verified, newsletters will be sent from the {updatedNewsletter.sender_email ? ' previous' : ' default'} email address{previousFrom ? ` (${previousFrom})` : ''}.; } else if (emailToVerify && emailToVerify === 'sender_reply_to') { - const previousReplyTo = renderReplyToEmail(updatedNewsletter, config, supportEmailAddress, defaultEmailAddress); title = 'Confirm reply-to address'; - prompt = <>We‘ve sent a confirmation email to {formState.sender_reply_to}. Until the address has been verified, newsletters will use the previous reply-to address{previousReplyTo ? ` (${previousReplyTo})` : ''}.; + prompt = <>We‘ve sent a confirmation email to {formState.sender_reply_to}. Until the address has been verified, replies will continue to go to {previousReplyTo}.; } if (title && prompt) { diff --git a/apps/admin-x-settings/test/acceptance/email/newsletters.test.ts b/apps/admin-x-settings/test/acceptance/email/newsletters.test.ts index 7a4e8ba9d4..7f8e18cdc5 100644 --- a/apps/admin-x-settings/test/acceptance/email/newsletters.test.ts +++ b/apps/admin-x-settings/test/acceptance/email/newsletters.test.ts @@ -247,12 +247,12 @@ test.describe('Newsletter settings', async () => { await expect(page.getByTestId('confirmation-modal')).toHaveCount(1); await expect(page.getByTestId('confirmation-modal')).toHaveText(/Confirm reply-to address/); await expect(page.getByTestId('confirmation-modal')).toHaveText(/sent a confirmation email to test@test.com/); - await expect(page.getByTestId('confirmation-modal')).toHaveText(/previous reply-to address \(support@example.com\)/); + await expect(page.getByTestId('confirmation-modal')).toHaveText(/replies will continue to go to support@example.com/); }); }); - test.describe('For Ghost (Pro) users with custom domain', () => { - test('Allow sender and reply-to addresses to be changed without verification, but not their domain name', async ({page}) => { + test.describe('For Ghost (Pro) users with custom sending domain', () => { + test('Allow sender address to be changed partially (username but not domain name)', async ({page}) => { await mockApi({page, requests: { ...globalDataRequests, browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=50', response: responseFixtures.newsletters}, @@ -283,25 +283,17 @@ test.describe('Newsletter settings', async () => { await section.getByText('Awesome newsletter').click(); const modal = page.getByTestId('newsletter-modal'); const senderEmail = modal.getByLabel('Sender email'); - const replyToEmail = modal.getByLabel('Reply-to email'); - - // The sending domain is rendered as placeholder text - expect(modal).toHaveText(/@customdomain\.com/); // The sender email field should keep the username part of the email address await senderEmail.fill('harry@potter.com'); expect(await senderEmail.inputValue()).toBe('harry'); - // Full flexibility for the reply-to address - await replyToEmail.fill('hermione@customdomain.com'); - expect(await replyToEmail.inputValue()).toBe('hermione@customdomain.com'); - // The new username is saved without a confirmation popup await modal.getByRole('button', {name: 'Save'}).click(); await expect(page.getByTestId('confirmation-modal')).toHaveCount(0); }); - test('Reply-To addresses without a matching domain require verification', async ({page}) => { + test('Allow full customisation of the reply-to address, with verification', async ({page}) => { await mockApi({page, requests: { ...globalDataRequests, browseNewsletters: {method: 'GET', path: '/newsletters/?include=count.active_members%2Ccount.posts&limit=50', response: responseFixtures.newsletters}, @@ -331,26 +323,18 @@ test.describe('Newsletter settings', async () => { const section = page.getByTestId('newsletters'); await section.getByText('Awesome newsletter').click(); const modal = page.getByTestId('newsletter-modal'); - const senderEmail = modal.getByLabel('Sender email'); const replyToEmail = modal.getByLabel('Reply-to email'); - // The sending domain is rendered as placeholder text - expect(modal).toHaveText(/@customdomain\.com/); - - // The sender email field should keep the username part of the email address - await senderEmail.fill('harry@potter.com'); - expect(await senderEmail.inputValue()).toBe('harry'); - // Full flexibility for the reply-to address await replyToEmail.fill('hermione@granger.com'); expect(await replyToEmail.inputValue()).toBe('hermione@granger.com'); - // The new username is saved without a confirmation popup + // There is a verification popup for the new reply-to address await modal.getByRole('button', {name: 'Save'}).click(); await expect(page.getByTestId('confirmation-modal')).toHaveCount(1); await expect(page.getByTestId('confirmation-modal')).toHaveText(/Confirm reply-to address/); await expect(page.getByTestId('confirmation-modal')).toHaveText(/sent a confirmation email to hermione@granger.com/); - await expect(page.getByTestId('confirmation-modal')).toHaveText(/previous reply-to address \(support@example.com\)/); + await expect(page.getByTestId('confirmation-modal')).toHaveText(/replies will continue to go to support@example.com/); }); }); });