From f61a498eba5b9ee0efcd987053d3356e23d721ab Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 28 Jan 2026 21:01:12 +0300 Subject: [PATCH 1/3] Update vite-env.d.ts --- src/vite-env.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 8b6f85e..0836c04 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -85,6 +85,8 @@ interface TelegramWebApp { button_color?: string; button_text_color?: string; }; + // Version check helper + isVersionAtLeast: (version: string) => boolean; } interface Window { From f2e03ffb33ddef5ce5faff6e88019bbf34dec8c2 Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 28 Jan 2026 21:01:40 +0300 Subject: [PATCH 2/3] Update TopUpModal.tsx --- src/components/TopUpModal.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/TopUpModal.tsx b/src/components/TopUpModal.tsx index b2d8b00..bde9b70 100644 --- a/src/components/TopUpModal.tsx +++ b/src/components/TopUpModal.tsx @@ -207,7 +207,10 @@ export default function TopUpModal({ method, onClose, initialAmountRubles }: Top setError(t('balance.errors.noPaymentLink')); return; } - if (!webApp?.openInvoice) { + // openInvoice requires WebApp version 6.1+ + const supportsInvoice = + webApp?.openInvoice && webApp?.isVersionAtLeast && webApp.isVersionAtLeast('6.1'); + if (!supportsInvoice) { setError(t('balance.errors.starsOnlyInTelegram')); return; } From 56c2d7be90d36521f4f03ea20b68161ac66c6fed Mon Sep 17 00:00:00 2001 From: Egor Date: Wed, 28 Jan 2026 21:02:16 +0300 Subject: [PATCH 3/3] Check WebApp version before opening invoice --- src/pages/Wheel.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pages/Wheel.tsx b/src/pages/Wheel.tsx index 78f9ff1..b6efc99 100644 --- a/src/pages/Wheel.tsx +++ b/src/pages/Wheel.tsx @@ -207,8 +207,12 @@ export default function Wheel() { const starsInvoiceMutation = useMutation({ mutationFn: wheelApi.createStarsInvoice, onSuccess: (data) => { - if (window.Telegram?.WebApp?.openInvoice) { - window.Telegram.WebApp.openInvoice(data.invoice_url, async (status) => { + const webApp = window.Telegram?.WebApp; + // openInvoice requires WebApp version 6.1+ + const supportsInvoice = + webApp?.openInvoice && webApp?.isVersionAtLeast && webApp.isVersionAtLeast('6.1'); + if (supportsInvoice) { + webApp.openInvoice(data.invoice_url, async (status) => { if (status === 'paid') { // Mark this as a Stars spin so handleSpinComplete knows to use the pending result isStarsSpinRef.current = true;