mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-14 14:13:43 +01:00
Merge pull request #25251 from overleaf/jdt-show-wf-provided-bundle-on-free-plans
Show AI Assist entitlment via Writefull on free user's subscriptions page GitOrigin-RevId: 20a456a231f60df279b949057972125735166904
This commit is contained in:
committed by
Copybot
parent
54505437d4
commit
a4cfecb2aa
@@ -1,10 +1,15 @@
|
|||||||
import { useTranslation, Trans } from 'react-i18next'
|
import { useTranslation, Trans } from 'react-i18next'
|
||||||
|
import WritefullManagedBundleAddOn from '@/features/subscription/components/dashboard/states/active/change-plan/modals/writefull-bundle-management-modal'
|
||||||
|
import RedirectAlerts from './redirect-alerts'
|
||||||
|
import getMeta from '@/utils/meta'
|
||||||
|
|
||||||
function FreePlan() {
|
function FreePlan() {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
const hasAiAssistViaWritefull = getMeta('ol-hasAiAssistViaWritefull')
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<RedirectAlerts />
|
||||||
<Trans
|
<Trans
|
||||||
i18nKey="on_free_plan_upgrade_to_access_features"
|
i18nKey="on_free_plan_upgrade_to_access_features"
|
||||||
components={[
|
components={[
|
||||||
@@ -26,6 +31,12 @@ function FreePlan() {
|
|||||||
<a className="btn btn-primary me-1" href="/user/subscription/plans">
|
<a className="btn btn-primary me-1" href="/user/subscription/plans">
|
||||||
{t('upgrade_now')}
|
{t('upgrade_now')}
|
||||||
</a>
|
</a>
|
||||||
|
{hasAiAssistViaWritefull && (
|
||||||
|
<>
|
||||||
|
<h2 className="h3 fw-bold">{t('add_ons')}</h2>
|
||||||
|
<WritefullManagedBundleAddOn />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-21
@@ -7,6 +7,7 @@ import { ExpiredSubscription } from './states/expired'
|
|||||||
import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
|
import { useSubscriptionDashboardContext } from '../../context/subscription-dashboard-context'
|
||||||
import PersonalSubscriptionRecurlySyncEmail from './personal-subscription-recurly-sync-email'
|
import PersonalSubscriptionRecurlySyncEmail from './personal-subscription-recurly-sync-email'
|
||||||
import OLNotification from '@/features/ui/components/ol/ol-notification'
|
import OLNotification from '@/features/ui/components/ol/ol-notification'
|
||||||
|
import RedirectAlerts from './redirect-alerts'
|
||||||
|
|
||||||
function PastDueSubscriptionAlert({
|
function PastDueSubscriptionAlert({
|
||||||
subscription,
|
subscription,
|
||||||
@@ -33,27 +34,6 @@ function PastDueSubscriptionAlert({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function RedirectAlerts() {
|
|
||||||
const queryParams = new URLSearchParams(window.location.search)
|
|
||||||
const redirectReason = queryParams.get('redirect-reason')
|
|
||||||
const { t } = useTranslation()
|
|
||||||
|
|
||||||
if (!redirectReason) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
let warning
|
|
||||||
if (redirectReason === 'writefull-entitled') {
|
|
||||||
warning = t('good_news_you_are_already_receiving_this_add_on_via_writefull')
|
|
||||||
} else if (redirectReason === 'double-buy') {
|
|
||||||
warning = t('good_news_you_already_purchased_this_add_on')
|
|
||||||
} else {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
return <OLNotification type="warning" content={<>{warning}</>} />
|
|
||||||
}
|
|
||||||
|
|
||||||
function PersonalSubscriptionStates({
|
function PersonalSubscriptionStates({
|
||||||
subscription,
|
subscription,
|
||||||
}: {
|
}: {
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import OLNotification from '@/features/ui/components/ol/ol-notification'
|
||||||
|
|
||||||
|
export function RedirectAlerts() {
|
||||||
|
const queryParams = new URLSearchParams(window.location.search)
|
||||||
|
const redirectReason = queryParams.get('redirect-reason')
|
||||||
|
const { t } = useTranslation()
|
||||||
|
|
||||||
|
if (!redirectReason) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
let warning
|
||||||
|
if (redirectReason === 'writefull-entitled') {
|
||||||
|
warning = t('good_news_you_are_already_receiving_this_add_on_via_writefull')
|
||||||
|
} else if (redirectReason === 'double-buy') {
|
||||||
|
warning = t('good_news_you_already_purchased_this_add_on')
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
return <OLNotification type="warning" content={<>{warning}</>} />
|
||||||
|
}
|
||||||
|
export default RedirectAlerts
|
||||||
-4
@@ -10,7 +10,6 @@ import { ConfirmChangePlanModal } from './change-plan/modals/confirm-change-plan
|
|||||||
import { KeepCurrentPlanModal } from './change-plan/modals/keep-current-plan-modal'
|
import { KeepCurrentPlanModal } from './change-plan/modals/keep-current-plan-modal'
|
||||||
import { ChangeToGroupModal } from './change-plan/modals/change-to-group-modal'
|
import { ChangeToGroupModal } from './change-plan/modals/change-to-group-modal'
|
||||||
import { CancelAiAddOnModal } from '@/features/subscription/components/dashboard/states/active/change-plan/modals/cancel-ai-add-on-modal'
|
import { CancelAiAddOnModal } from '@/features/subscription/components/dashboard/states/active/change-plan/modals/cancel-ai-add-on-modal'
|
||||||
import { WritefullBundleManagementModal } from '@/features/subscription/components/dashboard/states/active/change-plan/modals/writefull-bundle-management-modal'
|
|
||||||
import OLButton from '@/features/ui/components/ol/ol-button'
|
import OLButton from '@/features/ui/components/ol/ol-button'
|
||||||
import isInFreeTrial from '../../../../util/is-in-free-trial'
|
import isInFreeTrial from '../../../../util/is-in-free-trial'
|
||||||
import AddOns from '@/features/subscription/components/dashboard/states/active/add-ons'
|
import AddOns from '@/features/subscription/components/dashboard/states/active/add-ons'
|
||||||
@@ -72,7 +71,6 @@ export function ActiveSubscriptionNew({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handlePlanChange = () => setModalIdShown('change-plan')
|
const handlePlanChange = () => setModalIdShown('change-plan')
|
||||||
const handleManageOnWritefull = () => setModalIdShown('manage-on-writefull')
|
|
||||||
const handleCancelClick = (addOnCode: string) => {
|
const handleCancelClick = (addOnCode: string) => {
|
||||||
if (
|
if (
|
||||||
[AI_ASSIST_STANDALONE_MONTHLY_PLAN_CODE, AI_ADD_ON_CODE].includes(
|
[AI_ASSIST_STANDALONE_MONTHLY_PLAN_CODE, AI_ADD_ON_CODE].includes(
|
||||||
@@ -266,7 +264,6 @@ export function ActiveSubscriptionNew({
|
|||||||
subscription={subscription}
|
subscription={subscription}
|
||||||
onStandalonePlan={onStandalonePlan}
|
onStandalonePlan={onStandalonePlan}
|
||||||
handleCancelClick={handleCancelClick}
|
handleCancelClick={handleCancelClick}
|
||||||
handleManageOnWritefull={handleManageOnWritefull}
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<ChangePlanModal />
|
<ChangePlanModal />
|
||||||
@@ -274,7 +271,6 @@ export function ActiveSubscriptionNew({
|
|||||||
<KeepCurrentPlanModal />
|
<KeepCurrentPlanModal />
|
||||||
<ChangeToGroupModal />
|
<ChangeToGroupModal />
|
||||||
<CancelAiAddOnModal />
|
<CancelAiAddOnModal />
|
||||||
<WritefullBundleManagementModal />
|
|
||||||
<PauseSubscriptionModal />
|
<PauseSubscriptionModal />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-53
@@ -12,12 +12,12 @@ import {
|
|||||||
import sparkle from '@/shared/svgs/sparkle.svg'
|
import sparkle from '@/shared/svgs/sparkle.svg'
|
||||||
import { PaidSubscription } from '../../../../../../../../types/subscription/dashboard/subscription'
|
import { PaidSubscription } from '../../../../../../../../types/subscription/dashboard/subscription'
|
||||||
import { LICENSE_ADD_ON } from '@/features/group-management/components/upgrade-subscription/upgrade-subscription-plan-details'
|
import { LICENSE_ADD_ON } from '@/features/group-management/components/upgrade-subscription/upgrade-subscription-plan-details'
|
||||||
|
import WritefullManagedBundleAddOn from './change-plan/modals/writefull-bundle-management-modal'
|
||||||
|
|
||||||
type AddOnsProps = {
|
type AddOnsProps = {
|
||||||
subscription: PaidSubscription
|
subscription: PaidSubscription
|
||||||
onStandalonePlan: boolean
|
onStandalonePlan: boolean
|
||||||
handleCancelClick: (code: string) => void
|
handleCancelClick: (code: string) => void
|
||||||
handleManageOnWritefull: () => void
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type AddOnProps = {
|
type AddOnProps = {
|
||||||
@@ -100,57 +100,10 @@ function AddOn({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function WritefullGrantedAddOn({
|
|
||||||
handleManageOnWritefull,
|
|
||||||
}: {
|
|
||||||
handleManageOnWritefull: () => void
|
|
||||||
}) {
|
|
||||||
const { t } = useTranslation()
|
|
||||||
return (
|
|
||||||
<div className="add-on-card">
|
|
||||||
<div>
|
|
||||||
<img
|
|
||||||
alt="sparkle"
|
|
||||||
className="add-on-card-icon"
|
|
||||||
src={sparkle}
|
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="add-on-card-content">
|
|
||||||
<div className="heading">{ADD_ON_NAME}</div>
|
|
||||||
<div className="description small mt-1">
|
|
||||||
{t('included_as_part_of_your_writefull_subscription')}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="ms-auto">
|
|
||||||
<Dropdown align="end">
|
|
||||||
<DropdownToggle
|
|
||||||
id="add-on-dropdown-toggle"
|
|
||||||
className="add-on-options-toggle"
|
|
||||||
variant="secondary"
|
|
||||||
>
|
|
||||||
<MaterialIcon
|
|
||||||
type="more_vert"
|
|
||||||
accessibilityLabel={t('more_options')}
|
|
||||||
/>
|
|
||||||
</DropdownToggle>
|
|
||||||
<DropdownMenu flip={false}>
|
|
||||||
<OLDropdownMenuItem tabIndex={-1} onClick={handleManageOnWritefull}>
|
|
||||||
{t('manage_subscription')}
|
|
||||||
</OLDropdownMenuItem>
|
|
||||||
</DropdownMenu>
|
|
||||||
</Dropdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function AddOns({
|
function AddOns({
|
||||||
subscription,
|
subscription,
|
||||||
onStandalonePlan,
|
onStandalonePlan,
|
||||||
handleCancelClick,
|
handleCancelClick,
|
||||||
handleManageOnWritefull,
|
|
||||||
}: AddOnsProps) {
|
}: AddOnsProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const hasAiAssistViaWritefull = getMeta('ol-hasAiAssistViaWritefull')
|
const hasAiAssistViaWritefull = getMeta('ol-hasAiAssistViaWritefull')
|
||||||
@@ -187,11 +140,7 @@ function AddOns({
|
|||||||
nextBillingDate={subscription.payment.nextPaymentDueDate}
|
nextBillingDate={subscription.payment.nextPaymentDueDate}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{hasAiAssistViaWritefull && (
|
{hasAiAssistViaWritefull && <WritefullManagedBundleAddOn />}
|
||||||
<WritefullGrantedAddOn
|
|
||||||
handleManageOnWritefull={handleManageOnWritefull}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<p>{t('you_dont_have_any_add_ons_on_your_account')}</p>
|
<p>{t('you_dont_have_any_add_ons_on_your_account')}</p>
|
||||||
|
|||||||
+67
-1
@@ -8,8 +8,13 @@ import OLModal, {
|
|||||||
OLModalTitle,
|
OLModalTitle,
|
||||||
} from '@/features/ui/components/ol/ol-modal'
|
} from '@/features/ui/components/ol/ol-modal'
|
||||||
import OLButton from '@/features/ui/components/ol/ol-button'
|
import OLButton from '@/features/ui/components/ol/ol-button'
|
||||||
|
import sparkle from '@/shared/svgs/sparkle.svg'
|
||||||
|
import { Dropdown, DropdownMenu, DropdownToggle } from 'react-bootstrap-5'
|
||||||
|
import OLDropdownMenuItem from '@/features/ui/components/ol/ol-dropdown-menu-item'
|
||||||
|
import MaterialIcon from '@/shared/components/material-icon'
|
||||||
|
import { ADD_ON_NAME } from '@/features/subscription/data/add-on-codes'
|
||||||
|
|
||||||
export function WritefullBundleManagementModal() {
|
function WritefullBundleManagementModal() {
|
||||||
const modalId: SubscriptionDashModalIds = 'manage-on-writefull'
|
const modalId: SubscriptionDashModalIds = 'manage-on-writefull'
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { handleCloseModal, modalIdShown } = useSubscriptionDashboardContext()
|
const { handleCloseModal, modalIdShown } = useSubscriptionDashboardContext()
|
||||||
@@ -49,3 +54,64 @@ export function WritefullBundleManagementModal() {
|
|||||||
</OLModal>
|
</OLModal>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function WritefullGrantedAddOn({
|
||||||
|
handleManageOnWritefull,
|
||||||
|
}: {
|
||||||
|
handleManageOnWritefull: () => void
|
||||||
|
}) {
|
||||||
|
const { t } = useTranslation()
|
||||||
|
return (
|
||||||
|
<div className="add-on-card">
|
||||||
|
<div>
|
||||||
|
<img
|
||||||
|
alt="sparkle"
|
||||||
|
className="add-on-card-icon"
|
||||||
|
src={sparkle}
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="add-on-card-content">
|
||||||
|
<div className="heading">{ADD_ON_NAME}</div>
|
||||||
|
<div className="description small mt-1">
|
||||||
|
{t('included_as_part_of_your_writefull_subscription')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="ms-auto">
|
||||||
|
<Dropdown align="end">
|
||||||
|
<DropdownToggle
|
||||||
|
id="add-on-dropdown-toggle"
|
||||||
|
className="add-on-options-toggle"
|
||||||
|
variant="secondary"
|
||||||
|
>
|
||||||
|
<MaterialIcon
|
||||||
|
type="more_vert"
|
||||||
|
accessibilityLabel={t('more_options')}
|
||||||
|
/>
|
||||||
|
</DropdownToggle>
|
||||||
|
<DropdownMenu flip={false}>
|
||||||
|
<OLDropdownMenuItem tabIndex={-1} onClick={handleManageOnWritefull}>
|
||||||
|
{t('manage_subscription')}
|
||||||
|
</OLDropdownMenuItem>
|
||||||
|
</DropdownMenu>
|
||||||
|
</Dropdown>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function WritefullManagedBundleAddOn() {
|
||||||
|
const { setModalIdShown } = useSubscriptionDashboardContext()
|
||||||
|
const handleManageOnWritefull = () => setModalIdShown('manage-on-writefull')
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<WritefullGrantedAddOn
|
||||||
|
handleManageOnWritefull={handleManageOnWritefull}
|
||||||
|
/>
|
||||||
|
<WritefullBundleManagementModal />
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default WritefullManagedBundleAddOn
|
||||||
|
|||||||
Reference in New Issue
Block a user