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 && (