✨ Setup Wizard: пошаговая настройка после активации подписки
- Выбор устройства (💻 Компьютер / 📱 Телефон) - Проверка наличия приложения - Выбор локаций для Extended тарифа (3 из списка) - Показ ссылки/QR кода - Автоматическое открытие после активации Trial - Прогресс бар для отслеживания шагов
This commit is contained in:
57
app/page.tsx
57
app/page.tsx
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user