From 6afbb72a34576ce27f7197ba4cc09fc7aa084c65 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Tue, 12 May 2026 21:27:37 +0300 Subject: [PATCH] feat: lock traffic topup when under 80% of traffic used --- bot/app/web/frontend/src/App.svelte | 34 ++++++++++++++---- .../src/webapp/screens/HomeScreen.svelte | 36 ++++++++++++------- locales/en.json | 2 ++ locales/ru.json | 2 ++ 4 files changed, 55 insertions(+), 19 deletions(-) diff --git a/bot/app/web/frontend/src/App.svelte b/bot/app/web/frontend/src/App.svelte index 8f25595..1e81739 100644 --- a/bot/app/web/frontend/src/App.svelte +++ b/bot/app/web/frontend/src/App.svelte @@ -35,6 +35,9 @@ import { normalizedEmail, telegramName } from "./lib/webapp/formatters.js"; import { activeTariffName, buildTariffCatalog } from "./lib/webapp/tariffs.js"; import { premiumTrafficPercent, trafficPercent } from "./lib/webapp/traffic.js"; + + /** Used-traffic percent from which top-up modals and CTAs unlock in the web app home screen */ + const TRAFFIC_TOPUP_UNLOCK_PERCENT = 80; import { buildGravatarUrl } from "./lib/webapp/gravatar.js"; import { createBillingActions } from "./lib/webapp/billingActions.js"; import { invalidateWebappTariffOptionCaches } from "./lib/webapp/billingOptionCache.js"; @@ -215,10 +218,26 @@ (subscription?.can_topup_premium_traffic ?? subscription?.can_topup_traffic) && Number(subscription?.premium_limit_bytes || 0) > 0, ); - $: canOpenTopupModal = Boolean(canOpenRegularTopupModal || canOpenPremiumTopupModal); - $: canShowTopupButton = Boolean( - canOpenTopupModal && - (trafficPercent(subscription) >= 85 || premiumTrafficPercent(subscription) >= 85), + $: activeTariffCatalogEntry = + tariffCatalog.find((entry) => entry.key === String(subscription?.tariff_key || "").trim()) || null; + $: subscriptionIsTrafficTariff = Boolean( + String(subscription?.billing_model || activeTariffCatalogEntry?.billing_model || "") + .toLowerCase() === "traffic", + ); + $: regularTrafficTopupUnlocked = Boolean( + canOpenRegularTopupModal && trafficPercent(subscription) >= TRAFFIC_TOPUP_UNLOCK_PERCENT, + ); + $: premiumTrafficTopupUnlocked = Boolean( + canOpenPremiumTopupModal && premiumTrafficPercent(subscription) >= TRAFFIC_TOPUP_UNLOCK_PERCENT, + ); + /** Progress-bar card opens top-up immediately on traffic-only tariffs; period tariffs still need 80% usage */ + $: regularTrafficTopupBarClickable = Boolean( + canOpenRegularTopupModal && + (subscriptionIsTrafficTariff || trafficPercent(subscription) >= TRAFFIC_TOPUP_UNLOCK_PERCENT), + ); + $: premiumTrafficTopupBarClickable = Boolean( + canOpenPremiumTopupModal && + (subscriptionIsTrafficTariff || premiumTrafficPercent(subscription) >= TRAFFIC_TOPUP_UNLOCK_PERCENT), ); $: user = data?.user || {}; $: isAdmin = Boolean(user?.is_admin); @@ -877,12 +896,13 @@ {brandEmoji} {brandTitle} {canChangeTariff} - {canOpenPremiumTopupModal} - {canOpenRegularTopupModal} - {canShowTopupButton} {currentTariffName} {hasActiveTariffSubscription} {hasMultipleTariffs} + {premiumTrafficTopupBarClickable} + {premiumTrafficTopupUnlocked} + {regularTrafficTopupBarClickable} + {regularTrafficTopupUnlocked} {subscription} {termUnitLabel} {trafficMode} diff --git a/bot/app/web/frontend/src/webapp/screens/HomeScreen.svelte b/bot/app/web/frontend/src/webapp/screens/HomeScreen.svelte index 3b89ee1..eff372c 100644 --- a/bot/app/web/frontend/src/webapp/screens/HomeScreen.svelte +++ b/bot/app/web/frontend/src/webapp/screens/HomeScreen.svelte @@ -23,9 +23,10 @@ export let brandEmoji = ""; export let brandTitle = ""; export let canChangeTariff = false; - export let canOpenPremiumTopupModal = false; - export let canOpenRegularTopupModal = false; - export let canShowTopupButton = false; + export let premiumTrafficTopupBarClickable = false; + export let premiumTrafficTopupUnlocked = false; + export let regularTrafficTopupBarClickable = false; + export let regularTrafficTopupUnlocked = false; export let currentTariffName = ""; export let hasActiveTariffSubscription = false; export let hasMultipleTariffs = false; @@ -86,9 +87,9 @@ {#if subscription.active} - - {#if canOpenRegularTopupModal} - + + {#if regularTrafficTopupBarClickable} + {/if}
{t("wa_home_traffic_used")} @@ -128,9 +129,14 @@
{:else if Number(subscription?.premium_limit_bytes || 0) > 0} - - {#if canOpenPremiumTopupModal} - + + {#if premiumTrafficTopupBarClickable} + {/if}
{premiumTitle(subscription)} @@ -199,10 +205,16 @@ {t("wa_change_tariff")} {/if} - {#if canShowTopupButton} - + {/if} + {#if premiumTrafficTopupUnlocked} + {/if}
diff --git a/locales/en.json b/locales/en.json index 344c59c..2c8e08c 100644 --- a/locales/en.json +++ b/locales/en.json @@ -701,6 +701,8 @@ "wa_tariff_no_description": "Tariff description is not configured", "wa_change_tariff": "Change tariff", "wa_topup_traffic": "Buy traffic", + "wa_add_traffic": "Add traffic", + "wa_add_traffic_premium": "Add traffic on {target}", "wa_current_tariff": "Current tariff: {tariff}", "wa_tariff_options_loading": "Loading options", "wa_tariff_options_failed": "Failed to load tariff options", diff --git a/locales/ru.json b/locales/ru.json index 9b5a61b..8021600 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -701,6 +701,8 @@ "wa_tariff_no_description": "Описание тарифа не задано", "wa_change_tariff": "Сменить тариф", "wa_topup_traffic": "Докупить трафик", + "wa_add_traffic": "Добавить трафик", + "wa_add_traffic_premium": "Добавить трафик на {target}", "wa_current_tariff": "Текущий тариф: {tariff}", "wa_tariff_options_loading": "Загружаем варианты", "wa_tariff_options_failed": "Не удалось загрузить варианты тарифов",