From 43c92642c64f1fb1b016bb96dfb1d599aaaf31a8 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 23 Aug 2023 16:16:37 +0200 Subject: [PATCH] Implement Back to School 2023 banners and modal (#14363) * Implement Back to School 2023 banners and modal * Only show WritefullPromoBanner if not showing BackToSchoolModal GitOrigin-RevId: 3bd2ea48fa6d66f112cc26662a61be05cf7daafd --- .../Features/Project/ProjectListController.js | 1 + .../Subscription/SubscriptionController.js | 11 ++ services/web/app/views/project/list-react.pug | 1 + .../subscriptions/interstitial-payment.pug | 25 ++++ .../interstitial-payment_no_nudge_monthly.pug | 25 ++++ .../interstitial-payment_nudge_annual.pug | 25 ++++ .../web/app/views/subscriptions/plans.pug | 28 +++++ .../web/frontend/extracted-translations.json | 4 + .../ads/back-to-school-modal.tsx | 109 ++++++++++++++++++ .../notifications/user-notifications.tsx | 13 ++- .../frontend/stylesheets/app/homepage.less | 37 +++++- .../web/frontend/stylesheets/app/plans.less | 26 +++++ services/web/locales/en.json | 8 ++ .../subscriptions/back-to-school-modal.png | Bin 0 -> 17919 bytes .../SubscriptionControllerTests.js | 1 + 15 files changed, 311 insertions(+), 3 deletions(-) create mode 100644 services/web/frontend/js/features/project-list/components/notifications/ads/back-to-school-modal.tsx create mode 100644 services/web/public/img/subscriptions/back-to-school-modal.png diff --git a/services/web/app/src/Features/Project/ProjectListController.js b/services/web/app/src/Features/Project/ProjectListController.js index c7701ba17d..b1dff38fd1 100644 --- a/services/web/app/src/Features/Project/ProjectListController.js +++ b/services/web/app/src/Features/Project/ProjectListController.js @@ -452,6 +452,7 @@ async function projectListPage(req, res, next) { showInrGeoBanner, inrGeoBannerVariant, inrGeoBannerSplitTestName, + showBackToSchoolModal: Boolean(usersBestSubscription?.type === 'free'), projectDashboardReact: true, // used in navbar welcomePageRedesignVariant: welcomePageRedesignAssignment.variant, groupSubscriptionsPendingEnrollment: diff --git a/services/web/app/src/Features/Subscription/SubscriptionController.js b/services/web/app/src/Features/Subscription/SubscriptionController.js index b23af6139f..d2b68c8bda 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionController.js +++ b/services/web/app/src/Features/Subscription/SubscriptionController.js @@ -130,6 +130,16 @@ async function plansPage(req, res) { plansPageViewSegmentation[inrGeoBannerSplitTestName] = inrGeoBannerVariant } + let showBackToSchoolBanner + const userId = SessionManager.getLoggedInUserId(req.session) + if (userId) { + const usersBestSubscription = + await SubscriptionViewModelBuilder.promises.getBestSubscription({ + _id: userId, + }) + showBackToSchoolBanner = usersBestSubscription?.type === 'free' + } + AnalyticsManager.recordEventForSession( req.session, 'plans-page-view', @@ -152,6 +162,7 @@ async function plansPage(req, res) { initialLocalizedGroupPrice: SubscriptionHelper.generateInitialLocalizedGroupPrice(currency), showInrGeoBanner, + showBackToSchoolBanner, annualTrialsAssignment: annualTrialsAssignment?.variant, }) } diff --git a/services/web/app/views/project/list-react.pug b/services/web/app/views/project/list-react.pug index c82ed6c124..db50495447 100644 --- a/services/web/app/views/project/list-react.pug +++ b/services/web/app/views/project/list-react.pug @@ -33,6 +33,7 @@ block append meta meta(name="ol-inrGeoBannerSplitTestName" data-type="string" content=inrGeoBannerSplitTestName) meta(name="ol-showLATAMBanner" data-type="boolean" content=showLATAMBanner) meta(name="ol-recommendedCurrency" data-type="string" content=recommendedCurrency) + meta(name="ol-showBackToSchoolModal" data-type="boolean" content=showBackToSchoolModal) meta(name="ol-welcomePageRedesignVariant" data-type="string" content=welcomePageRedesignVariant) meta(name="ol-groupSubscriptionsPendingEnrollment" data-type="json" content=groupSubscriptionsPendingEnrollment) diff --git a/services/web/app/views/subscriptions/interstitial-payment.pug b/services/web/app/views/subscriptions/interstitial-payment.pug index 172308a04a..bb266c37fb 100644 --- a/services/web/app/views/subscriptions/interstitial-payment.pug +++ b/services/web/app/views/subscriptions/interstitial-payment.pug @@ -14,6 +14,31 @@ block append meta block content main.content.content-alt#main-content + .container + .user-notifications + ul.list-unstyled(ng-cloak) + li.notification-entry + div.alert.alert-back-to-school( + event-tracking-mb="true" + event-tracking="promo-prompt" + event-tracking-trigger="load" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner"}' + ) + .notification-body + | ๐ŸŽ‰   + p + strong #{translate("back_to_school_banner_bargain_with_x_percent_off_in_school_or_not", {x: '15'})} + br + | #{translate("back_to_school_banner_hurry_offer_ends_sep_30")} + .notification-action + a.btn.btn-sm.btn-default-outline( + href="/about/back-to-school-promo-2023" + event-tracking-mb="true" + event-tracking="promo-click" + event-tracking-trigger="click" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner", "type": "click"}' + ) #{translate('claim_discounts')} + .content-page .plans .container diff --git a/services/web/app/views/subscriptions/interstitial-payment_no_nudge_monthly.pug b/services/web/app/views/subscriptions/interstitial-payment_no_nudge_monthly.pug index 3c2f712af2..65ed2f48a7 100644 --- a/services/web/app/views/subscriptions/interstitial-payment_no_nudge_monthly.pug +++ b/services/web/app/views/subscriptions/interstitial-payment_no_nudge_monthly.pug @@ -14,6 +14,31 @@ block append meta block content main.content.content-alt#main-content + .container + .user-notifications + ul.list-unstyled(ng-cloak) + li.notification-entry + div.alert.alert-back-to-school( + event-tracking-mb="true" + event-tracking="promo-prompt" + event-tracking-trigger="load" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner"}' + ) + .notification-body + | ๐ŸŽ‰   + p + strong #{translate("back_to_school_banner_bargain_with_x_percent_off_in_school_or_not", {x: '15'})} + br + | #{translate("back_to_school_banner_hurry_offer_ends_sep_30")} + .notification-action + a.btn.btn-sm.btn-default-outline( + href="/about/back-to-school-promo-2023" + event-tracking-mb="true" + event-tracking="promo-click" + event-tracking-trigger="click" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner", "type": "click"}' + ) #{translate('claim_discounts')} + .content-page .plans .container diff --git a/services/web/app/views/subscriptions/interstitial-payment_nudge_annual.pug b/services/web/app/views/subscriptions/interstitial-payment_nudge_annual.pug index 47f01ff18e..67a94744df 100644 --- a/services/web/app/views/subscriptions/interstitial-payment_nudge_annual.pug +++ b/services/web/app/views/subscriptions/interstitial-payment_nudge_annual.pug @@ -14,6 +14,31 @@ block append meta block content main.content.content-alt#main-content + .container + .user-notifications + ul.list-unstyled(ng-cloak) + li.notification-entry + div.alert.alert-back-to-school( + event-tracking-mb="true" + event-tracking="promo-prompt" + event-tracking-trigger="load" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner"}' + ) + .notification-body + | ๐ŸŽ‰   + p + strong #{translate("back_to_school_banner_bargain_with_x_percent_off_in_school_or_not", {x: '15'})} + br + | #{translate("back_to_school_banner_hurry_offer_ends_sep_30")} + .notification-action + a.btn.btn-sm.btn-default-outline( + href="/about/back-to-school-promo-2023" + event-tracking-mb="true" + event-tracking="promo-click" + event-tracking-trigger="click" + event-segmentation='{"location": "interstitial-page-banner", "name": "bts2023", "content": "banner", "type": "click"}' + ) #{translate('claim_discounts')} + .content-page .plans .container diff --git a/services/web/app/views/subscriptions/plans.pug b/services/web/app/views/subscriptions/plans.pug index baeef21b28..fda1235030 100644 --- a/services/web/app/views/subscriptions/plans.pug +++ b/services/web/app/views/subscriptions/plans.pug @@ -12,12 +12,40 @@ block append meta block content main.content.content-alt#main-content + if showBackToSchoolBanner + .container( + ) + .user-notifications + ul.list-unstyled(ng-cloak) + li.notification-entry + div.alert.alert-back-to-school( + event-tracking-mb="true" + event-tracking="promo-prompt" + event-tracking-trigger="load" + event-segmentation='{"location": "plans-page-banner", "name": "bts2023", "content": "banner"}' + ) + .notification-body + | ๐ŸŽ‰   + p + strong #{translate("back_to_school_banner_bargain_with_x_percent_off_in_school_or_not", {x: '15'})} + br + | #{translate("back_to_school_banner_hurry_offer_ends_sep_30")} + .notification-action + a.btn.btn-sm.btn-default-outline( + href="/about/back-to-school-promo-2023" + event-tracking-mb="true" + event-tracking="promo-click" + event-tracking-trigger="click" + event-segmentation='{"location": "plans-page-banner", "name": "bts2023", "content": "banner", "type": "click"}' + ) #{translate('claim_discounts')} + .content-page .plans .container(ng-cloak) if showInrGeoBanner div.alert.alert-success.text-centered !{translate("inr_discount_offer_plans_page_banner", {flag: '๐Ÿ‡ฎ๐Ÿ‡ณ'})} + .row .col-md-12 .page-header.centered.plans-header.text-centered.top-page-header diff --git a/services/web/frontend/extracted-translations.json b/services/web/frontend/extracted-translations.json index dacbdd8ef1..69571259d8 100644 --- a/services/web/frontend/extracted-translations.json +++ b/services/web/frontend/extracted-translations.json @@ -86,6 +86,9 @@ "autocomplete": "", "autocomplete_references": "", "back": "", + "back_to_school_modal_bargain_with_x_percent_off": "", + "back_to_school_modal_offer_ends_sep_30": "", + "back_to_school_modal_offers_from_writefull_and_papers": "", "back_to_subscription": "", "back_to_your_projects": "", "beta_program_already_participating": "", @@ -139,6 +142,7 @@ "checking_project_github_status": "", "choose_a_custom_color": "", "choose_from_group_members": "", + "claim_discounts": "", "clear_cached_files": "", "clear_search": "", "click_here_to_view_sl_in_lng": "", diff --git a/services/web/frontend/js/features/project-list/components/notifications/ads/back-to-school-modal.tsx b/services/web/frontend/js/features/project-list/components/notifications/ads/back-to-school-modal.tsx new file mode 100644 index 0000000000..1e561db012 --- /dev/null +++ b/services/web/frontend/js/features/project-list/components/notifications/ads/back-to-school-modal.tsx @@ -0,0 +1,109 @@ +import { useCallback, useEffect, useRef, useState } from 'react' +import { useTranslation } from 'react-i18next' +import usePersistedState from '../../../../../shared/hooks/use-persisted-state' +import * as eventTracking from '../../../../../infrastructure/event-tracking' +import { Modal, Button } from 'react-bootstrap' +import AccessibleModal from '../../../../../shared/components/accessible-modal' + +export default function BackToSchoolModal() { + const { t } = useTranslation() + const [dismissedUntil, setDismissedUntil] = usePersistedState< + Date | undefined + >(`has_dismissed_back_to_school_modal_until`) + const viewEventSent = useRef(false) + + const [showModal, setShowModal] = useState(true) + + useEffect(() => { + if (dismissedUntil && new Date(dismissedUntil) > new Date()) { + return + } + if (!viewEventSent.current) { + eventTracking.sendMB('promo-prompt', { + name: 'bts2023', + location: 'dashboard-modal', + content: 'modal', + }) + viewEventSent.current = true + } + }, [dismissedUntil]) + + const handleClick = useCallback(() => { + eventTracking.sendMB('promo-click', { + name: 'bts2023', + location: 'dashboard-modal', + content: 'modal', + type: 'click', + }) + + setShowModal(false) + + window.open('/about/back-to-school-promo-2023') + }, []) + + const bannerDismissed = useCallback(() => { + eventTracking.sendMB('promo-dismiss', { + name: 'bts2023', + location: 'dashboard-modal', + content: 'modal', + }) + const until = new Date() + until.setDate(until.getDate() + 14) // 14 days + setDismissedUntil(until) + }, [setDismissedUntil]) + + const handleHide = useCallback(() => { + setShowModal(false) + bannerDismissed() + }, [bannerDismissed]) + + const handleMaybeLater = useCallback(() => { + eventTracking.sendMB('promo-click', { + name: 'bts2023', + location: 'dashboard-modal', + content: 'modal', + type: 'pause', + }) + setShowModal(false) + const until = new Date() + until.setDate(until.getDate() + 1) // 1 day + setDismissedUntil(until) + }, [setDismissedUntil]) + + if (dismissedUntil && new Date(dismissedUntil) > new Date()) { + return null + } + + return ( + + + + {t('back_to_school_modal_bargain_with_x_percent_off', { x: '15' })} + + + +

+ +

+

{t('back_to_school_modal_offers_from_writefull_and_papers')}

+

+ {t('back_to_school_modal_offer_ends_sep_30')} +

+
+ + + + +
+ ) +} diff --git a/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx b/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx index 41b21ed98d..8d826c6197 100644 --- a/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx +++ b/services/web/frontend/js/features/project-list/components/notifications/user-notifications.tsx @@ -9,6 +9,7 @@ import INRBanner from './ads/inr-banner' import LATAMBanner from './ads/latam-banner' import getMeta from '../../../../utils/meta' import importOverleafModules from '../../../../../macros/import-overleaf-module.macro' +import BackToSchoolModal from './ads/back-to-school-modal' type Subscription = { groupId: string @@ -28,8 +29,12 @@ function UserNotifications() { 'ol-groupSubscriptionsPendingEnrollment', [] ) + const showBackToSchoolModal = getMeta('ol-showBackToSchoolModal', false) + const showInrGeoBanner = getMeta('ol-showInrGeoBanner', false) - const inrGeoBannerVariant = getMeta('ol-inrGeoBannerVariant', 'default') + const inrGeoBannerVariant = showBackToSchoolModal + ? 'default' // This test should be disabled to prevent double modals, but sanity check to be safe + : getMeta('ol-inrGeoBannerVariant', 'default') const inrGeoBannerSplitTestName = getMeta( 'ol-inrGeoBannerSplitTestName', 'unassigned' @@ -61,7 +66,11 @@ function UserNotifications() { ) : ( )} - + {showBackToSchoolModal ? ( + + ) : ( + + )} ) diff --git a/services/web/frontend/stylesheets/app/homepage.less b/services/web/frontend/stylesheets/app/homepage.less index 6c9600d1b2..6852be0a0f 100644 --- a/services/web/frontend/stylesheets/app/homepage.less +++ b/services/web/frontend/stylesheets/app/homepage.less @@ -53,7 +53,7 @@ position: relative; text-align: center; overflow: hidden; - padding-top: @header-height; + padding-top: 0px; // temporarily change from @header-height to 0px for back to school banner changes h1, p, label { @@ -331,6 +331,41 @@ box-shadow: 0 3px 5px rgba(0, 0, 0, 0.3); } +.back-to-school { + .back-to-school-banner { + background: @blue-10; + padding: 0px 16px 0px 12px; + border-radius: 4px; + border: 1px solid @blue-20; + color: @neutral-90; + .banner-row { + height: 56px; + display: flex; + justify-content: center; + align-content: center; + flex-wrap: wrap; + } + .claim-my-discount { + font-size: 14px; + font-weight: 700; + } + p { + margin: 0; + } + span { + font-size: 14px; + font-weight: 700; + margin-left: 10px; + } + a { + text-decoration: underline; + } + } + .navbar-default { + position: relative; + } +} + @media only screen and (max-width: @screen-sm-max) { .doc-history-example { margin-bottom: @margin-md; diff --git a/services/web/frontend/stylesheets/app/plans.less b/services/web/frontend/stylesheets/app/plans.less index ad74716c9f..7261cdca5f 100644 --- a/services/web/frontend/stylesheets/app/plans.less +++ b/services/web/frontend/stylesheets/app/plans.less @@ -84,6 +84,32 @@ } } +/** + Back to school promo +*/ + +.alert-back-to-school { + .alert-variant(@green-10; #BBDBB8; @neutral-90); + border-radius: 4px; + border: 1px solid #bbdbb8; + box-shadow: none !important; + + .notification-body { + display: flex; + } + + .btn.btn-default-outline { + border: 1px solid @neutral-60; + background: white; + font-size: 16px; + color: @neutral-90; + } + + .btn.btn-default-outline:active { + background: @neutral-40; + } +} + /** Plans Test */ diff --git a/services/web/locales/en.json b/services/web/locales/en.json index d6424f874f..12f9a9e788 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -138,6 +138,12 @@ "back_to_account_settings": "Back to account settings", "back_to_editor": "Back to the editor", "back_to_log_in": "Back to log in", + "back_to_school_banner_bargain_with_x_percent_off_in_school_or_not": "Grab a back-to-school bargain with __x__% off all individual Overleaf subscriptions (whether youโ€™re in school or not!)", + "back_to_school_banner_hurry_offer_ends_sep_30": "Hurry! Offer ends September 30.", + "back_to_school_homepage_bargain_with_x_percent_off": "Grab a back-to-school bargain with 15% off all individual Overleaf subscriptions", + "back_to_school_modal_bargain_with_x_percent_off": "Everyone can grab a back-to-school bargain this fall with __x__% off an Overleaf subscription", + "back_to_school_modal_offer_ends_sep_30": "Offer ends September 30.", + "back_to_school_modal_offers_from_writefull_and_papers": "And with offers from Writefull and Papers too, youโ€™ll have the tools you need to write smarter this year.", "back_to_subscription": "Back to Subscription", "back_to_your_projects": "Back to your projects", "become_an_advisor": "Become an __appName__ advisor", @@ -229,6 +235,8 @@ "choose_from_group_members": "Choose from Group Members", "choose_your_plan": "Choose your plan", "city": "City", + "claim_discounts": "Claim discounts", + "claim_my_discount": "Claim my discount", "clear_cached_files": "Clear cached files", "clear_search": "clear search", "clear_sessions": "Clear Sessions", diff --git a/services/web/public/img/subscriptions/back-to-school-modal.png b/services/web/public/img/subscriptions/back-to-school-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..256e3e8cee3abae2e4de4d8e4705e9bd6db35c22 GIT binary patch literal 17919 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 rw6+PpTUmXsnONc~!Q z1Al-q_B)=#{YJ7zk5+lXrGnDkdRzNS&!I+dsfC9oeq>au-ekh*RVoePcx-QU;LYFG zx~DlE-^6*Zo$2&sx4tS%!9Hu>!mmRnh`LIgyUlDc&>&|d+PLwP z5LB6U`@3jXmBjZa%Db(e!<{SNG!C<%hvn}}mq9L9@zo*ZnhBbCKr`1vlv&XI@M`<0 z{chl0tE8V~_T&ha<{;+E(7e6mY+nAO*XGwNa|cJJgrMu&uZj7A`xQ51Q*kR{p3e)t z_N5UGwObf!2s=|bfA~qmurZnu-|^_|^?Fe}mxH;Ub%8EG+wwGuBCRa3bN*z#Ll6G`d}srh-lYRdZY;D6{jm;mAb`_Z`CrTLn+BHK zT*Xz?rHUP7^H}a5tZWTL^q{FHfC^r7`GCbxPim}9iq~r_BUE9wpqP4LM~9kX*E7Gc z9%1*CcCDqMRsZ8&`S_m7nift@P7E1|{O`ho!5<~Mw_uRF==?R`l+P$4Hh<``XC{d6 z4wq0Xvc_%moc5zzx4pCHd>)kK!qx4Z-u%n3LF z55qD^V;@zE6#+&nIRzD{4NRUPgBZ#Uz#A+|qIJeiN>Z4!(3< za6D@WqTnPO;=Wq0lbX2TmsTQd`WqAs=e&#tP2t%a&I6M^I$H{cBcm$i&ZOi#GA- z^O%<>> zHC?K6#oHa}Ds$)nO0M30t3u4vXhg^E7}-&-hd#pN<+jfzd2}8e%Pn63=53WAM@wzw zJV02NYfK+Y3ylkTWt8>}cr=zsnS9@l-Sy~36H)yyD2YTLp+yTtm(z$904~Tq|pAD@2 zrUU<)h)7H8@7Xwv7vH|8;hP@Ue-8BOsC!dxiSEP>_$+)5EnW})+K%wue3a0ExG2~C z;Ib>vcZz5-AOgoIK_WLo0ELdY;uOfxq3!T*srY31e)fiiMLcl%@;ju;-#zkj$i|Jf zHE7EV1Uc~q!XIR+FpUEoQ_?_y>@sby(K#rLmGtFJ&c?^DnvxXuhF3uO1h-FZ3Ig; zq(BR%322%ghXV`YoZvQ>GX@ab50j|X zr3vNPDrM^-rB8q57S^8wO0;%zMMT;t(TQ-`PW)ERTAEZbbk|)c+ee7zt0FQ`^5`I_ zU{=@Feyu@+nyC7X*zu|#3q!Oe6|@~=O~8IvF8IfK-eXYK%Ym7d5Dg(+kS>1I>z89H z9NN_dcbr9Z;QQao!=OzhpS_?-ZP$>PJMlk;kTKu>%-Iu~51jW=%NW(Fke-?MvY4oI zzU}kP#TQya{Yc-9!MBc{Ht>wtvc16|R2% zw_iAhxd}L>a~Td7qOCrbYHL7F(U*#BZ2nTef4#6Po>`J6lwgjuTSia z?osIwx*B4s>4@R$ysPI$NoUf8V7PzY`_qw1IZfjVYdtdT$Oxm0dM?mRZiQ{yFkpk6 zrV&%c{AQCT{k6DErsvIiP<4luKW1rKY*@j{sjJwhvxK3KILyY&7VnKV=qS8n=L6O% z2>>J8C!843pHPKuB{$6Tu!<#_e_-~O)|Wc;7)6<@@5xBY3Q8(a8hCNO1> ztEj)+-PI@KSafeWht;U1rT^+_o-;{ZGtNs`;zFbI=5p)0&(A-#PMdaf^H)ok)`f!W zmK!afyj{Z}W246AeQPFeH=MLN;IiMRbfCwMuALxtj_JmVH@;d+CAKRcC~}#;WZKPt zTdpYWf7Ht2#O?LG{o)5_Q^6`3ox=dhckW%t^v!IPb$a;lh z(-FR`4uy@)#0V8m*4ErnBIYQ-UzD;SFU@_cl84lZm&t3*AE`*PbaE#>eAGIto%>Op zI!Dm@0B(O%xl1;CB)(TWPWW|X!v^45le33I3-?R2taR7mmX`L6(fTh}#^NY*;msM% z$CswtGfvr%)2Ps;Da0K%vvWJKGdgCQ}u12&;DRp?=YUBjk`)bG0YXZ-oD|c9RIX@M1I;gPTFyzGX lzuN>@9BGP#j{Ij|^@`*1k!e~_fX8Vtc)I$ztaD0e0swoe