From 4deeaec53025816b9a9ec6d35fb9fe5f3884bf31 Mon Sep 17 00:00:00 2001 From: Ole-Martin Bratteng <1681525+omBratteng@users.noreply.github.com> Date: Wed, 29 Oct 2025 18:18:16 +0100 Subject: [PATCH 1/2] feat: add conditional rendering to marketing CTA based on target platform --- .../src/components/marketingCta/common.tsx | 22 +++++++++++++++++++ packages/shared/src/hooks/useBoot.ts | 9 +++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/components/marketingCta/common.tsx b/packages/shared/src/components/marketingCta/common.tsx index 8104ac43f47..7fa220ce6b5 100644 --- a/packages/shared/src/components/marketingCta/common.tsx +++ b/packages/shared/src/components/marketingCta/common.tsx @@ -6,6 +6,7 @@ import { CardTitle } from '../cards/common/Card'; import classed from '../../lib/classed'; import { anchorDefaultRel } from '../../lib/strings'; import { Pill, PillSize } from '../Pill'; +import { isExtension, isIOSNative, isNullOrUndefined } from '../../lib/func'; export type MarketingCtaFlags = { title: string; @@ -30,13 +31,34 @@ export enum MarketingCtaVariant { BriefCard = 'brief_card', } +interface MarketingCtaTargets { + webapp: boolean; + extension: boolean; + ios: boolean; +} + export interface MarketingCta { campaignId: string; createdAt: Date; variant: MarketingCtaVariant; flags: MarketingCtaFlags; + targets: MarketingCtaTargets; } +const platformToMarketingCtaTarget = (): keyof MarketingCtaTargets => { + if (isIOSNative()) { + return 'ios'; + } + if (isExtension) { + return 'extension'; + } + return 'webapp'; +}; + +export const isMarketingCtaTarget = (targets: MarketingCtaTargets): boolean => + isNullOrUndefined(targets) || + targets[platformToMarketingCtaTarget()] === true; + type HeaderProps = Pick & { onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void; buttonSize?: ButtonSize; diff --git a/packages/shared/src/hooks/useBoot.ts b/packages/shared/src/hooks/useBoot.ts index 36b47639748..05280ef26c9 100644 --- a/packages/shared/src/hooks/useBoot.ts +++ b/packages/shared/src/hooks/useBoot.ts @@ -3,7 +3,10 @@ import { useRouter } from 'next/router'; import { BOOT_QUERY_KEY } from '../contexts/common'; import type { Squad } from '../graphql/sources'; import type { Boot } from '../lib/boot'; -import { MarketingCtaVariant } from '../components/marketingCta/common'; +import { + isMarketingCtaTarget, + MarketingCtaVariant, +} from '../components/marketingCta/common'; import type { MarketingCta } from '../components/marketingCta/common'; import { CLEAR_MARKETING_CTA_MUTATION } from '../graphql/users'; import { gqlClient } from '../graphql/common'; @@ -70,6 +73,10 @@ export const useBoot = (): UseBoot => { return null; } + if (isMarketingCtaTarget(bootData.marketingCta.targets) === false) { + return null; + } + return bootData?.marketingCta; }; From e871854354d413b6b894c19a1652b645fa21728d Mon Sep 17 00:00:00 2001 From: Ole-Martin Bratteng <1681525+omBratteng@users.noreply.github.com> Date: Wed, 29 Oct 2025 18:21:52 +0100 Subject: [PATCH 2/2] fix: optional targets --- packages/shared/src/components/marketingCta/common.tsx | 2 +- packages/shared/src/hooks/useBoot.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/components/marketingCta/common.tsx b/packages/shared/src/components/marketingCta/common.tsx index 7fa220ce6b5..26673a260e3 100644 --- a/packages/shared/src/components/marketingCta/common.tsx +++ b/packages/shared/src/components/marketingCta/common.tsx @@ -42,7 +42,7 @@ export interface MarketingCta { createdAt: Date; variant: MarketingCtaVariant; flags: MarketingCtaFlags; - targets: MarketingCtaTargets; + targets?: MarketingCtaTargets; } const platformToMarketingCtaTarget = (): keyof MarketingCtaTargets => { diff --git a/packages/shared/src/hooks/useBoot.ts b/packages/shared/src/hooks/useBoot.ts index 05280ef26c9..90fddc59846 100644 --- a/packages/shared/src/hooks/useBoot.ts +++ b/packages/shared/src/hooks/useBoot.ts @@ -73,7 +73,7 @@ export const useBoot = (): UseBoot => { return null; } - if (isMarketingCtaTarget(bootData.marketingCta.targets) === false) { + if (isMarketingCtaTarget(bootData?.marketingCta?.targets) === false) { return null; }