tearing down split test (#17000)

GitOrigin-RevId: cdcca8635a81c697e9f91f31fb711ee420cc6f7d
This commit is contained in:
Davinder Singh 2024-02-13 11:50:57 +00:00 committed by Copybot
parent f2bea32dd8
commit c1f8647339
7 changed files with 14 additions and 179 deletions

View file

@ -365,28 +365,14 @@ async function projectListPage(req, res, next) {
let showInrGeoBanner, inrGeoBannerSplitTestName let showInrGeoBanner, inrGeoBannerSplitTestName
let inrGeoBannerVariant = 'default' let inrGeoBannerVariant = 'default'
let showLATAMBanner = false
let recommendedCurrency let recommendedCurrency
if (usersBestSubscription?.type === 'free') { if (usersBestSubscription?.type === 'free') {
const { currencyCode, countryCode } = const { countryCode } = await GeoIpLookup.promises.getCurrencyCode(req.ip)
await GeoIpLookup.promises.getCurrencyCode(req.ip)
// Split test is kept active, but all users geolocated in India can // Split test is kept active, but all users geolocated in India can
// now use the INR currency (See #13507) // now use the INR currency (See #13507)
const { variant: inrGeoPricingVariant } = const { variant: inrGeoPricingVariant } =
await SplitTestHandler.promises.getAssignment(req, res, 'geo-pricing-inr') await SplitTestHandler.promises.getAssignment(req, res, 'geo-pricing-inr')
const latamGeoPricingAssignment =
await SplitTestHandler.promises.getAssignment(
req,
res,
'geo-pricing-latam'
)
showLATAMBanner =
latamGeoPricingAssignment.variant === 'latam' &&
['BR', 'MX', 'CO', 'CL', 'PE'].includes(countryCode)
// LATAM Banner needs to know which currency to display
if (showLATAMBanner) {
recommendedCurrency = currencyCode
}
if (countryCode === 'IN') { if (countryCode === 'IN') {
inrGeoBannerSplitTestName = inrGeoBannerSplitTestName =
inrGeoPricingVariant === 'inr' inrGeoPricingVariant === 'inr'
@ -449,7 +435,6 @@ async function projectListPage(req, res, next) {
showGroupsAndEnterpriseBanner, showGroupsAndEnterpriseBanner,
groupsAndEnterpriseBannerVariant, groupsAndEnterpriseBannerVariant,
showWritefullPromoBanner, showWritefullPromoBanner,
showLATAMBanner,
recommendedCurrency, recommendedCurrency,
showInrGeoBanner, showInrGeoBanner,
inrGeoBannerVariant, inrGeoBannerVariant,

View file

@ -38,12 +38,8 @@ async function plansPage(req, res) {
if (GeoIpLookup.isValidCurrencyParam(queryCurrency)) { if (GeoIpLookup.isValidCurrencyParam(queryCurrency)) {
currency = queryCurrency currency = queryCurrency
} }
const { const { recommendedCurrency, countryCode, geoPricingINRTestVariant } =
recommendedCurrency, await _getRecommendedCurrency(req, res)
countryCode,
geoPricingINRTestVariant,
geoPricingLATAMTestVariant,
} = await _getRecommendedCurrency(req, res)
if (recommendedCurrency && currency == null) { if (recommendedCurrency && currency == null) {
currency = recommendedCurrency currency = recommendedCurrency
} }
@ -102,12 +98,6 @@ async function plansPage(req, res) {
countryCode, countryCode,
'geo-pricing-inr-group': geoPricingINRTestVariant, 'geo-pricing-inr-group': geoPricingINRTestVariant,
'geo-pricing-inr-page': currency === 'INR' ? 'inr' : 'default', 'geo-pricing-inr-page': currency === 'INR' ? 'inr' : 'default',
'geo-pricing-latam-group': geoPricingLATAMTestVariant,
'geo-pricing-latam-page': ['BRL', 'MXN', 'COP', 'CLP', 'PEN'].includes(
currency
)
? 'latam'
: 'default',
'annual-trials': annualTrialsAssignment.variant, 'annual-trials': annualTrialsAssignment.variant,
'website-redesign': websiteRedesignVariant, 'website-redesign': websiteRedesignVariant,
} }
@ -247,12 +237,8 @@ async function userSubscriptionPage(req, res) {
async function interstitialPaymentPage(req, res) { async function interstitialPaymentPage(req, res) {
const user = SessionManager.getSessionUser(req.session) const user = SessionManager.getSessionUser(req.session)
const { const { recommendedCurrency, countryCode, geoPricingINRTestVariant } =
recommendedCurrency, await _getRecommendedCurrency(req, res)
countryCode,
geoPricingINRTestVariant,
geoPricingLATAMTestVariant,
} = await _getRecommendedCurrency(req, res)
const hasSubscription = const hasSubscription =
await LimitationsManager.promises.userHasV1OrV2Subscription(user) await LimitationsManager.promises.userHasV1OrV2Subscription(user)
@ -289,12 +275,6 @@ async function interstitialPaymentPage(req, res) {
countryCode, countryCode,
'geo-pricing-inr-group': geoPricingINRTestVariant, 'geo-pricing-inr-group': geoPricingINRTestVariant,
'geo-pricing-inr-page': recommendedCurrency === 'INR' ? 'inr' : 'default', 'geo-pricing-inr-page': recommendedCurrency === 'INR' ? 'inr' : 'default',
'geo-pricing-latam-group': geoPricingLATAMTestVariant,
'geo-pricing-latam-page': ['BRL', 'MXN', 'COP', 'CLP', 'PEN'].includes(
recommendedCurrency
)
? 'latam'
: 'default',
'annual-trials': annualTrialsAssignment.variant, 'annual-trials': annualTrialsAssignment.variant,
} }
if (inrGeoBannerSplitTestName) { if (inrGeoBannerSplitTestName) {
@ -653,23 +633,15 @@ async function _getRecommendedCurrency(req, res) {
res, res,
'geo-pricing-inr' 'geo-pricing-inr'
) )
// for #13559
const assignmentLATAM = await SplitTestHandler.promises.getAssignment( if (['BRL', 'MXN', 'COP', 'CLP', 'PEN'].includes(recommendedCurrency)) {
req,
res,
'geo-pricing-latam'
)
if (
['BRL', 'MXN', 'COP', 'CLP', 'PEN'].includes(recommendedCurrency) &&
assignmentLATAM?.variant !== 'latam'
) {
recommendedCurrency = GeoIpLookup.DEFAULT_CURRENCY_CODE recommendedCurrency = GeoIpLookup.DEFAULT_CURRENCY_CODE
} }
return { return {
recommendedCurrency, recommendedCurrency,
countryCode, countryCode,
geoPricingINRTestVariant: assignmentINR?.variant, geoPricingINRTestVariant: assignmentINR?.variant,
geoPricingLATAMTestVariant: assignmentLATAM?.variant,
} }
} }

View file

@ -31,7 +31,6 @@ block append meta
meta(name="ol-showInrGeoBanner" data-type="boolean" content=showInrGeoBanner) meta(name="ol-showInrGeoBanner" data-type="boolean" content=showInrGeoBanner)
meta(name="ol-inrGeoBannerVariant" data-type="string" content=inrGeoBannerVariant) meta(name="ol-inrGeoBannerVariant" data-type="string" content=inrGeoBannerVariant)
meta(name="ol-inrGeoBannerSplitTestName" data-type="string" content=inrGeoBannerSplitTestName) 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-recommendedCurrency" data-type="string" content=recommendedCurrency)
meta(name="ol-groupSubscriptionsPendingEnrollment" data-type="json" content=groupSubscriptionsPendingEnrollment) meta(name="ol-groupSubscriptionsPendingEnrollment" data-type="json" content=groupSubscriptionsPendingEnrollment)
meta(name="ol-hasIndividualRecurlySubscription" data-type="boolean" content=hasIndividualRecurlySubscription) meta(name="ol-hasIndividualRecurlySubscription" data-type="boolean" content=hasIndividualRecurlySubscription)

View file

@ -640,7 +640,6 @@
"last_resort_trouble_shooting_guide": "", "last_resort_trouble_shooting_guide": "",
"last_updated_date_by_x": "", "last_updated_date_by_x": "",
"last_used": "", "last_used": "",
"latam_discount_offer": "",
"latex_places_figures_according_to_a_special_algorithm": "", "latex_places_figures_according_to_a_special_algorithm": "",
"latex_places_tables_according_to_a_special_algorithm": "", "latex_places_tables_according_to_a_special_algorithm": "",
"layout": "", "layout": "",

View file

@ -1,114 +0,0 @@
import { useCallback, useEffect, useRef } from 'react'
import { Trans, useTranslation } from 'react-i18next'
import usePersistedState from '../../../../../shared/hooks/use-persisted-state'
import Notification from '../notification'
import * as eventTracking from '../../../../../infrastructure/event-tracking'
import { Button } from 'react-bootstrap'
import getMeta from '../../../../../utils/meta'
const LATAM_CURRENCIES = {
BRL: { name: 'Reais', discount: '50', flag: '🇧🇷' },
MXN: { name: 'Pesos', discount: '40', flag: '🇲🇽' },
COP: { name: 'Pesos', discount: '70', flag: '🇨🇴' },
CLP: { name: 'Pesos', discount: '45', flag: '🇨🇱' },
PEN: { name: 'Soles', discount: '50', flag: '🇵🇪' },
}
export default function LATAMBanner() {
const { t } = useTranslation()
const newNotificationStyle = getMeta(
'ol-newNotificationStyle',
false
) as boolean
const [dismissedAt, setDismissedAt] = usePersistedState<Date | undefined>(
`has_dismissed_latam_banner`
)
const viewEventSent = useRef<boolean>(false)
useEffect(() => {
if (!dismissedAt) {
return
}
const dismissedAtDate = new Date(dismissedAt)
const recentlyDismissedCutoff = new Date()
recentlyDismissedCutoff.setDate(recentlyDismissedCutoff.getDate() - 30) // 30 days
// once dismissedAt passes the cut-off mark, banner will be shown again
if (dismissedAtDate <= recentlyDismissedCutoff) {
setDismissedAt(undefined)
}
}, [dismissedAt, setDismissedAt])
useEffect(() => {
if (!dismissedAt && !viewEventSent.current) {
eventTracking.sendMB('promo-prompt', {
location: 'dashboard-banner',
name: 'geo-pricing-latam',
content: 'blue',
})
viewEventSent.current = true
}
}, [dismissedAt])
const handleClick = useCallback(() => {
eventTracking.sendMB('promo-click', {
location: 'dashboard-banner',
name: 'geo-pricing-latam',
content: 'blue',
type: 'click',
})
window.open('/user/subscription/plans')
}, [])
const handleDismiss = useCallback(() => {
eventTracking.sendMB('promo-dismiss', {
location: 'dashboard-banner',
name: 'geo-pricing-latam',
content: 'blue',
})
setDismissedAt(new Date())
}, [setDismissedAt])
if (dismissedAt) {
return null
}
// Safety, but should always be a valid LATAM currency if ol-showLATAMBanner is true
const currency = getMeta('ol-recommendedCurrency')
if (!(currency in LATAM_CURRENCIES)) {
return null
}
const {
flag,
name: currencyName,
discount: discountPercent,
} = LATAM_CURRENCIES[currency as keyof typeof LATAM_CURRENCIES]
return (
<Notification
bsStyle="info"
onDismiss={() => handleDismiss()}
body={
<Trans
i18nKey="latam_discount_offer"
components={[<b />]} // eslint-disable-line react/jsx-key
values={{ flag, currencyName, discountPercent }}
shouldUnescape
tOptions={{ interpolation: { escapeValue: true } }}
/>
}
action={
<Button
bsStyle={newNotificationStyle ? null : 'info'}
bsSize="sm"
className={newNotificationStyle ? 'btn-secondary' : 'pull-right'}
onClick={handleClick}
>
{t('get_discounted_plan')}
</Button>
}
/>
)
}

View file

@ -8,7 +8,6 @@ import WritefullPromoBanner from './writefull-promo-banner'
import WritefullPremiumPromoBanner from './writefull-premium-promo-banner' import WritefullPremiumPromoBanner from './writefull-premium-promo-banner'
import GroupSsoSetupSuccess from './groups/group-sso-setup-success' import GroupSsoSetupSuccess from './groups/group-sso-setup-success'
import INRBanner from './ads/inr-banner' import INRBanner from './ads/inr-banner'
import LATAMBanner from './ads/latam-banner'
import getMeta from '../../../../utils/meta' import getMeta from '../../../../utils/meta'
import importOverleafModules from '../../../../../macros/import-overleaf-module.macro' import importOverleafModules from '../../../../../macros/import-overleaf-module.macro'
import customLocalStorage from '../../../../infrastructure/local-storage' import customLocalStorage from '../../../../infrastructure/local-storage'
@ -50,7 +49,6 @@ function UserNotifications() {
'ol-inrGeoBannerSplitTestName', 'ol-inrGeoBannerSplitTestName',
'unassigned' 'unassigned'
) )
const showLATAMBanner = getMeta('ol-showLATAMBanner', false)
const writefullIntegrationSplitTestEnabled = isSplitTestEnabled( const writefullIntegrationSplitTestEnabled = isSplitTestEnabled(
'writefull-integration' 'writefull-integration'
) )
@ -107,18 +105,15 @@ function UserNotifications() {
<Institution /> <Institution />
<ConfirmEmail /> <ConfirmEmail />
<ReconfirmationInfo /> <ReconfirmationInfo />
{!showLATAMBanner && {!showInrGeoBanner && !showWritefull && !dismissedWritefull && (
!showInrGeoBanner && <GroupsAndEnterpriseBanner />
!showWritefull && )}
!dismissedWritefull && <GroupsAndEnterpriseBanner />} {showInrGeoBanner && (
{showLATAMBanner ? (
<LATAMBanner />
) : showInrGeoBanner ? (
<INRBanner <INRBanner
variant={inrGeoBannerVariant} variant={inrGeoBannerVariant}
splitTestName={inrGeoBannerSplitTestName} splitTestName={inrGeoBannerSplitTestName}
/> />
) : null} )}
{writefullIntegrationSplitTestEnabled || user?.writefull?.enabled ? ( {writefullIntegrationSplitTestEnabled || user?.writefull?.enabled ? (
<WritefullPremiumPromoBanner <WritefullPremiumPromoBanner
show={showWritefull} show={showWritefull}

View file

@ -964,7 +964,6 @@
"last_updated": "Last Updated", "last_updated": "Last Updated",
"last_updated_date_by_x": "__lastUpdatedDate__ by __person__", "last_updated_date_by_x": "__lastUpdatedDate__ by __person__",
"last_used": "last used", "last_used": "last used",
"latam_discount_offer": "__flag__ Good news! You can now use __currencyName__ to pay for an Overleaf subscription, giving you a <0>__discountPercent__% discount</0> on our premium features.",
"latex_articles_page_summary": "Papers, presentations, reports and more, written in LaTeX and published by our community. Search or browse below.", "latex_articles_page_summary": "Papers, presentations, reports and more, written in LaTeX and published by our community. Search or browse below.",
"latex_articles_page_title": "Articles - Papers, Presentations, Reports and more", "latex_articles_page_title": "Articles - Papers, Presentations, Reports and more",
"latex_editor_info": "Everything you need in a modern LaTeX editor --- spell check, intelligent autocomplete, syntax highlighting, dozens of color themes, vim and emacs bindings, help with LaTeX warnings and error messages, and much more.", "latex_editor_info": "Everything you need in a modern LaTeX editor --- spell check, intelligent autocomplete, syntax highlighting, dozens of color themes, vim and emacs bindings, help with LaTeX warnings and error messages, and much more.",