diff --git a/src/components/WebBackButton.tsx b/src/components/WebBackButton.tsx new file mode 100644 index 0000000..61c5555 --- /dev/null +++ b/src/components/WebBackButton.tsx @@ -0,0 +1,32 @@ +import { Link } from 'react-router'; +import { usePlatform } from '../platform'; +import { BackIcon } from './icons'; + +interface WebBackButtonProps { + to: string; + replace?: boolean; + className?: string; +} + +/** + * Back button visible only on web platform. + * Hidden in Telegram Mini App — native back button handles navigation there. + */ +export function WebBackButton({ to, replace, className }: WebBackButtonProps) { + const { platform } = usePlatform(); + + if (platform === 'telegram') return null; + + return ( + + + + ); +} diff --git a/src/pages/RenewSubscription.tsx b/src/pages/RenewSubscription.tsx index 3c3f994..8d2ede2 100644 --- a/src/pages/RenewSubscription.tsx +++ b/src/pages/RenewSubscription.tsx @@ -8,6 +8,7 @@ import { getGlassColors } from '../utils/glassTheme'; import { useCurrency } from '../hooks/useCurrency'; import { useHaptic } from '../platform'; import InsufficientBalancePrompt from '../components/InsufficientBalancePrompt'; +import { WebBackButton } from '../components/WebBackButton'; export default function RenewSubscription() { const { subscriptionId } = useParams<{ subscriptionId: string }>(); @@ -97,17 +98,20 @@ export default function RenewSubscription() { const missingAmount = insufficientMatch ? Number(insufficientMatch[1]) : null; return ( -
+
{/* Title */} -
-

- {t('subscription.extend', 'Продлить подписку')} -

- {subscription?.tariff_name && ( -

- {subscription.tariff_name} -

- )} +
+ +
+

+ {t('subscription.extend', 'Продлить подписку')} +

+ {subscription?.tariff_name && ( +

+ {subscription.tariff_name} +

+ )} +
{/* Balance */} @@ -134,7 +138,7 @@ export default function RenewSubscription() {

) : ( -
+
{options.map((option) => { const isSelected = selectedPeriod === option.period_days; const canAfford = balanceKopeks >= option.price_kopeks; diff --git a/src/pages/Subscription.tsx b/src/pages/Subscription.tsx index 74a9e9e..bf32f9f 100644 --- a/src/pages/Subscription.tsx +++ b/src/pages/Subscription.tsx @@ -3,6 +3,7 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { useNavigate, useParams } from 'react-router'; import { subscriptionApi } from '../api/subscription'; +import { WebBackButton } from '../components/WebBackButton'; import TrafficProgressBar from '../components/dashboard/TrafficProgressBar'; import { HoverBorderGradient } from '../components/ui/hover-border-gradient'; import { useTrafficZone } from '../hooks/useTrafficZone'; @@ -480,12 +481,15 @@ export default function Subscription() { return (
- {/* Page title — native Telegram back button handles navigation */} -

- {isMultiTariff && subscription?.tariff_name - ? subscription.tariff_name - : t('subscription.title')} -

+ {/* Page title */} +
+ +

+ {isMultiTariff && subscription?.tariff_name + ? subscription.tariff_name + : t('subscription.title')} +

+
{/* Current Subscription */} {subscription ? ( diff --git a/src/pages/SubscriptionPurchase.tsx b/src/pages/SubscriptionPurchase.tsx index 4798df5..97e8815 100644 --- a/src/pages/SubscriptionPurchase.tsx +++ b/src/pages/SubscriptionPurchase.tsx @@ -5,6 +5,7 @@ import { useNavigate, useSearchParams } from 'react-router'; import { AxiosError } from 'axios'; import { subscriptionApi } from '../api/subscription'; import { promoApi } from '../api/promo'; +import { WebBackButton } from '../components/WebBackButton'; import { getGlassColors } from '../utils/glassTheme'; import { useTheme } from '../hooks/useTheme'; import type { @@ -407,16 +408,21 @@ export default function SubscriptionPurchase() { return (
- {/* Header — native Telegram back button handles navigation */} -

- {isMultiTariff && !subscriptionId - ? t('subscription.newTariff', 'Новый тариф') - : !isMultiTariff && subscription?.is_daily && !subscription?.is_trial - ? t('subscription.switchTariff.title') - : subscription && !subscription.is_trial - ? t('subscription.extend') - : t('subscription.getSubscription')} -

+ {/* Header */} +
+ +

+ {isMultiTariff && !subscriptionId + ? t('subscription.newTariff', 'Новый тариф') + : !isMultiTariff && subscription?.is_daily && !subscription?.is_trial + ? t('subscription.switchTariff.title') + : subscription && !subscription.is_trial + ? t('subscription.extend') + : t('subscription.getSubscription')} +

+
{/* Tariffs Section */} {isTariffsMode && tariffs.length > 0 && (