// OnboardingFlow.tsx - Полный onboarding с интеграцией Telegram WebApp SDK // Steps: Welcome → Language → Plan → Create Account // Uses: Telegram.WebApp.MainButton, .BackButton, .themeParams 'use client'; import { useState, useEffect } from 'react'; import { CheckCircle, Globe, Shield, Zap, DollarSign } from 'lucide-react'; // Типы type OnboardingStep = 'welcome' | 'language' | 'plan' | 'creating'; interface Plan { id: string; name: string; price: number; features: string[]; icon: any; } interface OnboardingFlowProps { referrerId?: string; // From URL ?ref=username onComplete: (username: string, token: string) => void; } const PLANS: Plan[] = [ { id: 'basic', name: 'Старт', price: 149, features: ['Безлимитный трафик', 'До 3 устройств', 'Стандартная скорость', 'Email поддержка'], icon: Shield, }, { id: 'plus', name: 'Плюс', price: 249, features: ['Безлимитный трафик', 'До 5 устройств', 'Высокая скорость', 'Выбор локации', 'Приоритетная поддержка'], icon: Zap, }, { id: 'max', name: 'Макс', price: 350, features: ['Безлимитный трафик', 'До 10 устройств', 'Максимальная скорость', 'Все локации', '24/7 поддержка'], icon: DollarSign, }, ]; const LANGUAGES = [ { code: 'ru', name: 'Русский', flag: '🇷🇺' }, { code: 'en', name: 'English', flag: '🇬🇧' }, { code: 'uz', name: 'Oʻzbekcha', flag: '🇺🇿' }, ]; export default function OnboardingFlow({ referrerId, onComplete }: OnboardingFlowProps) { const [step, setStep] = useState('welcome'); const [selectedLanguage, setSelectedLanguage] = useState('ru'); const [selectedPlan, setSelectedPlan] = useState(null); const [isCreating, setIsCreating] = useState(false); const [error, setError] = useState(null); // Telegram WebApp SDK const [telegramWebApp, setTelegramWebApp] = useState(null); const [telegramUser, setTelegramUser] = useState(null); useEffect(() => { // Initialize Telegram WebApp SDK if (typeof window !== 'undefined') { const tg = (window as any).Telegram?.WebApp; if (tg) { setTelegramWebApp(tg); setTelegramUser(tg.initDataUnsafe?.user); tg.ready(); tg.expand(); // Тема применяется через CSS variables в globals.css // НЕ переопределяем --tg-theme-* — таких переменных нет в проекте } } }, []); // Handle MainButton clicks based on current step useEffect(() => { if (!telegramWebApp) return; const handleMainButtonClick = () => { if (step === 'welcome') { setStep('language'); } else if (step === 'language' && selectedLanguage) { setStep('plan'); } else if (step === 'plan' && selectedPlan) { handleCreateAccount(); } }; telegramWebApp.MainButton.onClick(handleMainButtonClick); // Update MainButton based on step if (step === 'welcome') { telegramWebApp.MainButton.text = '🚀 Начать'; telegramWebApp.MainButton.show(); telegramWebApp.BackButton.hide(); } else if (step === 'language') { telegramWebApp.MainButton.text = selectedLanguage ? '➡️ Далее' : '⚠️ Выберите язык'; telegramWebApp.MainButton.show(); telegramWebApp.BackButton.show(); } else if (step === 'plan') { telegramWebApp.MainButton.text = selectedPlan ? '✅ Создать аккаунт' : '⚠️ Выберите тариф'; telegramWebApp.MainButton.show(); telegramWebApp.BackButton.show(); } else if (step === 'creating') { telegramWebApp.MainButton.hide(); telegramWebApp.BackButton.hide(); } return () => { telegramWebApp.MainButton.offClick(handleMainButtonClick); }; }, [step, selectedLanguage, selectedPlan, telegramWebApp]); // Handle BackButton useEffect(() => { if (!telegramWebApp) return; const handleBackButtonClick = () => { if (step === 'language') { setStep('welcome'); } else if (step === 'plan') { setStep('language'); } }; telegramWebApp.BackButton.onClick(handleBackButtonClick); return () => { telegramWebApp.BackButton.offClick(handleBackButtonClick); }; }, [step, telegramWebApp]); const handleCreateAccount = async () => { if (!telegramUser) { setError('❌ Telegram user data not available'); return; } setStep('creating'); setIsCreating(true); setError(null); try { // Генерируем username из Telegram данных const username = telegramUser.username || `user_${telegramUser.id}`; // Создаем аккаунт через API const response = await fetch('/api/create-user', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username, telegramId: telegramUser.id, telegramUsername: telegramUser.username, firstName: telegramUser.first_name, lastName: telegramUser.last_name, plan: selectedPlan, language: selectedLanguage, referrerId: referrerId || null, }), }); const data = await response.json(); if (!data.success) { throw new Error(data.error || 'Failed to create account'); } // Track referral if exists if (referrerId) { await fetch('/api/referral/track', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: data.username, referrer_username: referrerId, }), }); } // Success! onComplete(data.username, data.token); } catch (err: any) { console.error('Create account error:', err); setError(err.message); setStep('plan'); // Вернуться к выбору тарифа setIsCreating(false); } }; // Render Welcome Step if (step === 'welcome') { return (
🚀

Добро пожаловать в Umbrix VPN!

{referrerId && (

🎁 Вы перешли по ссылке от {referrerId}!

Оба получите +7 дней бесплатно при регистрации!

)}

Надежная защита

Ваши данные в безопасности

Высокая скорость

Без ограничений трафика

Простая настройка

Работает за 2 минуты

Нажмите "Начать" для создания аккаунта

); } // Render Language Selection Step if (step === 'language') { return (

Выберите язык

Choose your language

{LANGUAGES.map((lang) => ( ))}
); } // Render Plan Selection Step if (step === 'plan') { return (

Выберите тарифный план

7 дней бесплатно на любом тарифе!

{PLANS.map((plan) => { const Icon = plan.icon; return ( ); })}
); } // Render Creating Account Step if (step === 'creating') { return (

Создаем ваш аккаунт...

Подождите несколько секунд

{error && (

{error}

)}
); } return null; }