From 6d8e4e4c5b8a15294b0b3ba1ecfbfafab6c84336 Mon Sep 17 00:00:00 2001 From: Kristina <7614497+khjrtbrg@users.noreply.github.com> Date: Mon, 8 Jun 2026 11:18:18 +0200 Subject: [PATCH] [web] ship updated email templates (#34180) GitOrigin-RevId: fa04ff132ec898efdb4e2d35df8b8a0b09219d5e --- .../Features/Email/Bodies/NoCTAEmailBody.mjs | 62 +-- .../Email/Bodies/UpdatedNoCTAEmailBody.mjs | 28 - .../src/Features/Email/Bodies/cta-email.mjs | 141 ++--- .../Email/Bodies/updated-cta-email.mjs | 65 --- .../app/src/Features/Email/EmailBuilder.mjs | 21 +- .../app/src/Features/Email/EmailHandler.mjs | 23 - .../Email/Layouts/BaseEmailLayout.mjs | 524 +++++------------- .../Email/Layouts/UpdatedBaseEmailLayout.mjs | 169 ------ ...yout.test.mjs => BaseEmailLayout.test.mjs} | 4 +- .../test/unit/src/Email/EmailBuilder.test.mjs | 21 - 10 files changed, 232 insertions(+), 826 deletions(-) delete mode 100644 services/web/app/src/Features/Email/Bodies/UpdatedNoCTAEmailBody.mjs delete mode 100644 services/web/app/src/Features/Email/Bodies/updated-cta-email.mjs delete mode 100644 services/web/app/src/Features/Email/Layouts/UpdatedBaseEmailLayout.mjs rename services/web/test/unit/src/Email/{UpdatedBaseEmailLayout.test.mjs => BaseEmailLayout.test.mjs} (94%) diff --git a/services/web/app/src/Features/Email/Bodies/NoCTAEmailBody.mjs b/services/web/app/src/Features/Email/Bodies/NoCTAEmailBody.mjs index a078cad8e6..6a314c2926 100644 --- a/services/web/app/src/Features/Email/Bodies/NoCTAEmailBody.mjs +++ b/services/web/app/src/Features/Email/Bodies/NoCTAEmailBody.mjs @@ -1,46 +1,28 @@ import _ from 'lodash' +import { fontFamily, colors } from '../emailStyles.mjs' export default _.template(`\ -
-
|
-
|---|
+ <%= paragraph %> +
+<% }) %> + +<% if (highlightedText) { %> +- <%= greeting %> -
-<% } %> - -<% (message).forEach(function(paragraph) { %> -- <%= paragraph %> -
-<% }) %> - -<% if (highlightedText) { %> -
-
|
-
|---|
- <%= greeting %> -
-<% } %> - -<% (message).forEach(function(paragraph) { %> -- <%= paragraph %> -
-<% }) %> - -| - - <%= ctaText %> - - | -
- <%= paragraph %> -
- <% }) %> -<% } %> - -- If the button above does not appear, please copy and paste this link into your browser's address bar: -
-- <%= ctaURL %> -
- -<% if (gmailGoToAction) { %> - -<% } %>\ -`) diff --git a/services/web/app/src/Features/Email/EmailBuilder.mjs b/services/web/app/src/Features/Email/EmailBuilder.mjs index 69bb1f3adb..ecc6e341d3 100644 --- a/services/web/app/src/Features/Email/EmailBuilder.mjs +++ b/services/web/app/src/Features/Email/EmailBuilder.mjs @@ -4,12 +4,9 @@ import moment from 'moment' import EmailMessageHelper from './EmailMessageHelper.mjs' import StringHelper from '../Helpers/StringHelper.mjs' import BaseEmailLayout from './Layouts/BaseEmailLayout.mjs' -import UpdatedBaseEmailLayout from './Layouts/UpdatedBaseEmailLayout.mjs' import SpamSafe from './SpamSafe.mjs' import ctaEmailBody from './Bodies/cta-email.mjs' -import updatedCtaEmailBody from './Bodies/updated-cta-email.mjs' import NoCTAEmailBody from './Bodies/NoCTAEmailBody.mjs' -import UpdatedNoCTAEmailBody from './Bodies/UpdatedNoCTAEmailBody.mjs' function _emailBodyPlainText(content, opts, ctaEmail) { let emailBody = `${content.greeting(opts, true)}` @@ -79,10 +76,7 @@ function ctaTemplate(content) { return content.subject(opts) }, layout(opts) { - const layoutFn = opts.useNewEmailDesign - ? UpdatedBaseEmailLayout - : BaseEmailLayout - return layoutFn(opts) + return BaseEmailLayout(opts) }, footerMessage(opts) { return content.footerMessage(opts) @@ -91,8 +85,7 @@ function ctaTemplate(content) { return _emailBodyPlainText(content, opts, true) }, compiledTemplate(opts) { - const bodyFn = opts.useNewEmailDesign ? updatedCtaEmailBody : ctaEmailBody - return bodyFn({ + return ctaEmailBody({ title: content.title(opts), greeting: content.greeting(opts), message: content.message(opts), @@ -118,10 +111,7 @@ function NoCTAEmailTemplate(content) { return content.subject(opts) }, layout(opts) { - const layoutFn = opts.useNewEmailDesign - ? UpdatedBaseEmailLayout - : BaseEmailLayout - return layoutFn(opts) + return BaseEmailLayout(opts) }, plainTextTemplate(opts) { return `\ @@ -134,10 +124,7 @@ The ${settings.appName} Team - ${settings.siteUrl}\ ` }, compiledTemplate(opts) { - const bodyFn = opts.useNewEmailDesign - ? UpdatedNoCTAEmailBody - : NoCTAEmailBody - return bodyFn({ + return NoCTAEmailBody({ title: typeof content.title === 'function' ? content.title(opts) : undefined, greeting: content.greeting(opts), diff --git a/services/web/app/src/Features/Email/EmailHandler.mjs b/services/web/app/src/Features/Email/EmailHandler.mjs index 0c0b769688..054a578284 100644 --- a/services/web/app/src/Features/Email/EmailHandler.mjs +++ b/services/web/app/src/Features/Email/EmailHandler.mjs @@ -4,8 +4,6 @@ import logger from '@overleaf/logger' import EmailBuilder from './EmailBuilder.mjs' import EmailSender from './EmailSender.mjs' import Queues from '../../infrastructure/Queues.mjs' -import SplitTestHandler from '../SplitTests/SplitTestHandler.mjs' -import UserGetter from '../User/UserGetter.mjs' const EMAIL_SETTINGS = Settings.email || {} @@ -14,27 +12,6 @@ const EMAIL_SETTINGS = Settings.email || {} * @param {object} opts */ async function sendEmail(emailType, opts) { - if (opts.to) { - try { - const user = await UserGetter.promises.getUserByAnyEmail(opts.to, { - _id: 1, - }) - if (user) { - const { variant } = - await SplitTestHandler.promises.getAssignmentForUser( - user._id.toString(), - 'new-email-design' - ) - opts.useNewEmailDesign = variant === 'enabled' - } - } catch (err) { - logger.warn( - { err }, - 'failed to get new-email-design split test assignment' - ) - } - } - const email = EmailBuilder.buildEmail(emailType, opts) if (email.type === 'lifecycle' && !EMAIL_SETTINGS.lifecycle) { return diff --git a/services/web/app/src/Features/Email/Layouts/BaseEmailLayout.mjs b/services/web/app/src/Features/Email/Layouts/BaseEmailLayout.mjs index 4242241135..174bd6d8d1 100644 --- a/services/web/app/src/Features/Email/Layouts/BaseEmailLayout.mjs +++ b/services/web/app/src/Features/Email/Layouts/BaseEmailLayout.mjs @@ -1,395 +1,169 @@ import _ from 'lodash' import settings from '@overleaf/settings' +import { fontFamily, colors } from '../emailStyles.mjs' + +const _isSaas = settings.env === 'saas' +const _imageBase = settings.cdn?.web?.host || settings.siteUrl || null + +let _logoHtml = `${settings.appName}` +let _taglineHtml = '' +if (_isSaas && _imageBase) { + _logoHtml = ` + +
+
+ `
+}
+
+const _customFooter = settings.email?.template?.customFooter || ''
export default _.template(`\
-
+
+
+
+
+
+
+
+
-
+
+
-@media only screen and (max-width: 596px) {
- .small-float-center {
- margin: 0 auto !important;
- float: none !important;
- text-align: center !important;
- }
+
+
- .small-text-center {
- text-align: center !important;
- }
+
- .small-text-left {
- text-align: left !important;
- }
+
+
|
+
-
|
-