Setup Wizard: пошаговая настройка после активации подписки

- Выбор устройства (💻 Компьютер / 📱 Телефон)
- Проверка наличия приложения
- Выбор локаций для Extended тарифа (3 из списка)
- Показ ссылки/QR кода
- Автоматическое открытие после активации Trial
- Прогресс бар для отслеживания шагов
This commit is contained in:
Umbrix Dev
2026-02-05 12:11:55 +03:00
parent 0c49f27e76
commit 6cb9335955
2 changed files with 487 additions and 2 deletions

View File

@@ -9,6 +9,7 @@ import { useRouter } from 'next/navigation';
import Link from 'next/link';
import QRCodeModal from '@/components/QRCodeModal';
import ReferralModal from '@/components/ReferralModal';
import SetupWizard from '@/components/SetupWizard';
import { marzbanApi } from '@/lib/marzban-api';
import { getSubscriptionUrl, MARZBAN_SUBSCRIPTION_URL } from '@/lib/constants';
import {
@@ -41,6 +42,7 @@ export default function Home() {
const [isKeyMenuOpen, setIsKeyMenuOpen] = useState(false);
const [isQROpen, setIsQROpen] = useState(false);
const [isReferralOpen, setIsReferralOpen] = useState(false);
const [isSetupWizardOpen, setIsSetupWizardOpen] = useState(false);
const [subscriptionStatus, setSubscriptionStatus] = useState<'active' | 'expired' | 'none'>('none');
const [expiryDate, setExpiryDate] = useState<string>('');
const [showToast, setShowToast] = useState(false);
@@ -168,6 +170,45 @@ export default function Home() {
copyToClipboard(shareText);
}
};
const handleActivateTrial = async () => {
setIsLoading(true);
try {
// Создаем trial подписку через API
const response = await fetch('/api/create-user', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
planType: 'trial',
telegramId: Date.now(), // Временно, пока нет настоящего Telegram ID
telegramUsername: 'demo_user',
firstName: 'Demo',
}),
});
const data = await response.json();
if (data.success) {
// Сохраняем токен
setSubscriptionToken(data.token);
setHasSubscription(true);
setSubscriptionStatus('active');
setExpiryDate(data.expiryDate);
localStorage.setItem('subscriptionToken', data.token);
// Открываем Setup Wizard
setIsSetupWizardOpen(true);
} else {
showToastNotification('❌ Ошибка создания подписки');
}
} catch (error) {
console.error('Failed to activate trial:', error);
showToastNotification('❌ Ошибка активации');
} finally {
setIsLoading(false);
}
};
return (
<div
className="min-h-screen flex flex-col"
@@ -275,8 +316,8 @@ export default function Home() {
{!hasSubscription && (
<ActionButton
icon={<Gift className="w-5 h-5" />}
text="Попробовать 7 дней бесплатно"
onClick={() => (window.location.href = '/plans')}
text={isLoading ? "Активация..." : "Попробовать 7 дней бесплатно"}
onClick={handleActivateTrial}
/>
)}
<ActionButton
@@ -501,6 +542,18 @@ export default function Home() {
}}
/>
{/* Setup Wizard Modal */}
{subscriptionToken && (
<SetupWizard
isOpen={isSetupWizardOpen}
onClose={() => setIsSetupWizardOpen(false)}
subscriptionUrl={getSubscriptionUrl(subscriptionToken)}
username={subscriptionToken}
planType="trial"
expiryDate={expiryDate}
/>
)}
{/* Toast Notification */}
{showToast && (
<div className="fixed bottom-24 left-1/2 transform -translate-x-1/2 z-50 animate-fade-in">