import { useEffect, useCallback, useMemo, useRef } from 'react'; import { Link, useNavigate } from 'react-router'; import { useTranslation } from 'react-i18next'; import { useQuery } from '@tanstack/react-query'; import { openLink as sdkOpenLink } from '@telegram-apps/sdk-react'; import { subscriptionApi } from '../api/subscription'; import { useTelegramSDK } from '../hooks/useTelegramSDK'; import { useHaptic } from '@/platform'; import { resolveTemplate, hasTemplates } from '../utils/templateEngine'; import { useAuthStore } from '../store/auth'; import type { AppConfig, RemnawavePlatformData } from '../types'; import InstallationGuide from '../components/connection/InstallationGuide'; export default function Connection() { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const user = useAuthStore((state) => state.user); const isAdmin = useAuthStore((state) => state.isAdmin); const { isTelegramWebApp } = useTelegramSDK(); const { impact: hapticImpact } = useHaptic(); const hapticRef = useRef(hapticImpact); hapticRef.current = hapticImpact; const { data: appConfig, isLoading, error, } = useQuery({ queryKey: ['appConfig'], queryFn: () => subscriptionApi.getAppConfig(), }); const handleGoBack = useCallback(() => { navigate(-1); }, [navigate]); const handleOpenQR = useCallback(() => { navigate('/connection/qr', { replace: !isTelegramWebApp, state: { url: appConfig?.subscriptionUrl, hideLink: appConfig?.hideLink ?? false, }, }); }, [navigate, appConfig?.subscriptionUrl, appConfig?.hideLink, isTelegramWebApp]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') { e.preventDefault(); handleGoBack(); } }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [handleGoBack]); const resolveUrl = useCallback( (url: string): string => { if (!hasTemplates(url) || !appConfig?.subscriptionUrl) return url; return resolveTemplate(url, { subscriptionUrl: appConfig.subscriptionUrl, username: user?.username ?? undefined, }); }, [appConfig?.subscriptionUrl, user?.username], ); const openDeepLink = useCallback( (deepLink: string) => { let resolved = deepLink; if (hasTemplates(resolved)) { resolved = resolveUrl(resolved); } const finalUrl = `${window.location.origin}/miniapp/redirect.html?url=${encodeURIComponent(resolved)}&lang=${i18n.language || 'en'}`; if (isTelegramWebApp) { try { sdkOpenLink(finalUrl, { tryInstantView: false }); return; } catch { // SDK not available, fallback } } window.location.href = finalUrl; }, [isTelegramWebApp, i18n.language, resolveUrl], ); // Check if any platform has configured apps const hasApps = useMemo(() => { if (!appConfig?.platforms) return false; return Object.values(appConfig.platforms).some( (p: RemnawavePlatformData) => p.apps && p.apps.length > 0, ); }, [appConfig?.platforms]); if (isLoading) { return (
); } if (error || !appConfig || !hasApps) { return (

{t('subscription.connection.notConfigured')}

{isAdmin ? t('subscription.connection.notConfiguredAdmin') : t('subscription.connection.notConfiguredUser')}

{isAdmin && ( {t('subscription.connection.goToApps')} )}
); } // No subscription if (!appConfig.hasSubscription) { return (

{t('subscription.connection.title')}

{t('subscription.connection.noSubscription')}

); } return ( ); }