From db9fad7cf82fc25cd35d06cc727ca1c5b61c07bc Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 14 Sep 2022 10:32:16 +0200 Subject: [PATCH] Merge onboarding experiments integration branch (#9571) * Add onboarding survey page * Add onboarding new analytics events to mixpanel allowlist * [web] Try Premium prompt * moved try-premium code to overleaf-integration * fixed sheet styling * Add onboarding flow redirect handling to registration handlers (#9462) * Add redirect logic for onboarding flow after registration * Update UPGRADE_PROMPT_URL * Cleanup style of OverleafAuthenticationController * Refactor finishLogin calls to call wrapped function in OverleafAuthenticationController * Refactor user properties/onboarding flow redirect into finishLogin wrapper * Fix async/await calls after refactoring * Update tests for finishLogin refactoring * Don't redirect to upgrade prompt if user has premium via commons Co-authored-by: Miguel Serrano GitOrigin-RevId: 7c392aa6949f99fa909f9ca4e4baad4c4d4ff6be --- .../Subscription/SubscriptionController.js | 6 + services/web/app/src/models/User.js | 1 + .../web/app/views/layout/navbar-marketing.pug | 276 +++++++++--------- .../subscriptions/interstitial-payment.pug | 12 +- .../subscriptions/successful_subscription.pug | 5 +- .../stylesheets/components/lists.less | 4 + services/web/locales/en.json | 13 + services/web/public/img/fa-check-green.svg | 3 + .../public/img/third-party-icons/dropbox.svg | 15 + .../web/public/img/third-party-icons/git.svg | 3 + .../public/img/third-party-icons/github.svg | 3 + .../public/img/third-party-icons/mendely.png | Bin 0 -> 1198 bytes .../public/img/third-party-icons/zotero.png | Bin 0 -> 6385 bytes .../SubscriptionControllerTests.js | 1 + 14 files changed, 203 insertions(+), 139 deletions(-) create mode 100644 services/web/public/img/fa-check-green.svg create mode 100644 services/web/public/img/third-party-icons/dropbox.svg create mode 100644 services/web/public/img/third-party-icons/git.svg create mode 100644 services/web/public/img/third-party-icons/github.svg create mode 100644 services/web/public/img/third-party-icons/mendely.png create mode 100644 services/web/public/img/third-party-icons/zotero.png diff --git a/services/web/app/src/Features/Subscription/SubscriptionController.js b/services/web/app/src/Features/Subscription/SubscriptionController.js index 882dccc255..4b267a2639 100644 --- a/services/web/app/src/Features/Subscription/SubscriptionController.js +++ b/services/web/app/src/Features/Subscription/SubscriptionController.js @@ -263,6 +263,8 @@ async function interstitialPaymentPage(req, res) { const hasSubscription = await LimitationsManager.promises.userHasV1OrV2Subscription(user) + const showSkipLink = req.query?.skipLink === 'true' + if (hasSubscription) { res.redirect('/user/subscription?hasSubscription=true') } else { @@ -272,6 +274,7 @@ async function interstitialPaymentPage(req, res) { itm_campaign: req.query?.itm_campaign, recommendedCurrency, interstitialPaymentConfig, + showSkipLink, }) } } @@ -339,6 +342,8 @@ async function successfulSubscription(req, res) { const premiumFeaturesDiscoverability = premiumFeaturesDiscoverabilityAssignment?.variant === 'active' + const postCheckoutRedirect = req.session?.postCheckoutRedirect + if (!personalSubscription) { res.redirect('/user/subscription/plans') } else { @@ -346,6 +351,7 @@ async function successfulSubscription(req, res) { title: 'thank_you', personalSubscription, premiumFeaturesDiscoverability, + postCheckoutRedirect, }) } } diff --git a/services/web/app/src/models/User.js b/services/web/app/src/models/User.js index dabaf91c7e..200c19a2aa 100644 --- a/services/web/app/src/models/User.js +++ b/services/web/app/src/models/User.js @@ -181,6 +181,7 @@ const UserSchema = new Schema({ auditLog: [AuditLogEntrySchema], splitTests: Schema.Types.Mixed, analyticsId: { type: String }, + surveyResponses: Schema.Types.Mixed, }) function formatSplitTestsSchema(next) { diff --git a/services/web/app/views/layout/navbar-marketing.pug b/services/web/app/views/layout/navbar-marketing.pug index 4f3100127c..d679b847ab 100644 --- a/services/web/app/views/layout/navbar-marketing.pug +++ b/services/web/app/views/layout/navbar-marketing.pug @@ -1,13 +1,14 @@ nav.navbar.navbar-default.navbar-main .container-fluid .navbar-header - button.navbar-toggle.collapsed( - type="button", - data-toggle="collapse", - data-target="[data-ol-navbar-main-collapse]" - aria-label="Toggle " + translate('navigation') - ) - i.fa.fa-bars(aria-hidden="true") + if (typeof(suppressNavbarRight) == "undefined") + button.navbar-toggle.collapsed( + type="button", + data-toggle="collapse", + data-target="[data-ol-navbar-main-collapse]" + aria-label="Toggle " + translate('navigation') + ) + i.fa.fa-bars(aria-hidden="true") if settings.nav.custom_logo a(href='/', aria-label=settings.appName, style='background-image:url("'+settings.nav.custom_logo+'")').navbar-brand else if (nav.title) @@ -20,72 +21,85 @@ nav.navbar.navbar-default.navbar-main - var canDisplaySplitTestMenu = hasFeature('saas') && (canDisplayAdminMenu || (getSessionUser() && getSessionUser().staffAccess && (getSessionUser().staffAccess.splitTestMetrics || getSessionUser().staffAccess.splitTestManagement))) - var canDisplaySurveyMenu = hasFeature('saas') && canDisplayAdminMenu - .navbar-collapse.collapse(data-ol-navbar-main-collapse) - ul.nav.navbar-nav.navbar-right - if (canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu) - li.dropdown.subdued - a.dropdown-toggle( - href="#", - role="button", - aria-haspopup="true", - aria-expanded="false", - data-toggle="dropdown" - ) - | Admin - span.caret - ul.dropdown-menu - if canDisplayAdminMenu - li - a(href="/admin") Manage Site - li - a(href="/admin/user") Manage Users - li - a(href="/admin/project") Project URL Lookup - if canDisplayAdminRedirect - li - a(href=settings.adminUrl) Switch to Admin - if canDisplaySplitTestMenu - li - a(href="/admin/split-test") Manage Split Tests - if canDisplaySurveyMenu - li - a(href="/admin/survey") Manage Surveys + if (typeof(suppressNavbarRight) == "undefined") + .navbar-collapse.collapse(data-ol-navbar-main-collapse) + ul.nav.navbar-nav.navbar-right + if (canDisplayAdminMenu || canDisplayAdminRedirect || canDisplaySplitTestMenu) + li.dropdown.subdued + a.dropdown-toggle( + href="#", + role="button", + aria-haspopup="true", + aria-expanded="false", + data-toggle="dropdown" + ) + | Admin + span.caret + ul.dropdown-menu + if canDisplayAdminMenu + li + a(href="/admin") Manage Site + li + a(href="/admin/user") Manage Users + li + a(href="/admin/project") Project URL Lookup + if canDisplayAdminRedirect + li + a(href=settings.adminUrl) Switch to Admin + if canDisplaySplitTestMenu + li + a(href="/admin/split-test") Manage Split Tests + if canDisplaySurveyMenu + li + a(href="/admin/survey") Manage Surveys - // loop over header_extras - each item in ((splitTestVariants && (splitTestVariants['unified-navigation'] === 'show-unified-navigation')) ? nav.header_extras_unified : nav.header_extras) - - - if ((item.only_when_logged_in && getSessionUser()) - || (item.only_when_logged_out && (!getSessionUser())) - || (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages) - || (item.only_content_pages && (typeof(suppressNavContentLinks) == "undefined" || !suppressNavContentLinks)) - ){ - var showNavItem = true - } else { - var showNavItem = false - } + // loop over header_extras + each item in ((splitTestVariants && (splitTestVariants['unified-navigation'] === 'show-unified-navigation')) ? nav.header_extras_unified : nav.header_extras) + - + if ((item.only_when_logged_in && getSessionUser()) + || (item.only_when_logged_out && (!getSessionUser())) + || (!item.only_when_logged_out && !item.only_when_logged_in && !item.only_content_pages) + || (item.only_content_pages && (typeof(suppressNavContentLinks) == "undefined" || !suppressNavContentLinks)) + ){ + var showNavItem = true + } else { + var showNavItem = false + } - if showNavItem - if item.dropdown - li.dropdown(class=item.class) - a.dropdown-toggle( - href="#", - role="button", - aria-haspopup="true", - aria-expanded="false", - data-toggle="dropdown" - ) - | !{translate(item.text)} - span.caret - ul.dropdown-menu - each child in item.dropdown - if child.divider - li.divider - if child.splitTest - if (splitTestVariants && (splitTestVariants[child.splitTest.name] === child.splitTest.variant)) + if showNavItem + if item.dropdown + li.dropdown(class=item.class) + a.dropdown-toggle( + href="#", + role="button", + aria-haspopup="true", + aria-expanded="false", + data-toggle="dropdown" + ) + | !{translate(item.text)} + span.caret + ul.dropdown-menu + each child in item.dropdown + if child.divider + li.divider + if child.splitTest + if (splitTestVariants && (splitTestVariants[child.splitTest.name] === child.splitTest.variant)) + li + if child.url + a( + href=child.url, + class=child.class, + event-tracking=child.event + event-tracking-mb="true" + event-tracking-trigger="click" + ) !{translate(child.text)} + else + | !{translate(child.text)} + else li if child.url a( - href=child.url, + href=child.url, class=child.class, event-tracking=child.event event-tracking-mb="true" @@ -93,81 +107,69 @@ nav.navbar.navbar-default.navbar-main ) !{translate(child.text)} else | !{translate(child.text)} - else - li - if child.url - a( - href=child.url, - class=child.class, - event-tracking=child.event - event-tracking-mb="true" - event-tracking-trigger="click" - ) !{translate(child.text)} - else - | !{translate(child.text)} - else - li(class=item.class) - if item.url - a( - href=item.url, - class=item.class, - event-tracking=item.event - event-tracking-mb="true" - event-tracking-trigger="click" - ) !{translate(item.text)} - else - | !{translate(item.text)} + else + li(class=item.class) + if item.url + a( + href=item.url, + class=item.class, + event-tracking=item.event + event-tracking-mb="true" + event-tracking-trigger="click" + ) !{translate(item.text)} + else + | !{translate(item.text)} - // logged out - if !getSessionUser() - // register link - if hasFeature('registration-page') + // logged out + if !getSessionUser() + // register link + if hasFeature('registration-page') + li + a( + href="/register" + event-tracking="menu-clicked-register" + event-tracking-action="clicked" + event-tracking-trigger="click" + event-tracking-mb="true" + event-segmentation={ page: currentUrl } + ) #{translate('register')} + + // login link li a( - href="/register" - event-tracking="menu-clicked-register" + href="/login" + event-tracking="menu-clicked-login" event-tracking-action="clicked" event-tracking-trigger="click" event-tracking-mb="true" event-segmentation={ page: currentUrl } - ) #{translate('register')} + ) #{translate('log_in')} - // login link - li - a( - href="/login" - event-tracking="menu-clicked-login" - event-tracking-action="clicked" - event-tracking-trigger="click" - event-tracking-mb="true" - event-segmentation={ page: currentUrl } - ) #{translate('log_in')} - - // projects link and account menu - if getSessionUser() - li - a(href="/project") #{translate('Projects')} - li.dropdown - a.dropdown-toggle( - href="#", - role="button", - aria-haspopup="true", - aria-expanded="false", - data-toggle="dropdown" - ) - | #{translate('Account')} - span.caret - ul.dropdown-menu - li - div.subdued #{getSessionUser().email} - li.divider.hidden-xs.hidden-sm - li - a(href="/user/settings") #{translate('Account Settings')} - if nav.showSubscriptionLink + // projects link and account menu + if getSessionUser() + li + a(href="/project") #{translate('Projects')} + li.dropdown + a.dropdown-toggle( + href="#", + role="button", + aria-haspopup="true", + aria-expanded="false", + data-toggle="dropdown" + ) + | #{translate('Account')} + span.caret + ul.dropdown-menu li - a(href="/user/subscription") #{translate('subscription')} - li.divider.hidden-xs.hidden-sm - li - form(method="POST" action="/logout") - input(name='_csrf', type='hidden', value=csrfToken) - button.btn-link.text-left.dropdown-menu-button #{translate('log_out')} + div.subdued #{getSessionUser().email} + li.divider.hidden-xs.hidden-sm + li + a(href="/user/settings") #{translate('Account Settings')} + if nav.showSubscriptionLink + li + a(href="/user/subscription") #{translate('subscription')} + li.divider.hidden-xs.hidden-sm + li + form(method="POST" action="/logout") + input(name='_csrf', type='hidden', value=csrfToken) + button.btn-link.text-left.dropdown-menu-button #{translate('log_out')} diff --git a/services/web/app/views/subscriptions/interstitial-payment.pug b/services/web/app/views/subscriptions/interstitial-payment.pug index c9143b42f3..046c7c2856 100644 --- a/services/web/app/views/subscriptions/interstitial-payment.pug +++ b/services/web/app/views/subscriptions/interstitial-payment.pug @@ -41,5 +41,15 @@ block content //- sticky header on mobile will be "hidden" (by removing its sticky position) if it reaches this div .invisible(aria-hidden="true" data-ol-plans-v2-table-sticky-header-stop) - + + if (showSkipLink) + .row.row-spaced-small.text-center + a(href='/project' + event-tracking="skip-button-click" + event-tracking-mb="true" + event-tracking-trigger="click" + event-segmentation='{"paywall-type": "interstitial-page"}' + ) + | #{translate("continue_with_free_plan")} + != moduleIncludes("contactModalGeneral-marketing", locals) diff --git a/services/web/app/views/subscriptions/successful_subscription.pug b/services/web/app/views/subscriptions/successful_subscription.pug index d55cf2af86..5107d3851d 100644 --- a/services/web/app/views/subscriptions/successful_subscription.pug +++ b/services/web/app/views/subscriptions/successful_subscription.pug @@ -30,4 +30,7 @@ block content br(ng-non-bindable) | The #{settings.appName} Team p - a.btn.btn-primary(href="/project") < #{translate("back_to_your_projects")} + if (postCheckoutRedirect) + a.btn.btn-primary(href=postCheckoutRedirect) < #{translate("back_to_your_projects")} + else + a.btn.btn-primary(href="/project") < #{translate("back_to_your_projects")} diff --git a/services/web/frontend/stylesheets/components/lists.less b/services/web/frontend/stylesheets/components/lists.less index f7986b38db..b0e1978d22 100644 --- a/services/web/frontend/stylesheets/components/lists.less +++ b/services/web/frontend/stylesheets/components/lists.less @@ -21,3 +21,7 @@ } } } + +.list-style-check-green { + list-style-image: url('../../../public/img/fa-check-green.svg'); +} diff --git a/services/web/locales/en.json b/services/web/locales/en.json index 2342cc6720..6044994fef 100644 --- a/services/web/locales/en.json +++ b/services/web/locales/en.json @@ -667,6 +667,8 @@ "dropbox_sync_error": "Sorry, there was a problem checking our Dropbox service. Please try again in a few moments.", "send": "Send", "sending": "Sending", + "continue": "Continue", + "skip": "Skip", "invalid_password": "Invalid Password", "invalid_password_not_set": "Password is required", "invalid_password_too_short": "Password too short, minimum __minLength__", @@ -1836,6 +1838,17 @@ "server_pro_license_entitlement_line_1": "<0>__appName__ Server Pro license", "server_pro_license_entitlement_line_2": "You currently have <0>__count__ active users. If you need to increase your license entitlement, please <1>contact Overleaf.", "server_pro_license_entitlement_line_3": "An active user is one who has opened a project in this Server Pro instance in the last 12 months.", + "get_the_most_out_headline": "Get the most out of __appName__ with features such as:", + "more_project_collaborators": "<0>More project <0>collaborators", + "advanced_reference_search": "Advanced <0>reference search", + "longer_compile_timeout": "Longer <0>compile timeout", + "symbol_palette_highlighted": "<0>Symbol palette", + "real_time_track_changes": "Real-time <0>track-changes", + "full_document_history": "Full document <0>history", + "github_git_and_dropbox_integrations": "<0>Github, <0>Git and <0>Dropbox integrations", + "zotero_and_mendeley_integrations": "<0>Zotero and <0>Mendeley integrations", + "skip": "Skip", + "continue_with_free_plan": "Continue with free plan", "history_entry_origin_upload": "upload", "history_entry_origin_git": "via Git", "history_entry_origin_github": "via GitHub", diff --git a/services/web/public/img/fa-check-green.svg b/services/web/public/img/fa-check-green.svg new file mode 100644 index 0000000000..9c6efcca7e --- /dev/null +++ b/services/web/public/img/fa-check-green.svg @@ -0,0 +1,3 @@ + + + diff --git a/services/web/public/img/third-party-icons/dropbox.svg b/services/web/public/img/third-party-icons/dropbox.svg new file mode 100644 index 0000000000..0dc2e21556 --- /dev/null +++ b/services/web/public/img/third-party-icons/dropbox.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/services/web/public/img/third-party-icons/git.svg b/services/web/public/img/third-party-icons/git.svg new file mode 100644 index 0000000000..d0c64d71f5 --- /dev/null +++ b/services/web/public/img/third-party-icons/git.svg @@ -0,0 +1,3 @@ + + + diff --git a/services/web/public/img/third-party-icons/github.svg b/services/web/public/img/third-party-icons/github.svg new file mode 100644 index 0000000000..19191709cb --- /dev/null +++ b/services/web/public/img/third-party-icons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/services/web/public/img/third-party-icons/mendely.png b/services/web/public/img/third-party-icons/mendely.png new file mode 100644 index 0000000000000000000000000000000000000000..5f98fa81b46b35ee16b4d7b7665a34e12af4d1b4 GIT binary patch literal 1198 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdoh8U@7%{V6ff81lKDxC%QjB9Hp8Sh{7coV$*i**)^7`Bj*^(VTjIj?HMbjl544@` zI2a-u;ppNQ!=B;IIJ?2+ux85B#A1o5sfMK-GZVx=2;D!!pSE;n!!&_Q$>JNhpPaSYu%*QFqOJ1j zjk7dczT99{kxEStW_Z8HZCbM7>rbf+!W%9Yip@Wiktx!AF}cp?fREafvp+AsJhyp8 zvy|H72J@+z*!C$a%we z?ndJSN+oW`xPz~)Id?McfYu_v1OL`GN2W(r$WJ`^LerV~e@8^m=UD+a=ch7iHe9}> zV0d)G?iP_vf97me**g2tj)<2}D;a-(_w_PQJfUXe^tjPWUvrXYQ1btb%utUBnT(lT zB3$!AgEV4Vlfs+d$t^pvDfpOE+PzO*tb2CqR?Rheog3EjXcj|kRgcCwQ_C1tmmbzN zU-le4baJPTqrZ8^raP+HMg?7tkFA6iv-K7vxv)K+=(v32CgqeDnq6lOY*k~=(_8Ry zf=I9DN}nAmAGjO@i8Bp zj~-d+wr>dL`8e;jXnxT_PnD@NuSl@@RW(UHp4)fF?bzuVN2aY!DRS}Au)h3;#p7pR za@K_;#+8XvgSA2zNV<4>XjlYVPO#zle44$rjF6*2UngEnIC)xl2 literal 0 HcmV?d00001 diff --git a/services/web/public/img/third-party-icons/zotero.png b/services/web/public/img/third-party-icons/zotero.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c42216057e18287b4209629f729e75f3d898b1 GIT binary patch literal 6385 zcmV~B>Jqs2rNLjRKQPDf^yz`KK|37sDn5z~qUi`!dAAC>)iNC+UgoTBDh4*Fd z+_`(_&!0bS#flZz*gyAA(*UBopP%2GzP`SPAqfu;m!hH~IeGG=96EI9Ol4)IL`6l( z%9Sg{%ggH&^d3Ib-~K({+XgrT0s;aS1qTOzK@b@k8B$kQC!c=$se$y-M<2<70|(9= zK73e?9zAOIrKP1wP*4!vcG}0sCk752W&hsqO28M@(gq)3zj+UI99NDvH zk9_jUC-U*f9~(f_v17+%|Ni}F080pqI&$QQ?B2awva_=#G&GdJ&cbOM5RyN)pXdK& z6Oqf{pb2n80Xq0qY;3F)78c6Befta`f>9Sy$B!R3Q1lF6@fC{sO|Qg1ILtDM^@fkbBN?kZuW!`tZXK)jekb z%K#-Xf+942UR}obold7DBqRu&Dsb#>0DHmP+q<{@dcJcFaJnNgzl%G4C^9lq)~{bL zwY9Ydf;GIXQb;FGoG@WWP`h^RI>S&SEQ(N6>N17Kzw7JkWzCv3CXWHwF@z+TE$?r? zzHhw&%n;nwr3kOzM?^$OR#uiYHa42hTSH5s=z9z`g`{D}j&I+-{S084ykrGtg=U4t zEfYV1rKF@Nu>S(EcmVUTUvGyukMZ&Gl9!ifatI+X#1shKWDPR~NH`2P zl{#eW)~#oD?ARgH&Ye43fbqLEB&}gdPzsH%+_r6-$z!O;1P(t7XemhkkJzvOAKC!q zD%`RAk$ap-sDE9zZk^QB)R>Fp5N~&m)j?MGSOHOV1UpRtO-)T_0Lyfku;4HQj4q=H z%nD6IQu7!^cXA(r@g^c)GM6zGVoOuDfcy*7;4u`Tj zh~izR2uG!1$IfrrvgHh55g6TNL|Cl>Q-@ihS;La=RaaM=oEZ}nBk0Ewq={Eh#P+cF zv)v6}+7rY2g2cqc4>xYyXhtvI`OiN4OirCT^>-teHBl2#YYtLSI_zuM5fpOGna!Iw z6PU?$3XBdTEOnYfQ(%-e@oQLe%kSrw-^H7poSZD|6Z#f{KK8Ts`+^%P=I)U1>eZ|N z!0MSNAc)`o_O~X)2*~OnYr@v;@4Z&apSlnEhw6)Khso*dM#x|Kd&p;j!RNTl8j{vr z#v4S)Wo2ci>IbyXp?CoNv7JMkZRX6G{ojB8eN(Ft3;}6Uwh#6ETfcqAgAwtL{2|3MZTOmUH*I84Eb`>RQd9uC*||UpFSt?TgwY|n6qx242#cUt&9@sAR zG6HQkC@#A)^ynyip=fuIR=`@^@nU(=JHG|-ynBY+VupN*pa{ZRz*=2KP=w00`gVb$ zqn0gOW^$AjkitL4o|olEHoq%N*;$W=G-!na)lZN+z8h>ZXfz)KA+bgwC@ZXQDneq1 zn*sHbEf*jjM_9&%gFVdDOJQ-V4x_s$D=b)D&j^{Q2g&n>`09Aa#%e zqFBsnVaKf&dO9R?q+tSOZeWg3F$|bTN>kG$@JDVE?zjd{=_B=yo>B)0t%>`oW>CGP z=B^3GArwm+0wXL1MrlZ@7&RQ>+YO4V2kGhQEszwBE|Qrrb5*%I3AIC_bP-OaL$u}y zCRc_)B_`8J?l()4qdT0^S8CC5s-_j`{(6_Is)u<WZ(?p$SPD!XrqI-31ck6` zKd8BL=bA~eb@fo^N$Ma1u>;aMmeoO&x`%LdtB|VEk@W+H$p*)@QrD@kR5^MWRkkAC z-wdj!RNpjGG7;LDnVF{JOc?}5Sslj2t5c=6))gM!R5i`79IW_AZrRyZnk zk2S;yM*%TM)FM};3>j@8)pxy7D$sGNycOyGDwm_GZWt;V5s{|Dys;Eh2B9(kP*#@_ zmWsgmD z0CBC9!6~J!i2Ha8%{a&f_3LQ5P9NtX-gjS6*#~)a3>M z=pluGKo#J%UAm9J)L9#+PLtS}7)gkaH%dxOl+^&nwQqHoI*cMX0;3cdT}JVV3`-$I zk*A$Qn~k8L7Emf{h&5SUL@AnI;ot5&);}R1YDY4Pf23A~b>^Z;;G#4;RK`AWFUmBJ?mX2ySsMlYA-PqZls1=Yp zNC6o*1mgl!Pd8z@U;v@8t3pLw9vmX;QB3A{y&f*oPF5S^rO)Hy~L_YhDGXY4LO zwVaT0u9c8rrX`y&r01hZ%*IH!={(|oN}ZK@$K4VU94rwbArcuHYJgGE;o%ZXSWq0m z#ld9;8f1s24%4Jhm+_}V$WQIhQE$Harup)gVcwpknV^|}=p2iK2!@bq0H+$2FIA3t zUrO%*l7ak^2S{0PRc0IFF$6_tr4AhgOk6CMahMEFn z{}`?pRdBL0C-v3a6a;ES-R=FrTVM)mxdFC8;+JlT_xLPQ4|~(ak6o5Ly%W zr$cmAs@nhwn=?m(mM)VJujLYqS$^osl@jLdEg{$vS_FVa0vHuVU~pJ8L(-MY=&)!4 zb0z*b8!&>psJR{|#p?jdUMwmk;~-c5p^GXBhc3cgstWU}N)&UM<9;eBa77-HcM3XA zZ8(p(pRnkvl(lGmR5%; zFed#NxQikz1x8R@W@-0&6h{J%3Tj<}pqDkqF5si^KQ>T*C5!GuyppZdN!^kZDC-twX&n)G85TRhTo;MHK*4 zwJBS2QR}Qnt(5hH-Uh;2gwpw>u+&v+?wcqZUYaHAX3Ug?XQoN~l&NN$IQ2P6diHrq znl@b$pPMd8sP0$Kcu|sPzAWJ`U||eNgeLP?n7_Y-yAnS~%Lu}PyC?$VZ{6uE*Ds7c z?Ht-{1jVHXmiTm33nbP<3^OKa%|nC)7gYifb5g|y47*pj8AybX3;=7|5RYM{PFQ}9 z&JyG31ZQ^;xg1xm!pn4SH;-pbXqi3 zCHt{S62i~~tPr@1BV{lXKSD7Sz(NTN?g~K;3q$_m&%5a;0t*ff_Ox?ov+0v!Cmcgi zl`cpX6r5D9kn-}RB5RYBr=}SvRba?1{Fx^@-Axi5Ka>Q7Ut8jF)M7^$SpYZ*4%Sbc z)Aa%bH$ZTcdPg5=0EjJACwFPQ47$SIyr!BQ?y~*L{<6EaesSGo4u5*{I zTQ3zDYAcW+*I>jVfcS5qM7Ux@kA9MQ-2lnyJxFqU50rejL6YBRkQDU2Sql3Nm7)P7 zrTFI2;vD87C8K^KC1b~%t#jl!DH=3N3i{wUd^T^`SP7Xs*Eox#Wx&#<;!jve*a3h= z1p!zvKoJ(}E4m8q^0aekvnePpY#A4EeHr0a4sd07&wxVyDnq!H!AWJPddqNEN&|xo zq&S2`3|ta@f#R_jrmJoG+diH%p1Rgu!ry&Yg6F<30dQ6zoaK)+;s;oM2t|JY^GEIq zL?{NrU98-hr`iRI$(%Wg$-D&;orI7p1*B5A$(fZUPC#<5UL!>qJ#tt1N-i!c4xrfi zs1BAwkMGq_R-?2DN1+;k(joxP^22rc!da`lyu=r1(*(ShRmc;5KyZj{`W-jV^w zBw-tZk#H4C9dArid~ox90BaRs`2f}`jN~zB(DF&RPxOmCM4b8zd=O6+$ zV8CHLwGyzr0FAKtvqToxZ@lrwzq9Xl7_GI-pvxbA_~BtMyzqi4%<@qJWTvMZckJC!5Ot1#l#E?(LKs-t1)Iq9e>KYuAl-YLUC(Awb1@wVAnDru;y&r%4@rTiO{sYMi26g55@#AlQ@x>QU5!SDN{cG{VaGJ%FAq1Up z7)QNwoRm|RD!{5iE~^O*le$GqT5^UxEIL9wZ)^{DsafeG)o>H9jn`;O8C-WUuDgg2 zL9z8mUgEP$=Hhwt=AC}!p`o5+B5M+S;{Ji$q_83#rFl+kz0S4GNZoyYH2_+wYLLapNW42p!6S{LEs7a5T%raJGm5-W5mJwNXDx1IHE!xAXwwr<8D%{_$td%&CnXEw zHuKRZB*UU~C=KtY;kYz>CKaF0z&RVz(xo0ZFdw5dD{wAr&zd#s?4(JPj(B)@grP4F zLL;E-psudIeq%`1W=26rGj0CsqXE!e0|pFu@2RJr+Wh+KuYbt}K2CQs=`b#{_yZFC84C?Dnfm7vNRwZw*X)x>X@xi6UvDuytj4jI@yNTTls4| zsL}Pyye5oNTcIZYLJwQ>YdzO{JdXQ$EVTt{zwf-o=%uPZA>|r3wz) z?JP0c1MMp*m3^gUW_y6bd;9VCLCW>FN{``|$LMQnFU0TLS?rX0gguK%7RUV8@xH#k zpCegk_vzDT2Ci+qqxq)t=5`36uWPJgS)lz0;{P`=s!NwHkKTX({ZX&I_S#Vby(8Ej!sn<1P(9|K zsc;ehcMUGUq2@aY2d#B;bDNB784LA=u68uvR9ggx>9+|$!@6>72Vm>!(v z6oKnMoJ{X)Y?Q;>x69F8yX5%p-Ev~zJ~_F6zns{+*XShvHm_aV<9qhV(VaWx7>+-( zV~5n0mrD|6{Cpt5|9%ADefWU~9tg$=rU}{&`k|xwCSLHAq$AtcC4Ntglyjy}pI(o! zJk3X7D^Lk%rKZY`h6ec%Fg^sNj}9G@j}IS~PoR(SntxNr4<3}`2M(CyxWvOpO;wRvB&1`<hKKI`kZA-?E9s9PUIYHm#Xuc`DIp0eD zxl~OPKl2!KhDVPcJ*G^UFk#KinKMuE_YJJaxX{mMg&zUbsgoz=I3Sgmm6_3N&YU^& z^2;y(CnoAyy?XVUj_NatO=UXzq9%0QZ-Hd%q7ezL!b#`#*A71%U}L-JF90t zxy5Al;63-;6MzK$0QL`eG*{4s%+G$W0oj{1@v{i*5B+S!h!L|UPMpa6a~Cwwac%|u zPX)-{tOYDX>RLxL9M(VIT7mdoZ*+`R---5r)AJF_PHdS$00000NkvXXu0mjf)>-aF literal 0 HcmV?d00001 diff --git a/services/web/test/unit/src/Subscription/SubscriptionControllerTests.js b/services/web/test/unit/src/Subscription/SubscriptionControllerTests.js index ffc771ee5a..8d46b2335e 100644 --- a/services/web/test/unit/src/Subscription/SubscriptionControllerTests.js +++ b/services/web/test/unit/src/Subscription/SubscriptionControllerTests.js @@ -404,6 +404,7 @@ describe('SubscriptionController', function () { title: 'thank_you', personalSubscription: 'foo', premiumFeaturesDiscoverability: false, + postCheckoutRedirect: undefined, }) done() }