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 { ErrorBoundary } from './components/ErrorBoundary'; import { PermissionRoute } from '@/components/auth/PermissionRoute'; 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'; // Dashboard - load eagerly (default route, LCP-critical) import Dashboard from './pages/Dashboard'; // User pages - lazy load const Subscription = lazy(() => import('./pages/Subscription')); const SubscriptionPurchase = lazy(() => import('./pages/SubscriptionPurchase')); 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 ConnectionQR = lazy(() => import('./pages/ConnectionQR')); const QuickPurchase = lazy(() => import('./pages/QuickPurchase')); const PurchaseSuccess = lazy(() => import('./pages/PurchaseSuccess')); const TopUpMethodSelect = lazy(() => import('./pages/TopUpMethodSelect')); const TopUpAmount = lazy(() => import('./pages/TopUpAmount')); const ConnectedAccounts = lazy(() => import('./pages/ConnectedAccounts')); const LinkTelegramCallback = lazy(() => import('./pages/LinkTelegramCallback')); const MergeAccounts = lazy(() => import('./pages/MergeAccounts')); // 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 AdminSalesStats = lazy(() => import('./pages/AdminSalesStats')); 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 AdminChannelSubscriptions = lazy(() => import('./pages/AdminChannelSubscriptions')); const AdminEmailTemplatePreview = lazy(() => import('./pages/AdminEmailTemplatePreview')); const AdminRoles = lazy(() => import('./pages/AdminRoles')); const AdminRoleEdit = lazy(() => import('./pages/AdminRoleEdit')); const AdminRoleAssign = lazy(() => import('./pages/AdminRoleAssign')); const AdminPolicies = lazy(() => import('./pages/AdminPolicies')); const AdminPolicyEdit = lazy(() => import('./pages/AdminPolicyEdit')); const AdminAuditLog = lazy(() => import('./pages/AdminAuditLog')); const AdminLandings = lazy(() => import('./pages/AdminLandings')); const AdminLandingEditor = lazy(() => import('./pages/AdminLandingEditor')); function ProtectedRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); const isLoading = useAuthStore((state) => state.isLoading); const location = useLocation(); if (isLoading) { return ; } if (!isAuthenticated) { // Сохраняем текущий URL для возврата после авторизации saveReturnUrl(); return ; } return {children}; } function AdminRoute({ children }: { children: React.ReactNode }) { const isAuthenticated = useAuthStore((state) => state.isAuthenticated); const isLoading = useAuthStore((state) => state.isLoading); const isAdmin = useAuthStore((state) => state.isAdmin); 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((state) => state.blockingType); 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 */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* RBAC routes */} } /> } /> } /> } /> } /> } /> } /> } /> {/* Catch all */} } /> ); } export default App;