// app/dashboard/page.tsx - Main dashboard for existing users // Shows subscription status, QR code, referral stats, quick actions 'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import QRCodeModal from '@/components/QRCodeModal'; import ReferralModal from '@/components/ReferralModal'; import { marzbanApi } from '@/lib/marzban-api'; import { getSubscriptionUrl } from '@/lib/constants'; import { Shield, Settings, Gift, HelpCircle, QrCode, Copy, Share2, CheckCircle, AlertCircle, Clock, Users, } from 'lucide-react'; export default function Dashboard() { const router = useRouter(); const [isLoading, setIsLoading] = useState(true); const [subscriptionToken, setSubscriptionToken] = useState(null); const [subscriptionStatus, setSubscriptionStatus] = useState<'active' | 'expired' | 'trial'>('active'); const [expiryDate, setExpiryDate] = useState(''); const [daysRemaining, setDaysRemaining] = useState(0); const [username, setUsername] = useState(''); const [isQROpen, setIsQROpen] = useState(false); const [isReferralOpen, setIsReferralOpen] = useState(false); const [showToast, setShowToast] = useState(false); const [toastMessage, setToastMessage] = useState(''); const [referralCount, setReferralCount] = useState(0); const [bonusDays, setBonusDays] = useState(0); const subscriptionUrl = subscriptionToken ? getSubscriptionUrl(subscriptionToken) : ''; useEffect(() => { loadUserData(); }, []); const loadUserData = async () => { try { // Get Telegram data const telegramWebApp = (window as any).Telegram?.WebApp; const telegramId = telegramWebApp?.initDataUnsafe?.user?.id; const telegramUsername = telegramWebApp?.initDataUnsafe?.user?.username; if (!telegramId && !telegramUsername) { console.log('❌ No Telegram data - redirecting to home'); router.push('/'); return; } // Load subscription const params = new URLSearchParams(); if (telegramId) params.append('telegramId', telegramId.toString()); if (telegramUsername) params.append('telegramUsername', telegramUsername); const response = await fetch(`/api/user-subscription?${params.toString()}`); const data = await response.json(); if (!data.success || !data.hasSubscription) { console.log('❌ No subscription - redirecting to home'); router.push('/'); return; } setSubscriptionToken(data.token); setUsername(data.username); setSubscriptionStatus(data.status === 'active' ? 'active' : 'expired'); if (data.expire) { setExpiryDate(marzbanApi.formatExpireDate(data.expire)); // Calculate days remaining const expireTimestamp = data.expire * 1000; const now = Date.now(); const diff = expireTimestamp - now; const days = Math.ceil(diff / (1000 * 60 * 60 * 24)); setDaysRemaining(days > 0 ? days : 0); } // Load referral stats const referralResponse = await fetch(`/api/referral/stats?username=${data.username}`); const referralData = await referralResponse.json(); if (referralData.success) { setReferralCount(referralData.referral_count || 0); setBonusDays(referralData.bonus_days_earned || 0); } } catch (error) { console.error('Failed to load user data:', error); router.push('/'); } finally { setIsLoading(false); } }; const showToastNotification = (message: string) => { setToastMessage(message); setShowToast(true); setTimeout(() => setShowToast(false), 3000); }; const copyToClipboard = async (text: string) => { try { await navigator.clipboard.writeText(text); showToastNotification('✅ Скопировано в буфер обмена!'); } catch (err) { console.error('Failed to copy:', err); showToastNotification('❌ Ошибка копирования'); } }; const shareReferralLink = async () => { const botUsername = process.env.NEXT_PUBLIC_TELEGRAM_BOT_USERNAME || 'Chat_8n8_bot'; const referralUrl = `https://t.me/${botUsername}?start=ref_${username}`; const telegramWebApp = (window as any).Telegram?.WebApp; if (telegramWebApp?.openTelegramLink) { const shareText = encodeURIComponent(`🚀 Попробуй Umbrix VPN! Получи 7 дней бесплатно по моей ссылке:\n${referralUrl}`); telegramWebApp.openTelegramLink(`https://t.me/share/url?url=${referralUrl}&text=${shareText}`); } else { copyToClipboard(referralUrl); } }; if (isLoading) { return (

Загрузка...

); } return (
{/* Header */}

🚀 Umbrix VPN

{/* Main Content */}
{/* Subscription Status Card */}

Ваша подписка

@{username}

{subscriptionStatus === 'active' ? (
Активна
) : (
Истекла
)}
Осталось дней

{daysRemaining}

{expiryDate}

Рефералы

{referralCount}

+{bonusDays} дней заработано

{/* Quick Actions */}
{/* Referral Progress (if has referrals) */} {referralCount > 0 && (

🎉 Прогресс реферальной программы

До следующего бонуса {referralCount}/5

{referralCount >= 5 ? '🎁 Вы получили месяц в подарок!' : `Пригласите еще ${5 - referralCount} друзей и получите месяц бесплатно!`}

)} {/* Setup Guide Link */}

Инструкция по настройке

Как подключить VPN на вашем устройстве

{/* Spacer для BottomNav */}
{/* Modals */} {isQROpen && subscriptionUrl && ( setIsQROpen(false)} /> )} {isReferralOpen && ( setIsReferralOpen(false)} referralUrl={`https://t.me/${process.env.NEXT_PUBLIC_TELEGRAM_BOT_USERNAME || 'Chat_8n8_bot'}?start=ref_${username}`} onShare={shareReferralLink} onCopy={() => copyToClipboard(`https://t.me/${process.env.NEXT_PUBLIC_TELEGRAM_BOT_USERNAME || 'Chat_8n8_bot'}?start=ref_${username}`)} /> )} {/* Toast */} {showToast && (
{toastMessage}
)}
); }