From c6d567fd14fe9999ab2b1985c95555f7ea352cc0 Mon Sep 17 00:00:00 2001 From: elizabeth-ilina Date: Wed, 7 Jan 2026 08:46:04 -0500 Subject: [PATCH] feat(payments-next): Cancellation flow: Create page - Interstitial Offer Because: * We need a cancel interstitial offer page as part of the churn intervention epic. This commit: * Creates /[locale]/subscriptions/[subscription_id]/offer page Closes #PAY-3371 --- .../[subscriptionId]/offer/en.ftl | 8 + .../[subscriptionId]/offer/error/en.ftl | 9 ++ .../[subscriptionId]/offer/error/page.tsx | 146 +++++++++++++++++ .../[subscriptionId]/offer/page.tsx | 149 ++++++++++++++++++ .../src/lib/churn-intervention.service.ts | 25 ++- .../actions/getInterstitialOfferContent.ts | 23 +++ libs/payments/ui/src/lib/actions/index.ts | 1 + .../src/lib/nestapp/nextjs-actions.service.ts | 50 ++++++ ...ineCancellationInterventionActionResult.ts | 27 ++-- .../GetInterstitialOfferContentActionArgs.ts | 21 +++ ...GetInterstitialOfferContentActionResult.ts | 65 ++++++++ libs/shared/cms/src/__generated__/gql.ts | 6 +- libs/shared/cms/src/__generated__/graphql.ts | 4 +- .../cancel-interstitial-offer/factories.ts | 2 + .../cancel-interstitial-offer/query.ts | 2 + .../cancel-interstitial-offer/types.ts | 13 +- .../queries/cancel-interstitial-offer/util.ts | 5 + 17 files changed, 533 insertions(+), 23 deletions(-) create mode 100644 apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/en.ftl create mode 100644 apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/en.ftl create mode 100644 apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/page.tsx create mode 100644 apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/page.tsx create mode 100644 libs/payments/ui/src/lib/actions/getInterstitialOfferContent.ts create mode 100644 libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionArgs.ts create mode 100644 libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionResult.ts diff --git a/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/en.ftl b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/en.ftl new file mode 100644 index 00000000000..427a3e2b1aa --- /dev/null +++ b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/en.ftl @@ -0,0 +1,8 @@ +## InterstitialOffer +interstitial-offer-button-cancel-subscription = Continue to cancel + +## Daily/Weekly/Monthly refers to the user's current subscription interval +interstitial-offer-button-keep-current-interval-daily = Keep daily subscription +interstitial-offer-button-keep-current-interval-weekly = Keep weekly subscription +interstitial-offer-button-keep-current-interval-monthly = Keep monthly subscription +interstitial-offer-button-keep-current-interval-halfyearly = Keep six-month subscription diff --git a/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/en.ftl b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/en.ftl new file mode 100644 index 00000000000..7416856c77e --- /dev/null +++ b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/en.ftl @@ -0,0 +1,9 @@ +## Error page +interstitial-offer-error-subscription-not-found-heading = We couldn’t find an active subscription +interstitial-offer-error-subscription-not-found-message = It looks like this subscription may no longer be active. + +interstitial-offer-error-general-heading = Offer isn’t available +interstitial-offer-error-general-message = It looks like this offer is not available at this time. + +interstitial-offer-error-button-back-to-subscriptions = Back to subscriptions +interstitial-offer-error-button-cancel-subscription = Continue to cancel diff --git a/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/page.tsx b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/page.tsx new file mode 100644 index 00000000000..d613d5e9d15 --- /dev/null +++ b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/error/page.tsx @@ -0,0 +1,146 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { headers } from 'next/headers'; +import { notFound, redirect } from 'next/navigation'; +import Link from 'next/link'; +import Image from 'next/image'; +import { getApp } from '@fxa/payments/ui/server'; +import { getInterstitialOfferContentAction } from '@fxa/payments/ui/actions'; +import { auth } from 'apps/payments/next/auth'; +import { config } from 'apps/payments/next/config'; + +export default async function InterstitialOfferErrorPage({ + params, + searchParams, +}: { + params: { + locale: string; + subscriptionId: string; + }; + searchParams: Record | undefined; +}) { + const { locale, subscriptionId } = params; + + if (!config.churnInterventionConfig.enabled) { + redirect(`/${locale}/subscriptions/landing`); + } + + const acceptLanguage = headers().get('accept-language'); + const session = await auth(); + if (!session?.user?.id) { + const redirectToUrl = new URL( + `${config.paymentsNextHostedUrl}/${locale}/subscriptions/landing` + ); + redirectToUrl.search = new URLSearchParams(searchParams).toString(); + redirect(redirectToUrl.href); + } + + const uid = session.user.id; + + const interstitialOfferContent = await getInterstitialOfferContentAction( + uid, + subscriptionId, + acceptLanguage, + locale + ); + + if (!interstitialOfferContent) { + notFound(); + } + + if (interstitialOfferContent.isEligible && interstitialOfferContent.pageContent) { + redirect(`/${locale}/subscriptions/${subscriptionId}/offer`); + } + + const { webIcon, productName} = interstitialOfferContent; + const reason = interstitialOfferContent.reason ?? 'general_error'; + + if (webIcon && !productName) { + throw new Error('Missing productName for interstitial offer icon'); + } + + const l10n = getApp().getL10n(acceptLanguage, locale); + + const getErrorContent = (reason: string) => { + switch (reason) { + case 'subscription_not_found': + return { + heading: l10n.getString( + 'interstitial-offer-error-subscription-not-found-heading', + 'We couldn’t find an active subscription' + ), + message: l10n.getString( + 'interstitial-offer-error-subscription-not-found-message', + 'It looks like this subscription may no longer be active.' + ), + }; + default: + return { + heading: l10n.getString( + 'interstitial-offer-error-general-heading', + 'Offer isn’t available' + ), + message: l10n.getString( + 'interstitial-offer-error-general-message', + 'It looks like this offer is not available at this time.' + ), + }; + } + }; + + const { heading, message } = getErrorContent(reason); + const showContinueToCancelButton = reason !== 'subscription_not_found'; + + return ( +
+
+
+ {webIcon && ( + {productName + )} +

+ {heading} +

+

+ {message} +

+
+
+ + {l10n.getString( + 'interstitial-offer-error-button-back-to-subscriptions', + 'Back to subscriptions' + )} + + {showContinueToCancelButton && ( + + {l10n.getString( + 'interstitial-offer-error-button-cancel-subscription', + 'Continue to cancel' + )} + + )} +
+
+
+ ); +} diff --git a/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/page.tsx b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/page.tsx new file mode 100644 index 00000000000..2312874ed2a --- /dev/null +++ b/apps/payments/next/app/[locale]/subscriptions/[subscriptionId]/offer/page.tsx @@ -0,0 +1,149 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { headers } from 'next/headers'; +import { redirect } from 'next/navigation'; +import { getApp } from '@fxa/payments/ui/server'; +import { getInterstitialOfferContentAction } from '@fxa/payments/ui/actions'; +import { auth } from 'apps/payments/next/auth'; +import { config } from 'apps/payments/next/config'; +import Image from 'next/image'; +import Link from 'next/link'; + +export default async function InterstitialOfferPage({ + params, + searchParams, +}: { + params: { + locale: string; + subscriptionId: string; + }; + searchParams: Record | undefined; +}) { + const { locale, subscriptionId } = params; + + if (!config.churnInterventionConfig.enabled) { + redirect(`/${locale}/subscriptions/landing`); + } + + const acceptLanguage = headers().get('accept-language'); + const l10n = getApp().getL10n(acceptLanguage, locale); + const session = await auth(); + if (!session?.user?.id) { + const redirectToUrl = new URL( + `${config.paymentsNextHostedUrl}/${locale}/subscriptions/landing` + ); + redirectToUrl.search = new URLSearchParams(searchParams).toString(); + redirect(redirectToUrl.href); + } + + const uid = session.user.id; + + let interstitialOfferContent; + try { + interstitialOfferContent = await getInterstitialOfferContentAction( + uid, + subscriptionId, + acceptLanguage, + locale + ); + } catch (error) { + redirect(`/${locale}/subscriptions/${subscriptionId}/offer/error`); + } + + if (!interstitialOfferContent.isEligible || !interstitialOfferContent.pageContent) { + redirect(`/${locale}/subscriptions/${subscriptionId}/offer/error`); + } + + const { + currentInterval, + modalHeading1, + modalMessage, + upgradeButtonLabel, + upgradeButtonUrl, + webIcon, + productName, + } = interstitialOfferContent.pageContent; + + const getKeepCurrentSubscriptionFtlIds = (interval: string) => { + switch (interval) { + case 'daily': + return { + ftlId: 'interstitial-offer-button-keep-current-interval-daily', + fallbackText: 'Keep daily subscription', + }; + case 'weekly': + return { + ftlId: 'interstitial-offer-button-keep-current-interval-weekly', + fallbackText: 'Keep weekly subscription', + }; + case 'halfyearly': + return { + ftlId: 'interstitial-offer-button-keep-current-interval-halfyearly', + fallbackText: 'Keep six-month subscription', + }; + case 'monthly': + default: + return { + ftlId: 'interstitial-offer-button-keep-current-interval-monthly', + fallbackText: 'Keep monthly subscription', + }; + } + }; + + const { ftlId, fallbackText } = getKeepCurrentSubscriptionFtlIds(currentInterval); + const keepCurrentSubscriptionButtonText = l10n.getString(ftlId, fallbackText); + + return ( +
+
+
+ {productName} +

+ {modalHeading1} +

+
+

+ {modalMessage && + modalMessage.map((line, i) => ( +

+ {line} +

+ ))} +

+ +
+ + {upgradeButtonLabel} + + + {keepCurrentSubscriptionButtonText} + + + {l10n.getString( + 'interstitial-offer-button-cancel-subscription', + 'Continue to cancel' + )} + +
+
+
+ ); +} diff --git a/libs/payments/management/src/lib/churn-intervention.service.ts b/libs/payments/management/src/lib/churn-intervention.service.ts index 545a03a7416..6cbaec21a5d 100644 --- a/libs/payments/management/src/lib/churn-intervention.service.ts +++ b/libs/payments/management/src/lib/churn-intervention.service.ts @@ -492,6 +492,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'subscription_not_found', cmsCancelInterstitialOfferResult: null, + webIcon: null, + productName: null, }; } @@ -509,6 +511,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'current_interval_not_found', cmsCancelInterstitialOfferResult: null, + webIcon: null, + productName: null, }; } @@ -523,6 +527,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'stripe_price_id_not_found', cmsCancelInterstitialOfferResult: null, + webIcon: null, + productName: null, }; } @@ -530,8 +536,9 @@ export class ChurnInterventionService { await this.productConfigurationManager.getPageContentByPriceIds([ stripePriceId, ]); - const offeringId = - result.purchaseForPriceId(stripePriceId).offering?.apiIdentifier; + const { offering, purchaseDetails } = result.purchaseForPriceId(stripePriceId); + const offeringId = offering?.apiIdentifier; + const { webIcon, productName } = purchaseDetails; if (!offeringId) { this.statsd.increment('cancel_intervention_decision', { @@ -542,6 +549,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'offering_id_not_found', cmsCancelInterstitialOfferResult: null, + webIcon, + productName, }; } @@ -557,6 +566,7 @@ export class ChurnInterventionService { cmsCancelInterstitialOffer.getTransformedResult(); if (!cmsCancelInterstitialOfferResult) { + console.log('no cmsCancelInterstitialOfferResult found'); this.statsd.increment('cancel_intervention_decision', { type: 'none', reason: 'no_cancel_interstitial_offer_found', @@ -565,6 +575,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'no_cancel_interstitial_offer_found', cmsCancelInterstitialOfferResult: null, + webIcon, + productName, }; } @@ -574,6 +586,7 @@ export class ChurnInterventionService { upgradeInterval ); } catch { + console.log('in the catch, no upgrade plan found for offeringId:', offeringId); this.statsd.increment('cancel_intervention_decision', { type: 'none', reason: 'no_upgrade_plan_found', @@ -582,6 +595,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'no_upgrade_plan_found', cmsCancelInterstitialOfferResult: null, + webIcon, + productName, }; } @@ -589,7 +604,7 @@ export class ChurnInterventionService { upgradeInterval, offeringId, args.uid, - args.subscriptionId + subscription.customer ); if ( @@ -603,6 +618,8 @@ export class ChurnInterventionService { isEligible: false, reason: 'not_eligible_for_upgrade_interval', cmsCancelInterstitialOfferResult: null, + webIcon, + productName, }; } @@ -613,6 +630,8 @@ export class ChurnInterventionService { isEligible: true, reason: 'eligible', cmsCancelInterstitialOfferResult, + webIcon, + productName, }; } diff --git a/libs/payments/ui/src/lib/actions/getInterstitialOfferContent.ts b/libs/payments/ui/src/lib/actions/getInterstitialOfferContent.ts new file mode 100644 index 00000000000..bae0dcfd7a7 --- /dev/null +++ b/libs/payments/ui/src/lib/actions/getInterstitialOfferContent.ts @@ -0,0 +1,23 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +'use server'; + +import { getApp } from '../nestapp/app'; + +export const getInterstitialOfferContentAction = async ( + uid: string, + subscriptionId: string, + acceptLanguage?: string | null, + selectedLanguage?: string +) => { + const result = await getApp().getActionsService().getInterstitialOfferContent({ + uid, + subscriptionId, + acceptLanguage, + selectedLanguage, + }); + + return result; +}; diff --git a/libs/payments/ui/src/lib/actions/index.ts b/libs/payments/ui/src/lib/actions/index.ts index f50a140f114..172e6e49268 100644 --- a/libs/payments/ui/src/lib/actions/index.ts +++ b/libs/payments/ui/src/lib/actions/index.ts @@ -13,6 +13,7 @@ export { determineCancellationInterventionAction } from './determineCancellation export { fetchCMSData } from './fetchCMSData'; export { getCartAction } from './getCart'; export { getCartOrRedirectAction } from './getCartOrRedirect'; +export { getInterstitialOfferContentAction } from './getInterstitialOfferContent'; export { getMetricsFlowAction } from './getMetricsFlow'; export { getPayPalCheckoutToken } from './getPayPalCheckoutToken'; export { getPayPalBillingAgreementId } from './getPayPalBillingAgreementId'; diff --git a/libs/payments/ui/src/lib/nestapp/nextjs-actions.service.ts b/libs/payments/ui/src/lib/nestapp/nextjs-actions.service.ts index d5436cd4c81..778c1814178 100644 --- a/libs/payments/ui/src/lib/nestapp/nextjs-actions.service.ts +++ b/libs/payments/ui/src/lib/nestapp/nextjs-actions.service.ts @@ -46,6 +46,8 @@ import { GetChurnInterventionDataActionArgs } from './validators/GetChurnInterve import { GetPayPalCheckoutTokenArgs } from './validators/GetPayPalCheckoutTokenArgs'; import { GetSubManPageContentActionArgs } from './validators/GetSubManPageContentActionArgs'; import { GetSubManPageContentActionResult } from './validators/GetSubManPageContentActionResult'; +import { GetInterstitialOfferContentActionArgs } from './validators/GetInterstitialOfferContentActionArgs';// +import { GetInterstitialOfferContentActionResult } from './validators/GetInterstitialOfferContentActionResult'; import { RestartCartActionArgs } from './validators/RestartCartActionArgs'; import { SetupCartActionArgs } from './validators/SetupCartActionArgs'; import { UpdateCartActionArgs } from './validators/UpdateCartActionArgs'; @@ -692,6 +694,54 @@ export class NextJSActionsService { ); } + @SanitizeExceptions() + @NextIOValidator( + GetInterstitialOfferContentActionArgs, + GetInterstitialOfferContentActionResult + ) + @WithTypeCachableAsyncLocalStorage() + @CaptureTimingWithStatsD() + async getInterstitialOfferContent(args: { + uid: string; + subscriptionId: string; + acceptLanguage?: string | null; + selectedLanguage?: string; + }) { + const result = + await this.churnInterventionService.determineCancelInterstitialOfferEligibility({ + uid: args.uid, + subscriptionId: args.subscriptionId, + acceptLanguage: args.acceptLanguage, + selectedLanguage: args.selectedLanguage + }); + + if (result.isEligible && + result.cmsCancelInterstitialOfferResult && + result.cmsCancelInterstitialOfferResult.offering.defaultPurchase.purchaseDetails + ) { + return { + isEligible: true, + pageContent: { + currentInterval: result.cmsCancelInterstitialOfferResult.currentInterval, + modalHeading1: result.cmsCancelInterstitialOfferResult.modalHeading1, + modalMessage: result.cmsCancelInterstitialOfferResult.modalMessage, + upgradeButtonLabel: result.cmsCancelInterstitialOfferResult.upgradeButtonLabel, + upgradeButtonUrl: result.cmsCancelInterstitialOfferResult.upgradeButtonUrl, + webIcon: result.cmsCancelInterstitialOfferResult.offering.defaultPurchase.purchaseDetails.webIcon, + productName: result.cmsCancelInterstitialOfferResult.offering.defaultPurchase.purchaseDetails.productName, + } + } + } else { + return { + isEligible: false, + pageContent: null, + reason: result.reason, + webIcon: result.webIcon, + productName: result.productName, + } + } + } + @SanitizeExceptions() @NextIOValidator(DetermineCurrencyActionArgs, DetermineCurrencyActionResult) @WithTypeCachableAsyncLocalStorage() diff --git a/libs/payments/ui/src/lib/nestapp/validators/DetermineCancellationInterventionActionResult.ts b/libs/payments/ui/src/lib/nestapp/validators/DetermineCancellationInterventionActionResult.ts index eee9f920ddb..439bf2937d9 100644 --- a/libs/payments/ui/src/lib/nestapp/validators/DetermineCancellationInterventionActionResult.ts +++ b/libs/payments/ui/src/lib/nestapp/validators/DetermineCancellationInterventionActionResult.ts @@ -4,17 +4,12 @@ import { IsArray, - IsEnum, IsNumber, IsOptional, IsString, ValidateNested, } from 'class-validator'; import { Type } from 'class-transformer'; -import { - Enum_Cancelinterstitialoffer_Currentinterval, - Enum_Cancelinterstitialoffer_Upgradeinterval, -} from '../../../../../../shared/cms/src/__generated__/graphql'; export class CmsChurnInterventionEntryResult { @IsString() @@ -66,12 +61,18 @@ export class CmsChurnInterventionEntryResult { export class CmsPurchaseDetailsLocalizationObject { @IsString() webIcon!: string; + + @IsString() + productName!: string; } export class CmsPurchaseDetailsDataObject { @IsString() webIcon!: string; + @IsString() + productName!: string; + @IsArray() @ValidateNested({ each: true }) @Type(() => CmsPurchaseDetailsLocalizationObject) @@ -98,13 +99,13 @@ export class CmsCancelInterstitialOfferPartialResult { @IsOptional() offeringApiIdentifier?: string; - @IsEnum(Enum_Cancelinterstitialoffer_Currentinterval) + @IsString() @IsOptional() - currentInterval?: Enum_Cancelinterstitialoffer_Currentinterval; + currentInterval?: string; - @IsEnum(Enum_Cancelinterstitialoffer_Upgradeinterval) + @IsString() @IsOptional() - upgradeInterval?: Enum_Cancelinterstitialoffer_Upgradeinterval; + upgradeInterval?: string; @IsNumber() @IsOptional() @@ -148,11 +149,11 @@ export class CmsCancelInterstitialOfferResult { @IsString() offeringApiIdentifier!: string; - @IsEnum(Enum_Cancelinterstitialoffer_Currentinterval) - currentInterval!: Enum_Cancelinterstitialoffer_Currentinterval; + @IsString() + currentInterval!: string; - @IsEnum(Enum_Cancelinterstitialoffer_Upgradeinterval) - upgradeInterval!: Enum_Cancelinterstitialoffer_Upgradeinterval; + @IsString() + upgradeInterval!: string; @IsNumber() advertisedSavings!: number; diff --git a/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionArgs.ts b/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionArgs.ts new file mode 100644 index 00000000000..e04b1339d87 --- /dev/null +++ b/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionArgs.ts @@ -0,0 +1,21 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { IsString, IsOptional } from 'class-validator'; + +export class GetInterstitialOfferContentActionArgs { + @IsString() + uid!: string; + + @IsString() + subscriptionId!: string; + + @IsString() + @IsOptional() + acceptLanguage?: string; + + @IsString() + @IsOptional() + selectedLanguage?: string; +} diff --git a/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionResult.ts b/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionResult.ts new file mode 100644 index 00000000000..0af140acb55 --- /dev/null +++ b/libs/payments/ui/src/lib/nestapp/validators/GetInterstitialOfferContentActionResult.ts @@ -0,0 +1,65 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { + IsString, + IsNumber, + IsArray, + IsBoolean, + IsOptional, + ValidateNested, +} from 'class-validator'; +import { Type } from 'class-transformer'; +import { SubplatInterval } from '@fxa/payments/customer'; + +export class PageContent { + @IsString() + currentInterval!: SubplatInterval; + + @IsNumber() + advertisedSavings!: number; + + @IsString() + ctaMessage!: string; + + @IsString() + modalHeading1!: string; + + @IsArray() + @IsString({ each: true }) + modalMessage!: string[]; + + @IsString() + upgradeButtonLabel!: string; + + @IsString() + upgradeButtonUrl!: string; + + @IsString() + webIcon!: string; + + @IsString() + productName!: string; +} + +export class GetInterstitialOfferContentActionResult { + @IsBoolean() + isEligible!: boolean; + + @ValidateNested() + @Type(() => PageContent) + pageContent!: PageContent | null; + + @IsOptional() + @IsString() + reason?: string; + + @IsOptional() + @IsString() + webIcon?: string; + + @IsOptional() + @IsString() + productName?: string; +} diff --git a/libs/shared/cms/src/__generated__/gql.ts b/libs/shared/cms/src/__generated__/gql.ts index a3b179d1644..2e7dd64b634 100644 --- a/libs/shared/cms/src/__generated__/gql.ts +++ b/libs/shared/cms/src/__generated__/gql.ts @@ -14,7 +14,7 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/ * Learn more about it here: https://the-guild.dev/graphql/codegen/plugins/presets/preset-client#reducing-bundle-size */ type Documents = { - "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n webIcon\n }\n }\n }\n }\n }\n }\n": typeof types.CancelInterstitialOfferDocument, + "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n }\n }\n }\n": typeof types.CancelInterstitialOfferDocument, "\n query CapabilityServiceByPlanIds($stripePlanIds: [String]!) {\n purchases(\n filters: {\n or: [\n { stripePlanChoices: { stripePlanChoice: { in: $stripePlanIds } } }\n {\n offering: {\n stripeLegacyPlans: { stripeLegacyPlan: { in: $stripePlanIds } }\n }\n }\n ]\n }\n pagination: { limit: 200 }\n ) {\n stripePlanChoices {\n stripePlanChoice\n }\n offering {\n stripeLegacyPlans(pagination: { limit: 200 }) {\n stripeLegacyPlan\n }\n capabilities {\n slug\n services {\n oauthClientId\n }\n }\n }\n }\n }\n": typeof types.CapabilityServiceByPlanIdsDocument, "\n query ChurnInterventionByProductId(\n $offeringApiIdentifier: String\n $stripeProductId: String\n $interval: String!\n $locale: String!\n $churnType: String!\n ) {\n offerings(\n filters: {\n or: [\n { stripeProductId: { eq: $stripeProductId } }\n { apiIdentifier: { eq: $offeringApiIdentifier } }\n ]\n }\n pagination: { limit: 200 }\n ) {\n apiIdentifier\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n commonContent {\n successActionButtonUrl\n supportUrl\n }\n churnInterventions(\n filters: { interval: { eq: $interval }, churnType: { eq: $churnType } }\n pagination: { limit: 200 }\n ) {\n localizations(filters: { locale: { eq: $locale } }) {\n churnInterventionId\n churnType\n redemptionLimit\n stripeCouponId\n interval\n discountAmount\n ctaMessage\n modalHeading\n modalMessage\n productPageUrl\n termsHeading\n termsDetails\n }\n churnInterventionId\n churnType\n redemptionLimit\n stripeCouponId\n interval\n discountAmount\n ctaMessage\n modalHeading\n modalMessage\n productPageUrl\n termsHeading\n termsDetails\n }\n }\n }\n": typeof types.ChurnInterventionByProductIdDocument, "\n query EligibilityContentByOffering($apiIdentifier: String!) {\n offerings(\n filters: { apiIdentifier: { eq: $apiIdentifier } }\n pagination: { limit: 200 }\n ) {\n apiIdentifier\n stripeProductId\n defaultPurchase {\n stripePlanChoices {\n stripePlanChoice\n }\n }\n subGroups {\n groupName\n offerings {\n apiIdentifier\n stripeProductId\n defaultPurchase {\n stripePlanChoices {\n stripePlanChoice\n }\n }\n }\n }\n }\n }\n": typeof types.EligibilityContentByOfferingDocument, @@ -30,7 +30,7 @@ type Documents = { "\n query ServicesWithCapabilities {\n services(pagination: { limit: 500 }) {\n oauthClientId\n capabilities {\n slug\n }\n }\n }\n": typeof types.ServicesWithCapabilitiesDocument, }; const documents: Documents = { - "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n webIcon\n }\n }\n }\n }\n }\n }\n": types.CancelInterstitialOfferDocument, + "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n }\n }\n }\n": types.CancelInterstitialOfferDocument, "\n query CapabilityServiceByPlanIds($stripePlanIds: [String]!) {\n purchases(\n filters: {\n or: [\n { stripePlanChoices: { stripePlanChoice: { in: $stripePlanIds } } }\n {\n offering: {\n stripeLegacyPlans: { stripeLegacyPlan: { in: $stripePlanIds } }\n }\n }\n ]\n }\n pagination: { limit: 200 }\n ) {\n stripePlanChoices {\n stripePlanChoice\n }\n offering {\n stripeLegacyPlans(pagination: { limit: 200 }) {\n stripeLegacyPlan\n }\n capabilities {\n slug\n services {\n oauthClientId\n }\n }\n }\n }\n }\n": types.CapabilityServiceByPlanIdsDocument, "\n query ChurnInterventionByProductId(\n $offeringApiIdentifier: String\n $stripeProductId: String\n $interval: String!\n $locale: String!\n $churnType: String!\n ) {\n offerings(\n filters: {\n or: [\n { stripeProductId: { eq: $stripeProductId } }\n { apiIdentifier: { eq: $offeringApiIdentifier } }\n ]\n }\n pagination: { limit: 200 }\n ) {\n apiIdentifier\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n commonContent {\n successActionButtonUrl\n supportUrl\n }\n churnInterventions(\n filters: { interval: { eq: $interval }, churnType: { eq: $churnType } }\n pagination: { limit: 200 }\n ) {\n localizations(filters: { locale: { eq: $locale } }) {\n churnInterventionId\n churnType\n redemptionLimit\n stripeCouponId\n interval\n discountAmount\n ctaMessage\n modalHeading\n modalMessage\n productPageUrl\n termsHeading\n termsDetails\n }\n churnInterventionId\n churnType\n redemptionLimit\n stripeCouponId\n interval\n discountAmount\n ctaMessage\n modalHeading\n modalMessage\n productPageUrl\n termsHeading\n termsDetails\n }\n }\n }\n": types.ChurnInterventionByProductIdDocument, "\n query EligibilityContentByOffering($apiIdentifier: String!) {\n offerings(\n filters: { apiIdentifier: { eq: $apiIdentifier } }\n pagination: { limit: 200 }\n ) {\n apiIdentifier\n stripeProductId\n defaultPurchase {\n stripePlanChoices {\n stripePlanChoice\n }\n }\n subGroups {\n groupName\n offerings {\n apiIdentifier\n stripeProductId\n defaultPurchase {\n stripePlanChoices {\n stripePlanChoice\n }\n }\n }\n }\n }\n }\n": types.EligibilityContentByOfferingDocument, @@ -63,7 +63,7 @@ export function graphql(source: string): unknown; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n webIcon\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n webIcon\n }\n }\n }\n }\n }\n }\n"]; +export function graphql(source: "\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n }\n }\n }\n"): (typeof documents)["\n query CancelInterstitialOffer(\n $offeringApiIdentifier: String!\n $currentInterval: String!\n $upgradeInterval: String!\n $locale: String!\n ) {\n cancelInterstitialOffers(\n filters: {\n offeringApiIdentifier: { eq: $offeringApiIdentifier }\n currentInterval: { eq: $currentInterval }\n upgradeInterval: { eq: $upgradeInterval }\n }\n ) {\n offeringApiIdentifier\n currentInterval\n upgradeInterval\n advertisedSavings\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n localizations(filters: { locale: { eq: $locale } }) {\n ctaMessage\n modalHeading1\n modalHeading2\n modalMessage\n productPageUrl\n upgradeButtonLabel\n upgradeButtonUrl\n }\n offering {\n stripeProductId\n defaultPurchase {\n purchaseDetails {\n productName\n webIcon\n localizations(filters: { locale: { eq: $locale } }) {\n productName\n webIcon\n }\n }\n }\n }\n }\n }\n"]; /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ diff --git a/libs/shared/cms/src/__generated__/graphql.ts b/libs/shared/cms/src/__generated__/graphql.ts index 317b73a67bd..b29b8ce1b02 100644 --- a/libs/shared/cms/src/__generated__/graphql.ts +++ b/libs/shared/cms/src/__generated__/graphql.ts @@ -2848,7 +2848,7 @@ export type CancelInterstitialOfferQueryVariables = Exact<{ }>; -export type CancelInterstitialOfferQuery = { __typename?: 'Query', cancelInterstitialOffers: Array<{ __typename?: 'CancelInterstitialOffer', offeringApiIdentifier: string, currentInterval: Enum_Cancelinterstitialoffer_Currentinterval, upgradeInterval: Enum_Cancelinterstitialoffer_Upgradeinterval, advertisedSavings: number, ctaMessage: string, modalHeading1: string, modalHeading2: string | null, modalMessage: string, productPageUrl: string, upgradeButtonLabel: string, upgradeButtonUrl: string, localizations: Array<{ __typename?: 'CancelInterstitialOffer', ctaMessage: string, modalHeading1: string, modalHeading2: string | null, modalMessage: string, productPageUrl: string, upgradeButtonLabel: string, upgradeButtonUrl: string } | null>, offering: { __typename?: 'Offering', stripeProductId: string, defaultPurchase: { __typename?: 'Purchase', purchaseDetails: { __typename?: 'PurchaseDetail', webIcon: string, localizations: Array<{ __typename?: 'PurchaseDetail', webIcon: string } | null> } | null } | null } | null } | null> }; +export type CancelInterstitialOfferQuery = { __typename?: 'Query', cancelInterstitialOffers: Array<{ __typename?: 'CancelInterstitialOffer', offeringApiIdentifier: string, currentInterval: Enum_Cancelinterstitialoffer_Currentinterval, upgradeInterval: Enum_Cancelinterstitialoffer_Upgradeinterval, advertisedSavings: number, ctaMessage: string, modalHeading1: string, modalHeading2: string | null, modalMessage: string, productPageUrl: string, upgradeButtonLabel: string, upgradeButtonUrl: string, localizations: Array<{ __typename?: 'CancelInterstitialOffer', ctaMessage: string, modalHeading1: string, modalHeading2: string | null, modalMessage: string, productPageUrl: string, upgradeButtonLabel: string, upgradeButtonUrl: string } | null>, offering: { __typename?: 'Offering', stripeProductId: string, defaultPurchase: { __typename?: 'Purchase', purchaseDetails: { __typename?: 'PurchaseDetail', productName: string, webIcon: string, localizations: Array<{ __typename?: 'PurchaseDetail', productName: string, webIcon: string } | null> } | null } | null } | null } | null> }; export type CapabilityServiceByPlanIdsQueryVariables = Exact<{ stripePlanIds: Array> | InputMaybe; @@ -2948,7 +2948,7 @@ export type ServicesWithCapabilitiesQueryVariables = Exact<{ [key: string]: neve export type ServicesWithCapabilitiesQuery = { __typename?: 'Query', services: Array<{ __typename?: 'Service', oauthClientId: string, capabilities: Array<{ __typename?: 'Capability', slug: string } | null> } | null> }; -export const CancelInterstitialOfferDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CancelInterstitialOffer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"currentInterval"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"upgradeInterval"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cancelInterstitialOffers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"offeringApiIdentifier"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"currentInterval"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"currentInterval"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"upgradeInterval"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"upgradeInterval"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"offeringApiIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"currentInterval"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeInterval"}},{"kind":"Field","name":{"kind":"Name","value":"advertisedSavings"}},{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading1"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading2"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonUrl"}},{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading1"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading2"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"offering"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripeProductId"}},{"kind":"Field","name":{"kind":"Name","value":"defaultPurchase"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"purchaseDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"webIcon"}},{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"webIcon"}}]}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const CancelInterstitialOfferDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CancelInterstitialOffer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"currentInterval"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"upgradeInterval"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"cancelInterstitialOffers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"offeringApiIdentifier"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"currentInterval"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"currentInterval"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"upgradeInterval"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"upgradeInterval"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"offeringApiIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"currentInterval"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeInterval"}},{"kind":"Field","name":{"kind":"Name","value":"advertisedSavings"}},{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading1"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading2"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonUrl"}},{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading1"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading2"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonLabel"}},{"kind":"Field","name":{"kind":"Name","value":"upgradeButtonUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"offering"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripeProductId"}},{"kind":"Field","name":{"kind":"Name","value":"defaultPurchase"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"purchaseDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"productName"}},{"kind":"Field","name":{"kind":"Name","value":"webIcon"}},{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"productName"}},{"kind":"Field","name":{"kind":"Name","value":"webIcon"}}]}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const CapabilityServiceByPlanIdsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"CapabilityServiceByPlanIds"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"stripePlanIds"}},"type":{"kind":"NonNullType","type":{"kind":"ListType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"purchases"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"stripePlanChoices"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"stripePlanChoice"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"in"},"value":{"kind":"Variable","name":{"kind":"Name","value":"stripePlanIds"}}}]}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"offering"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"stripeLegacyPlans"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"stripeLegacyPlan"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"in"},"value":{"kind":"Variable","name":{"kind":"Name","value":"stripePlanIds"}}}]}}]}}]}}]}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoice"}}]}},{"kind":"Field","name":{"kind":"Name","value":"offering"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripeLegacyPlans"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripeLegacyPlan"}}]}},{"kind":"Field","name":{"kind":"Name","value":"capabilities"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"slug"}},{"kind":"Field","name":{"kind":"Name","value":"services"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"oauthClientId"}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; export const ChurnInterventionByProductIdDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ChurnInterventionByProductId"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"stripeProductId"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"interval"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"locale"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"churnType"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"offerings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"or"},"value":{"kind":"ListValue","values":[{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"stripeProductId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"stripeProductId"}}}]}}]},{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"apiIdentifier"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"offeringApiIdentifier"}}}]}}]}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"defaultPurchase"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"purchaseDetails"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"productName"}},{"kind":"Field","name":{"kind":"Name","value":"webIcon"}},{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"productName"}},{"kind":"Field","name":{"kind":"Name","value":"webIcon"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"commonContent"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"successActionButtonUrl"}},{"kind":"Field","name":{"kind":"Name","value":"supportUrl"}}]}},{"kind":"Field","name":{"kind":"Name","value":"churnInterventions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"interval"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"interval"}}}]}},{"kind":"ObjectField","name":{"kind":"Name","value":"churnType"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"churnType"}}}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"localizations"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"locale"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"locale"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"churnInterventionId"}},{"kind":"Field","name":{"kind":"Name","value":"churnType"}},{"kind":"Field","name":{"kind":"Name","value":"redemptionLimit"}},{"kind":"Field","name":{"kind":"Name","value":"stripeCouponId"}},{"kind":"Field","name":{"kind":"Name","value":"interval"}},{"kind":"Field","name":{"kind":"Name","value":"discountAmount"}},{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsHeading"}},{"kind":"Field","name":{"kind":"Name","value":"termsDetails"}}]}},{"kind":"Field","name":{"kind":"Name","value":"churnInterventionId"}},{"kind":"Field","name":{"kind":"Name","value":"churnType"}},{"kind":"Field","name":{"kind":"Name","value":"redemptionLimit"}},{"kind":"Field","name":{"kind":"Name","value":"stripeCouponId"}},{"kind":"Field","name":{"kind":"Name","value":"interval"}},{"kind":"Field","name":{"kind":"Name","value":"discountAmount"}},{"kind":"Field","name":{"kind":"Name","value":"ctaMessage"}},{"kind":"Field","name":{"kind":"Name","value":"modalHeading"}},{"kind":"Field","name":{"kind":"Name","value":"modalMessage"}},{"kind":"Field","name":{"kind":"Name","value":"productPageUrl"}},{"kind":"Field","name":{"kind":"Name","value":"termsHeading"}},{"kind":"Field","name":{"kind":"Name","value":"termsDetails"}}]}}]}}]}}]} as unknown as DocumentNode; export const EligibilityContentByOfferingDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"EligibilityContentByOffering"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"apiIdentifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"offerings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"apiIdentifier"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"apiIdentifier"}}}]}}]}},{"kind":"Argument","name":{"kind":"Name","value":"pagination"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"limit"},"value":{"kind":"IntValue","value":"200"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"stripeProductId"}},{"kind":"Field","name":{"kind":"Name","value":"defaultPurchase"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoice"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"subGroups"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"groupName"}},{"kind":"Field","name":{"kind":"Name","value":"offerings"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"apiIdentifier"}},{"kind":"Field","name":{"kind":"Name","value":"stripeProductId"}},{"kind":"Field","name":{"kind":"Name","value":"defaultPurchase"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoices"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"stripePlanChoice"}}]}}]}}]}}]}}]}}]}}]} as unknown as DocumentNode; diff --git a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/factories.ts b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/factories.ts index 7533ec3e09b..d3cade3736c 100644 --- a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/factories.ts +++ b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/factories.ts @@ -28,9 +28,11 @@ export const CancelInterstitialOfferOfferingResultFactory = ( defaultPurchase: { purchaseDetails: { webIcon: faker.image.urlLoremFlickr(), + productName: faker.string.sample(), localizations: [ { webIcon: faker.image.urlLoremFlickr(), + productName: faker.string.sample(), }, ], }, diff --git a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/query.ts b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/query.ts index d416018ff5e..92019ecee83 100644 --- a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/query.ts +++ b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/query.ts @@ -42,8 +42,10 @@ export const cancelInterstitialOfferQuery = graphql(` stripeProductId defaultPurchase { purchaseDetails { + productName webIcon localizations(filters: { locale: { eq: $locale } }) { + productName webIcon } } diff --git a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/types.ts b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/types.ts index f2c744e69af..0d55c66c3ff 100644 --- a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/types.ts +++ b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/types.ts @@ -11,8 +11,12 @@ export interface CancelInterstitialOfferOfferingResult { stripeProductId: string; defaultPurchase: { purchaseDetails: { + productName: string; webIcon: string; - localizations: { webIcon: string }[]; + localizations: { + productName: string; + webIcon: string + }[]; }; }; } @@ -37,6 +41,11 @@ export interface CancelInterstitialOffer { } export interface CancelInterstitialOfferTransformed - extends Omit { + extends Omit< + CancelInterstitialOffer, + 'modalMessage' | 'currentInterval' | 'upgradeInterval' + > { modalMessage: string[]; + currentInterval: string; + upgradeInterval: string; } diff --git a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/util.ts b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/util.ts index 84a05f4e58a..0aac1985804 100644 --- a/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/util.ts +++ b/libs/shared/cms/src/lib/queries/cancel-interstitial-offer/util.ts @@ -25,6 +25,8 @@ export class CancelInterstitialOfferUtil { return { ...cancelInterstitialOffer, + currentInterval: cancelInterstitialOffer.currentInterval, + upgradeInterval: cancelInterstitialOffer.upgradeInterval, ctaMessage: cancelInterstitialOffer.localizations.at(0)?.ctaMessage ?? cancelInterstitialOffer.ctaMessage, @@ -48,6 +50,9 @@ export class CancelInterstitialOfferUtil { defaultPurchase: { purchaseDetails: { ...cancelInterstitialOffer.offering.defaultPurchase.purchaseDetails, + productName: + cancelInterstitialOffer.offering.defaultPurchase.purchaseDetails.localizations?.at(0)?.productName ?? + cancelInterstitialOffer.offering.defaultPurchase.purchaseDetails.productName, webIcon: cancelInterstitialOffer.offering.defaultPurchase.purchaseDetails .webIcon,