From 11bc20c950b707d2e7f286037d03ce6fdca7a336 Mon Sep 17 00:00:00 2001 From: roo hutton Date: Thu, 30 Jan 2025 09:59:39 +0000 Subject: [PATCH] Merge pull request #23161 from overleaf/rh-pause-no-plan-change Prevent downgrade to personal plan during subscription pause GitOrigin-RevId: e3ba2e8e4d9b909fa2ee9c3c7e15db2ed257e43b --- .../cancel-plan/cancel-subscription.tsx | 4 +++- .../util/show-downgrade-option.ts | 7 ++++++- .../util/show-downgrade-option.test.ts | 21 +++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/services/web/frontend/js/features/subscription/components/dashboard/states/active/cancel-plan/cancel-subscription.tsx b/services/web/frontend/js/features/subscription/components/dashboard/states/active/cancel-plan/cancel-subscription.tsx index c50666b3fc..986d7b6716 100644 --- a/services/web/frontend/js/features/subscription/components/dashboard/states/active/cancel-plan/cancel-subscription.tsx +++ b/services/web/frontend/js/features/subscription/components/dashboard/states/active/cancel-plan/cancel-subscription.tsx @@ -164,7 +164,9 @@ export function CancelSubscription() { const showDowngrade = showDowngradeOption( personalSubscription.plan.planCode, personalSubscription.plan.groupPlan, - personalSubscription.recurly.trial_ends_at + personalSubscription.recurly.trial_ends_at, + personalSubscription.recurly.pausedAt, + personalSubscription.recurly.remainingPauseCycles ) const planToDowngradeTo = plans.find( plan => plan.planCode === planCodeToDowngradeTo diff --git a/services/web/frontend/js/features/subscription/util/show-downgrade-option.ts b/services/web/frontend/js/features/subscription/util/show-downgrade-option.ts index 95d32d6181..283823f481 100644 --- a/services/web/frontend/js/features/subscription/util/show-downgrade-option.ts +++ b/services/web/frontend/js/features/subscription/util/show-downgrade-option.ts @@ -1,12 +1,17 @@ +import { Nullable } from '../../../../../types/utils' import isInFreeTrial from './is-in-free-trial' import isMonthlyCollaboratorPlan from './is-monthly-collaborator-plan' export default function showDowngradeOption( planCode: string, isGroupPlan?: boolean, - trialEndsAt?: string | null + trialEndsAt?: string | null, + pausedAt?: Nullable, + remainingPauseCycles?: Nullable ) { return ( + !pausedAt && + !remainingPauseCycles && isMonthlyCollaboratorPlan(planCode, isGroupPlan) && !isInFreeTrial(trialEndsAt) ) diff --git a/services/web/test/frontend/features/subscription/util/show-downgrade-option.test.ts b/services/web/test/frontend/features/subscription/util/show-downgrade-option.test.ts index a7791efef4..8a464ac796 100644 --- a/services/web/test/frontend/features/subscription/util/show-downgrade-option.test.ts +++ b/services/web/test/frontend/features/subscription/util/show-downgrade-option.test.ts @@ -44,4 +44,25 @@ describe('showDowngradeOption', function () { showDowngradeOption('collaborator', false, '2000-02-16T17:59:07.000Z') ).to.be.true }) + it('returns false when on a monthly collaborator plan with a pending pause', function () { + expect( + showDowngradeOption( + 'collaborator', + false, + null, + '2030-01-01T12:00:00.000Z' + ) + ).to.be.false + }) + it('returns false when on a monthly collaborator plan with an active pause', function () { + expect( + showDowngradeOption( + 'collaborator', + false, + null, + '2030-01-01T12:00:00.000Z', + 5 + ) + ).to.be.false + }) })