diff --git a/ghost/portal/src/App.js b/ghost/portal/src/App.js index 4f41c95443..3581e1f077 100644 --- a/ghost/portal/src/App.js +++ b/ghost/portal/src/App.js @@ -10,7 +10,7 @@ import {getActivePage, isAccountPage, isOfferPage} from './pages'; import ActionHandler from './actions'; import './App.css'; import NotificationParser from './utils/notifications'; -import {createPopupNotification, getCurrencySymbol, getFirstpromoterId, getPriceIdFromPageQuery, getProductCadenceFromPrice, getProductFromId, getQueryPrice, getSiteDomain, isActiveOffer, isInviteOnlySite, isPaidMember, isSentryEventAllowed, removePortalLinkFromUrl} from './utils/helpers'; +import {allowCompMemberUpgrade, createPopupNotification, getCurrencySymbol, getFirstpromoterId, getPriceIdFromPageQuery, getProductCadenceFromPrice, getProductFromId, getQueryPrice, getSiteDomain, isActiveOffer, isComplimentaryMember, isInviteOnlySite, isPaidMember, isSentryEventAllowed, removePortalLinkFromUrl} from './utils/helpers'; const {handleDataAttributes} = require('./data-attributes'); const React = require('react'); @@ -752,6 +752,10 @@ export default class App extends React.Component { page = member ? 'accountHome' : loggedOutPage; } + if (page === 'accountPlan' && isComplimentaryMember({member}) && !allowCompMemberUpgrade({member})) { + page = 'accountHome'; + } + return getActivePage({page}); } diff --git a/ghost/portal/src/components/pages/AccountHomePage.js b/ghost/portal/src/components/pages/AccountHomePage.js index da8414a150..9326b540e9 100644 --- a/ghost/portal/src/components/pages/AccountHomePage.js +++ b/ghost/portal/src/components/pages/AccountHomePage.js @@ -3,7 +3,7 @@ import MemberAvatar from '../common/MemberGravatar'; import ActionButton from '../common/ActionButton'; import CloseButton from '../common/CloseButton'; import Switch from '../common/Switch'; -import {getMemberSubscription, getMemberTierName, getSiteNewsletters, getSupportAddress, getUpdatedOfferPrice, hasCommentsEnabled, hasMultipleNewsletters, hasMultipleProductsFeature, hasOnlyFreePlan, isComplimentaryMember, subscriptionHasFreeTrial} from '../../utils/helpers'; +import {allowCompMemberUpgrade, getMemberSubscription, getMemberTierName, getSiteNewsletters, getSupportAddress, getUpdatedOfferPrice, hasCommentsEnabled, hasMultipleNewsletters, hasMultipleProductsFeature, hasOnlyFreePlan, isComplimentaryMember, subscriptionHasFreeTrial} from '../../utils/helpers'; import {getDateString} from '../../utils/date-time'; import {ReactComponent as LoaderIcon} from '../../images/icons/loader.svg'; import {ReactComponent as OfferTagIcon} from '../../images/icons/offer-tag.svg'; @@ -274,8 +274,9 @@ const PaidAccountActions = () => { ); }; - const PlanUpdateButton = () => { - if (hasOnlyFreePlan({site})) { + const PlanUpdateButton = ({isComplimentary}) => { + const hideUpgrade = allowCompMemberUpgrade({member}) ? false : isComplimentary; + if (hideUpgrade || hasOnlyFreePlan({site})) { return null; } return ( diff --git a/ghost/portal/src/components/pages/AccountPlanPage.js b/ghost/portal/src/components/pages/AccountPlanPage.js index f6893cc908..416c2280fd 100644 --- a/ghost/portal/src/components/pages/AccountPlanPage.js +++ b/ghost/portal/src/components/pages/AccountPlanPage.js @@ -5,7 +5,7 @@ import CloseButton from '../common/CloseButton'; import BackButton from '../common/BackButton'; import {MultipleProductsPlansSection} from '../common/PlansSection'; import {getDateString} from '../../utils/date-time'; -import {formatNumber, getAvailablePrices, getFilteredPrices, getMemberActivePrice, getMemberSubscription, getPriceFromSubscription, getProductFromPrice, getSubscriptionFromId, getUpgradeProducts, hasMultipleProductsFeature, isComplimentaryMember, isPaidMember} from '../../utils/helpers'; +import {allowCompMemberUpgrade, formatNumber, getAvailablePrices, getFilteredPrices, getMemberActivePrice, getMemberSubscription, getPriceFromSubscription, getProductFromPrice, getSubscriptionFromId, getUpgradeProducts, hasMultipleProductsFeature, isComplimentaryMember, isPaidMember} from '../../utils/helpers'; export const AccountPlanPageStyles = ` .account-plan.full-size .gh-portal-main-title { @@ -262,7 +262,8 @@ const PlansContainer = ({ }) => { const {member} = useContext(AppContext); // Plan upgrade flow for free member - if (!isPaidMember({member}) || isComplimentaryMember({member})) { + const allowUpgrade = allowCompMemberUpgrade({member}) && isComplimentaryMember({member}); + if (!isPaidMember({member}) || allowUpgrade) { return ( { this.setState(() => { diff --git a/ghost/portal/src/utils/helpers.js b/ghost/portal/src/utils/helpers.js index 8695bd4487..5af1a1cd0f 100644 --- a/ghost/portal/src/utils/helpers.js +++ b/ghost/portal/src/utils/helpers.js @@ -84,6 +84,10 @@ export function getNewsletterFromUuid({site, uuid}) { }); } +export function allowCompMemberUpgrade({member}) { + return member?.subscriptions?.[0]?.tier?.expiry_at !== undefined; +} + export function getUpgradeProducts({site, member}) { const activePrice = getMemberActivePrice({member}); const activePriceCurrency = activePrice?.currency; @@ -818,7 +822,7 @@ export function getUrlHistory() { } catch (error) { // Failed to access localStorage or something related to that. // Log a warning, as this shouldn't happen on a modern browser. - + /* eslint-disable no-console */ console.warn(`[Portal] Failed to load member URL history:`, error); }