From 95f50d5bd6d5f44e5309c4f183a83efb92e66201 Mon Sep 17 00:00:00 2001 From: kipavy Date: Thu, 22 Oct 2026 17:19:05 +0200 Subject: [PATCH 1/2] feat(android): hide purchase links in the Google Play build Google Play does not allow linking to an outside payment page. Builds made with VITE_DISTRIBUTION=play now never open checkout or the billing portal, and the mobile purchase prompts (account page, vault limit, trial expired, Business lock, Teams members prompt, Voltius sync) show "Available with " instead. Desktop and the GitHub APK are unchanged. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_015Ly4RP96nLUnj4FWtWthpE --- src/components/members/panels/MembersCTA.tsx | 4 ++ .../mobile/screens/MobileAccountPage.tsx | 10 ++-- src/components/shared/AvailableWithPlan.tsx | 7 +++ src/components/shared/BusinessLockBanner.tsx | 4 ++ src/components/shared/TrialExpiredModal.tsx | 6 +++ src/components/shared/VaultLimitModal.tsx | 4 ++ src/i18n/locales/cs/shared.json | 3 +- src/i18n/locales/en/shared.json | 3 +- src/i18n/locales/fr/shared.json | 3 +- src/i18n/locales/ru/shared.json | 3 +- src/i18n/locales/tr/shared.json | 3 +- src/i18n/locales/zh/shared.json | 3 +- src/services/billingCheckout.ts | 2 + src/services/distribution.test.ts | 53 +++++++++++++++++++ src/services/distribution.ts | 6 +++ src/services/syncProviders.ts | 3 +- src/utils/billing.ts | 2 + src/vite-env.d.ts | 5 ++ 18 files changed, 114 insertions(+), 10 deletions(-) create mode 100644 src/components/shared/AvailableWithPlan.tsx create mode 100644 src/services/distribution.test.ts create mode 100644 src/services/distribution.ts diff --git a/src/components/members/panels/MembersCTA.tsx b/src/components/members/panels/MembersCTA.tsx index 37563404f..c66182be7 100644 --- a/src/components/members/panels/MembersCTA.tsx +++ b/src/components/members/panels/MembersCTA.tsx @@ -2,6 +2,8 @@ import { Icon } from "@iconify/react"; import { useTranslation } from "react-i18next"; import { openBillingCheckout } from "@/services/billingCheckout"; import { TEAMS_TRIAL_DAYS } from "@/services/billingTrial"; +import { CAN_OPEN_CHECKOUT } from "@/services/distribution"; +import { AvailableWithPlan } from "@/components/shared/AvailableWithPlan"; export function SignInToCloudCTA({ onSignIn }: { onSignIn: () => void }) { const { t } = useTranslation(); @@ -44,6 +46,7 @@ export function UpgradeToTeamsCTA() { {t("members.cta.upgradeDesc")}

+ {!CAN_OPEN_CHECKOUT ? : (<>

{t("members.cta.trialNote")}

+ )} ); } diff --git a/src/components/mobile/screens/MobileAccountPage.tsx b/src/components/mobile/screens/MobileAccountPage.tsx index c9f566a2b..82cbeb501 100644 --- a/src/components/mobile/screens/MobileAccountPage.tsx +++ b/src/components/mobile/screens/MobileAccountPage.tsx @@ -12,6 +12,8 @@ import { getCurrentUserEmail, logout } from "@/services/account"; import { openBillingCheckout } from "@/services/billingCheckout"; import { TEAMS_TRIAL_DAYS } from "@/services/billingTrial"; import { openPortal } from "@/utils/billing"; +import { CAN_OPEN_CHECKOUT } from "@/services/distribution"; +import { AvailableWithPlan } from "@/components/shared/AvailableWithPlan"; import { useServerBillingEnabled } from "@/services/serverCapabilities"; import { useSeatReadout } from "@/hooks/useSeatReadout"; import { seatsUsedText } from "@/services/seatMath"; @@ -115,7 +117,9 @@ export default function MobileAccountPage() { )} - {!isPro && ( + {!isPro && !CAN_OPEN_CHECKOUT && } + + {!isPro && CAN_OPEN_CHECKOUT && ( ; } diff --git a/src/components/shared/TrialExpiredModal.tsx b/src/components/shared/TrialExpiredModal.tsx index e3a259439..27e10845f 100644 --- a/src/components/shared/TrialExpiredModal.tsx +++ b/src/components/shared/TrialExpiredModal.tsx @@ -6,6 +6,8 @@ import { UpgradeStrip } from "@/components/shared/UpgradeStrip"; import { useSubscriptionStore } from "@/stores/subscriptionStore"; import { openBillingCheckout } from "@/services/billingCheckout"; import { TEAMS_TRIAL_DAYS } from "@/services/billingTrial"; +import { CAN_OPEN_CHECKOUT } from "@/services/distribution"; +import { AvailableWithPlan } from "@/components/shared/AvailableWithPlan"; const STORAGE_KEY = "voltius_trial_expired_shown"; @@ -65,20 +67,24 @@ export function TrialExpiredModal() { {t("shared.trialExpiredModal.freeNote")}

+ {CAN_OPEN_CHECKOUT && ( upgrade("teams")} /> + )}
+ {CAN_OPEN_CHECKOUT ? ( + ) : }
+ {isCloudAccount && !CAN_OPEN_CHECKOUT ? : ( + )}