mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-01 23:21:11 -05:00
Merge pull request #10958 from overleaf/jel-features-page-link
[web] Update features page link on dash for split test GitOrigin-RevId: 5b51700a8a4ca89920288b54e08caf88f29dec96
This commit is contained in:
parent
4ba2fffdf1
commit
38db8bee30
7 changed files with 110 additions and 27 deletions
|
@ -2,9 +2,16 @@ import { useTranslation, Trans } from 'react-i18next'
|
||||||
import { CommonsPlanSubscription } from '../../../../../../types/project/dashboard/subscription'
|
import { CommonsPlanSubscription } from '../../../../../../types/project/dashboard/subscription'
|
||||||
import Tooltip from '../../../../shared/components/tooltip'
|
import Tooltip from '../../../../shared/components/tooltip'
|
||||||
|
|
||||||
type CommonsPlanProps = Pick<CommonsPlanSubscription, 'subscription' | 'plan'>
|
type CommonsPlanProps = Pick<
|
||||||
|
CommonsPlanSubscription,
|
||||||
|
'subscription' | 'plan' | 'featuresPageURL'
|
||||||
|
>
|
||||||
|
|
||||||
function CommonsPlan({ subscription, plan }: CommonsPlanProps) {
|
function CommonsPlan({
|
||||||
|
featuresPageURL,
|
||||||
|
subscription,
|
||||||
|
plan,
|
||||||
|
}: CommonsPlanProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const currentPlanLabel = (
|
const currentPlanLabel = (
|
||||||
<Trans i18nKey="premium_plan_label" components={{ b: <strong /> }} />
|
<Trans i18nKey="premium_plan_label" components={{ b: <strong /> }} />
|
||||||
|
@ -21,10 +28,7 @@ function CommonsPlan({ subscription, plan }: CommonsPlanProps) {
|
||||||
id="commons-plan"
|
id="commons-plan"
|
||||||
overlayProps={{ placement: 'bottom' }}
|
overlayProps={{ placement: 'bottom' }}
|
||||||
>
|
>
|
||||||
<a
|
<a href={featuresPageURL} className="current-plan-label hidden-xs">
|
||||||
href="/learn/how-to/Overleaf_premium_features"
|
|
||||||
className="current-plan-label hidden-xs"
|
|
||||||
>
|
|
||||||
{currentPlanLabel} <span className="info-badge" />
|
{currentPlanLabel} <span className="info-badge" />
|
||||||
</a>
|
</a>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
|
@ -20,10 +20,16 @@ function CurrentPlanWidget() {
|
||||||
const isGroupPlan = type === 'group'
|
const isGroupPlan = type === 'group'
|
||||||
const isCommonsPlan = type === 'commons'
|
const isCommonsPlan = type === 'commons'
|
||||||
|
|
||||||
|
const newFeaturesPageVariant =
|
||||||
|
getMeta('ol-splitTestVariants')?.['features-page'] === 'new'
|
||||||
|
const featuresPageURL = newFeaturesPageVariant
|
||||||
|
? '/about/features-overview'
|
||||||
|
: '/learn/how-to/Overleaf_premium_features'
|
||||||
|
|
||||||
let currentPlan
|
let currentPlan
|
||||||
|
|
||||||
if (isFreePlan) {
|
if (isFreePlan) {
|
||||||
currentPlan = <FreePlan />
|
currentPlan = <FreePlan featuresPageURL={featuresPageURL} />
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isIndividualPlan) {
|
if (isIndividualPlan) {
|
||||||
|
@ -31,6 +37,7 @@ function CurrentPlanWidget() {
|
||||||
<IndividualPlan
|
<IndividualPlan
|
||||||
remainingTrialDays={usersBestSubscription.remainingTrialDays}
|
remainingTrialDays={usersBestSubscription.remainingTrialDays}
|
||||||
plan={usersBestSubscription.plan}
|
plan={usersBestSubscription.plan}
|
||||||
|
featuresPageURL={featuresPageURL}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -41,6 +48,7 @@ function CurrentPlanWidget() {
|
||||||
subscription={usersBestSubscription.subscription}
|
subscription={usersBestSubscription.subscription}
|
||||||
remainingTrialDays={usersBestSubscription.remainingTrialDays}
|
remainingTrialDays={usersBestSubscription.remainingTrialDays}
|
||||||
plan={usersBestSubscription.plan}
|
plan={usersBestSubscription.plan}
|
||||||
|
featuresPageURL={featuresPageURL}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -50,6 +58,7 @@ function CurrentPlanWidget() {
|
||||||
<CommonsPlan
|
<CommonsPlan
|
||||||
subscription={usersBestSubscription.subscription}
|
subscription={usersBestSubscription.subscription}
|
||||||
plan={usersBestSubscription.plan}
|
plan={usersBestSubscription.plan}
|
||||||
|
featuresPageURL={featuresPageURL}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
import { useTranslation, Trans } from 'react-i18next'
|
import { useTranslation, Trans } from 'react-i18next'
|
||||||
import { Button } from 'react-bootstrap'
|
import { Button } from 'react-bootstrap'
|
||||||
|
import { FreePlanSubscription } from '../../../../../../types/project/dashboard/subscription'
|
||||||
import Tooltip from '../../../../shared/components/tooltip'
|
import Tooltip from '../../../../shared/components/tooltip'
|
||||||
import * as eventTracking from '../../../../infrastructure/event-tracking'
|
import * as eventTracking from '../../../../infrastructure/event-tracking'
|
||||||
|
|
||||||
function FreePlan() {
|
type FreePlanProps = Pick<FreePlanSubscription, 'featuresPageURL'>
|
||||||
|
|
||||||
|
function FreePlan({ featuresPageURL }: FreePlanProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const currentPlanLabel = (
|
const currentPlanLabel = (
|
||||||
<Trans i18nKey="free_plan_label" components={{ b: <strong /> }} />
|
<Trans i18nKey="free_plan_label" components={{ b: <strong /> }} />
|
||||||
|
@ -21,10 +24,7 @@ function FreePlan() {
|
||||||
id="free-plan"
|
id="free-plan"
|
||||||
overlayProps={{ placement: 'bottom' }}
|
overlayProps={{ placement: 'bottom' }}
|
||||||
>
|
>
|
||||||
<a
|
<a href={featuresPageURL} className="current-plan-label hidden-xs">
|
||||||
href="/learn/how-to/Overleaf_premium_features"
|
|
||||||
className="current-plan-label hidden-xs"
|
|
||||||
>
|
|
||||||
{currentPlanLabel} <span className="info-badge" />
|
{currentPlanLabel} <span className="info-badge" />
|
||||||
</a>
|
</a>
|
||||||
</Tooltip>{' '}
|
</Tooltip>{' '}
|
||||||
|
|
|
@ -4,10 +4,15 @@ import Tooltip from '../../../../shared/components/tooltip'
|
||||||
|
|
||||||
type GroupPlanProps = Pick<
|
type GroupPlanProps = Pick<
|
||||||
GroupPlanSubscription,
|
GroupPlanSubscription,
|
||||||
'subscription' | 'plan' | 'remainingTrialDays'
|
'subscription' | 'plan' | 'remainingTrialDays' | 'featuresPageURL'
|
||||||
>
|
>
|
||||||
|
|
||||||
function GroupPlan({ subscription, plan, remainingTrialDays }: GroupPlanProps) {
|
function GroupPlan({
|
||||||
|
featuresPageURL,
|
||||||
|
subscription,
|
||||||
|
plan,
|
||||||
|
remainingTrialDays,
|
||||||
|
}: GroupPlanProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const currentPlanLabel =
|
const currentPlanLabel =
|
||||||
remainingTrialDays >= 0 ? (
|
remainingTrialDays >= 0 ? (
|
||||||
|
@ -39,10 +44,7 @@ function GroupPlan({ subscription, plan, remainingTrialDays }: GroupPlanProps) {
|
||||||
id="group-plan"
|
id="group-plan"
|
||||||
overlayProps={{ placement: 'bottom' }}
|
overlayProps={{ placement: 'bottom' }}
|
||||||
>
|
>
|
||||||
<a
|
<a href={featuresPageURL} className="current-plan-label hidden-xs">
|
||||||
href="/learn/how-to/Overleaf_premium_features"
|
|
||||||
className="current-plan-label hidden-xs"
|
|
||||||
>
|
|
||||||
{currentPlanLabel} <span className="info-badge" />
|
{currentPlanLabel} <span className="info-badge" />
|
||||||
</a>
|
</a>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
|
@ -4,10 +4,14 @@ import Tooltip from '../../../../shared/components/tooltip'
|
||||||
|
|
||||||
type IndividualPlanProps = Pick<
|
type IndividualPlanProps = Pick<
|
||||||
IndividualPlanSubscription,
|
IndividualPlanSubscription,
|
||||||
'plan' | 'remainingTrialDays'
|
'plan' | 'remainingTrialDays' | 'featuresPageURL'
|
||||||
>
|
>
|
||||||
|
|
||||||
function IndividualPlan({ plan, remainingTrialDays }: IndividualPlanProps) {
|
function IndividualPlan({
|
||||||
|
featuresPageURL,
|
||||||
|
plan,
|
||||||
|
remainingTrialDays,
|
||||||
|
}: IndividualPlanProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const currentPlanLabel =
|
const currentPlanLabel =
|
||||||
remainingTrialDays >= 0 ? (
|
remainingTrialDays >= 0 ? (
|
||||||
|
@ -32,10 +36,7 @@ function IndividualPlan({ plan, remainingTrialDays }: IndividualPlanProps) {
|
||||||
id="individual-plan"
|
id="individual-plan"
|
||||||
overlayProps={{ placement: 'bottom' }}
|
overlayProps={{ placement: 'bottom' }}
|
||||||
>
|
>
|
||||||
<a
|
<a href={featuresPageURL} className="current-plan-label hidden-xs">
|
||||||
href="/learn/how-to/Overleaf_premium_features"
|
|
||||||
className="current-plan-label hidden-xs"
|
|
||||||
>
|
|
||||||
{currentPlanLabel} <span className="info-badge" />
|
{currentPlanLabel} <span className="info-badge" />
|
||||||
</a>
|
</a>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
|
|
|
@ -243,4 +243,67 @@ describe('<CurrentPlanWidget />', function () {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('features page split test', function () {
|
||||||
|
const variants = [
|
||||||
|
{ name: 'default', link: '/learn/how-to/Overleaf_premium_features' },
|
||||||
|
{ name: 'new', link: '/about/features-overview' },
|
||||||
|
]
|
||||||
|
|
||||||
|
const plans = [
|
||||||
|
{ type: 'free' },
|
||||||
|
{
|
||||||
|
type: 'individual',
|
||||||
|
plan: {
|
||||||
|
name: 'Abc',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'group',
|
||||||
|
plan: {
|
||||||
|
name: 'Abc',
|
||||||
|
},
|
||||||
|
subscription: {
|
||||||
|
teamName: 'Example Team',
|
||||||
|
name: 'Example Name',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'commons',
|
||||||
|
plan: {
|
||||||
|
name: 'Abc',
|
||||||
|
},
|
||||||
|
subscription: {
|
||||||
|
name: 'Example Name',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
for (const variant of variants) {
|
||||||
|
describe(`${variant.name} variant`, function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
window.metaAttributesCache.set('ol-splitTestVariants', {
|
||||||
|
'features-page': variant.name,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
afterEach(function () {
|
||||||
|
window.metaAttributesCache.delete('ol-splitTestVariants')
|
||||||
|
})
|
||||||
|
|
||||||
|
for (const plan of plans) {
|
||||||
|
it(`links to ${variant.name} features page on ${plan.type} plan`, function () {
|
||||||
|
window.metaAttributesCache.set('ol-usersBestSubscription', {
|
||||||
|
...plan,
|
||||||
|
})
|
||||||
|
render(<CurrentPlanWidget />)
|
||||||
|
|
||||||
|
const links = screen.getAllByRole('link')
|
||||||
|
expect(links[0].getAttribute('href')).to.equal(variant.link)
|
||||||
|
|
||||||
|
window.metaAttributesCache.delete('ol-usersBestSubscription')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
type FreePlanSubscription = {
|
type SubscriptionBase = {
|
||||||
type: 'free'
|
featuresPageURL: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type FreePlanSubscription = {
|
||||||
|
type: 'free'
|
||||||
|
} & SubscriptionBase
|
||||||
|
|
||||||
type FreeSubscription = FreePlanSubscription
|
type FreeSubscription = FreePlanSubscription
|
||||||
|
|
||||||
type PaidSubscriptionBase = {
|
type PaidSubscriptionBase = {
|
||||||
|
@ -12,7 +16,7 @@ type PaidSubscriptionBase = {
|
||||||
teamName?: string
|
teamName?: string
|
||||||
name: string
|
name: string
|
||||||
}
|
}
|
||||||
}
|
} & SubscriptionBase
|
||||||
|
|
||||||
export type IndividualPlanSubscription = {
|
export type IndividualPlanSubscription = {
|
||||||
type: 'individual'
|
type: 'individual'
|
||||||
|
|
Loading…
Reference in a new issue