import { lazy, Suspense } from 'react'; import { Routes, Route, Navigate, useLocation } from 'react-router'; import { useAuthStore } from './store/auth'; import { useBlockingStore } from './store/blocking'; import Layout from './components/layout/Layout'; import PageLoader from './components/common/PageLoader'; import { MaintenanceScreen, ChannelSubscriptionScreen, BlacklistedScreen, } from './components/blocking'; import { saveReturnUrl } from './utils/token'; import { useAnalyticsCounters } from './hooks/useAnalyticsCounters'; // Auth pages - load immediately (small) import Login from './pages/Login'; import TelegramCallback from './pages/TelegramCallback'; import TelegramRedirect from './pages/TelegramRedirect'; import DeepLinkRedirect from './pages/DeepLinkRedirect'; import VerifyEmail from './pages/VerifyEmail'; import ResetPassword from './pages/ResetPassword'; import OAuthCallback from './pages/OAuthCallback'; // User pages - lazy load const Dashboard = lazy(() => import('./pages/Dashboard')); const Subscription = lazy(() => import('./pages/Subscription')); const Balance = lazy(() => import('./pages/Balance')); const Referral = lazy(() => import('./pages/Referral')); const Support = lazy(() => import('./pages/Support')); const Profile = lazy(() => import('./pages/Profile')); const Contests = lazy(() => import('./pages/Contests')); const Polls = lazy(() => import('./pages/Polls')); const Info = lazy(() => import('./pages/Info')); const Wheel = lazy(() => import('./pages/Wheel')); const Connection = lazy(() => import('./pages/Connection')); const TopUpMethodSelect = lazy(() => import('./pages/TopUpMethodSelect')); const TopUpAmount = lazy(() => import('./pages/TopUpAmount')); // Admin pages - lazy load (only for admins) const AdminPanel = lazy(() => import('./pages/AdminPanel')); const AdminTickets = lazy(() => import('./pages/AdminTickets')); const AdminTicketSettings = lazy(() => import('./pages/AdminTicketSettings')); const AdminSettings = lazy(() => import('./pages/AdminSettings')); const AdminApps = lazy(() => import('./pages/AdminApps')); const AdminWheel = lazy(() => import('./pages/AdminWheel')); const AdminTariffs = lazy(() => import('./pages/AdminTariffs')); const AdminTariffCreate = lazy(() => import('./pages/AdminTariffCreate')); const AdminServers = lazy(() => import('./pages/AdminServers')); const AdminServerEdit = lazy(() => import('./pages/AdminServerEdit')); const AdminDashboard = lazy(() => import('./pages/AdminDashboard')); const AdminBanSystem = lazy(() => import('./pages/AdminBanSystem')); const AdminBroadcasts = lazy(() => import('./pages/AdminBroadcasts')); const AdminBroadcastCreate = lazy(() => import('./pages/AdminBroadcastCreate')); const AdminPromocodes = lazy(() => import('./pages/AdminPromocodes')); const AdminPromocodeCreate = lazy(() => import('./pages/AdminPromocodeCreate')); const AdminPromocodeStats = lazy(() => import('./pages/AdminPromocodeStats')); const AdminPromoGroups = lazy(() => import('./pages/AdminPromoGroups')); const AdminPromoGroupCreate = lazy(() => import('./pages/AdminPromoGroupCreate')); const AdminCampaigns = lazy(() => import('./pages/AdminCampaigns')); const AdminCampaignCreate = lazy(() => import('./pages/AdminCampaignCreate')); const AdminCampaignStats = lazy(() => import('./pages/AdminCampaignStats')); const AdminCampaignEdit = lazy(() => import('./pages/AdminCampaignEdit')); const AdminPartners = lazy(() => import('./pages/AdminPartners')); const AdminPartnerSettings = lazy(() => import('./pages/AdminPartnerSettings')); const AdminPartnerDetail = lazy(() => import('./pages/AdminPartnerDetail')); const AdminApplicationReview = lazy(() => import('./pages/AdminApplicationReview')); const AdminPartnerCommission = lazy(() => import('./pages/AdminPartnerCommission')); const AdminPartnerRevoke = lazy(() => import('./pages/AdminPartnerRevoke')); const AdminPartnerCampaignAssign = lazy(() => import('./pages/AdminPartnerCampaignAssign')); const AdminWithdrawals = lazy(() => import('./pages/AdminWithdrawals')); const AdminWithdrawalDetail = lazy(() => import('./pages/AdminWithdrawalDetail')); const AdminWithdrawalReject = lazy(() => import('./pages/AdminWithdrawalReject')); const ReferralPartnerApply = lazy(() => import('./pages/ReferralPartnerApply')); const ReferralWithdrawalRequest = lazy(() => import('./pages/ReferralWithdrawalRequest')); const AdminUsers = lazy(() => import('./pages/AdminUsers')); const AdminPayments = lazy(() => import('./pages/AdminPayments')); const AdminPaymentMethods = lazy(() => import('./pages/AdminPaymentMethods')); const AdminPaymentMethodEdit = lazy(() => import('./pages/AdminPaymentMethodEdit')); const AdminPromoOffers = lazy(() => import('./pages/AdminPromoOffers')); const AdminPromoOfferTemplateEdit = lazy(() => import('./pages/AdminPromoOfferTemplateEdit')); const AdminPromoOfferSend = lazy(() => import('./pages/AdminPromoOfferSend')); const AdminRemnawave = lazy(() => import('./pages/AdminRemnawave')); const AdminRemnawaveSquadDetail = lazy(() => import('./pages/AdminRemnawaveSquadDetail')); const AdminEmailTemplates = lazy(() => import('./pages/AdminEmailTemplates')); const AdminTrafficUsage = lazy(() => import('./pages/AdminTrafficUsage')); const AdminUpdates = lazy(() => import('./pages/AdminUpdates')); const AdminUserDetail = lazy(() => import('./pages/AdminUserDetail')); const AdminBroadcastDetail = lazy(() => import('./pages/AdminBroadcastDetail')); const AdminPinnedMessages = lazy(() => import('./pages/AdminPinnedMessages')); const AdminPinnedMessageCreate = lazy(() => import('./pages/AdminPinnedMessageCreate')); const AdminEmailTemplatePreview = lazy(() => import('./pages/AdminEmailTemplatePreview')); function ProtectedRoute({ children }: { children: React.ReactNode }) { const { isAuthenticated, isLoading } = useAuthStore(); const location = useLocation(); if (isLoading) { return ; } if (!isAuthenticated) { // Сохраняем текущий URL для возврата после авторизации saveReturnUrl(); return ; } return {children}; } function AdminRoute({ children }: { children: React.ReactNode }) { const { isAuthenticated, isLoading, isAdmin } = useAuthStore(); const location = useLocation(); if (isLoading) { return ; } if (!isAuthenticated) { // Сохраняем текущий URL для возврата после авторизации saveReturnUrl(); return ; } if (!isAdmin) { return ; } return {children}; } // Suspense wrapper for lazy components function LazyPage({ children }: { children: React.ReactNode }) { return }>{children}; } function BlockingOverlay() { const { blockingType } = useBlockingStore(); if (blockingType === 'maintenance') { return ; } if (blockingType === 'channel_subscription') { return ; } if (blockingType === 'blacklisted') { return ; } return null; } function App() { useAnalyticsCounters(); return ( <> {/* Public routes */} } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Protected routes */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Admin routes */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Catch all */} } /> ); } export default App;