import React, { lazy, Suspense } from 'react'; import { ChakraProvider, extendTheme, Spinner, Center, Box } from '@chakra-ui/react'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { BrowserRouter as Router, Routes, Route, Navigate, Outlet } from 'react-router-dom'; import { AuthProvider, useAuth } from './contexts/AuthContext'; import { ClubThemeProvider } from './contexts/ClubThemeContext'; import { HelmetProvider } from 'react-helmet-async'; import { theme } from './App'; import { useUmami } from './hooks/useUmami'; import { useFontLoader } from './hooks/useFontLoader'; import DefaultSEO from './components/seo/DefaultSEO'; import CookieBanner from './components/CookieBanner'; import ProtectedRoute from './components/ProtectedRoute'; import { getSetupStatus } from './services/setup'; import { useState, useEffect } from 'react'; // Create a client const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 5 * 60 * 1000, cacheTime: 10 * 60 * 1000, refetchOnWindowFocus: false, refetchOnMount: false, retry: 1, }, }, }); // Loading component const PageLoader = () => (
Načítání...
); // Lazy load pages for code splitting const HomePage = lazy(() => import('./pages/HomePage')); const BlogPage = lazy(() => import('./pages/BlogPage')); const ArticleDetailPage = lazy(() => import('./pages/ArticleDetailPage')); const ActivityDetailPage = lazy(() => import('./pages/ActivityDetailPage')); const MatchDetailPage = lazy(() => import('./pages/MatchDetailPage')); const ClubPage = lazy(() => import('./pages/ClubPage')); const CalendarPage = lazy(() => import('./pages/CalendarPage')); const TablesPage = lazy(() => import('./pages/TablesPage')); const MatchesPage = lazy(() => import('./pages/MatchesPage')); const PlayersPage = lazy(() => import('./pages/PlayersPage')); const PlayerDetailPage = lazy(() => import('./pages/PlayerDetailPage')); const SponsorsPage = lazy(() => import('./pages/SponsorsPage')); const ContactPage = lazy(() => import('./pages/ContactPage')); const GalleryPage = lazy(() => import('./pages/GalleryPage')); const AlbumDetailPage = lazy(() => import('./pages/AlbumDetailPage')); const AuthPage = lazy(() => import('./pages/AuthPage')); const RegisterPage = lazy(() => import('./pages/RegisterPage')); const ForgotPasswordPage = lazy(() => import('./pages/ForgotPasswordPage')); const ResetPasswordPage = lazy(() => import('./pages/ResetPasswordPage')); const ActivitiesCalendarPage = lazy(() => import('./pages/ActivitiesCalendarPage')); const AboutPage = lazy(() => import('./pages/AboutPage')); const SetupPage = lazy(() => import('./pages/SetupPage')); const StylePreviewPage = lazy(() => import('./pages/StylePreviewPage')); const NewsletterUnsubscribePage = lazy(() => import('./pages/NewsletterUnsubscribePage')); const NewsletterPreferencesPage = lazy(() => import('./pages/NewsletterPreferencesPage')); const VideosPage = lazy(() => import('./pages/VideosPage')); const SearchPage = lazy(() => import('./pages/SearchPage')); const ClothingPage = lazy(() => import('./pages/ClothingPage')); const PollsPage = lazy(() => import('./pages/PollsPage')); const OverlayScoreboardPage = lazy(() => import('./pages/OverlayScoreboardPage')); const OverlaySponsorsPage = lazy(() => import('./pages/OverlaySponsorsPage')); const NotFoundPage = lazy(() => import('./pages/NotFoundPage')); const ForbiddenPage = lazy(() => import('./pages/ForbiddenPage')); // Legal pages const CookiePolicyPage = lazy(() => import('./pages/legal/CookiePolicyPage')); const TermsPage = lazy(() => import('./pages/legal/TermsPage')); const PrivacyPolicyPage = lazy(() => import('./pages/legal/PrivacyPolicyPage')); // Admin pages const AdminDashboardPage = lazy(() => import('./pages/admin/AdminDashboardPage')); const ArticlesAdminPage = lazy(() => import('./pages/admin/ArticlesAdminPage')); const SponsorsAdminPage = lazy(() => import('./pages/admin/SponsorsAdminPage')); const CategoriesAdminPage = lazy(() => import('./pages/admin/CategoriesAdminPage')); const MediaAdminPage = lazy(() => import('./pages/admin/MediaAdminPage')); const MatchesAdminPage = lazy(() => import('./pages/admin/MatchesAdminPage')); const PlayersAdminPage = lazy(() => import('./pages/admin/PlayersAdminPage')); const TeamsAdminPage = lazy(() => import('./pages/admin/TeamsAdminPage')); const BannersAdminPage = lazy(() => import('./pages/admin/BannersAdminPage')); const MessagesAdminPage = lazy(() => import('./pages/admin/MessagesAdminPage')); const SettingsAdminPage = lazy(() => import('./pages/admin/SettingsAdminPage')); const UsersAdminPage = lazy(() => import('./pages/admin/UsersAdminPage')); const NewsletterAdminPage = lazy(() => import('./pages/admin/NewsletterAdminPage')); const CompetitionAliasesAdminPage = lazy(() => import('./pages/admin/CompetitionAliasesAdminPage')); const PrefetchAdminPage = lazy(() => import('./pages/admin/PrefetchAdminPage')); const AdminVideosPage = lazy(() => import('./pages/admin/AdminVideosPage')); const GalleryAdminPage = lazy(() => import('./pages/admin/GalleryAdminPage')); const AdminActivitiesPage = lazy(() => import('./pages/admin/AdminActivitiesPage')); const AdminMerchPage = lazy(() => import('./pages/admin/AdminMerchPage')); const AdminResetPasswordPage = lazy(() => import('./pages/admin/AdminResetPasswordPage')); const AboutAdminPage = lazy(() => import('./pages/admin/AboutAdminPage')); const AnalyticsAdminPage = lazy(() => import('./pages/admin/AnalyticsAdminPage')); const FilesAdminPage = lazy(() => import('./pages/admin/FilesAdminPage')); const ContactsAdminPage = lazy(() => import('./pages/admin/ContactsAdminPage')); const NavigationAdminPage = lazy(() => import('./pages/admin/NavigationAdminPage')); const PollsAdminPage = lazy(() => import('./pages/admin/PollsAdminPage')); const CommentsAdminPage = lazy(() => import('./pages/admin/CommentsAdminPage')); const AdminDocsPage = lazy(() => import('./pages/admin/AdminDocsPage')); const ScoreboardAdminPage = lazy(() => import('./pages/admin/ScoreboardAdminPage')); const MobileScoreboardControlPage = lazy(() => import('./pages/admin/MobileScoreboardControlPage')); const ShortlinksAdminPage = lazy(() => import('./pages/admin/ShortlinksAdminPage')); const EngagementAdminPage = lazy(() => import('./pages/admin/EngagementAdminPage')); const SemiAdminPage = lazy(() => import('./pages/SemiAdminPage')); // Analytics and font loader const AnalyticsInitializer: React.FC = () => { useUmami(); return null; }; const FontLoader: React.FC = () => { useFontLoader(); return null; }; // Public route wrapper const PublicRoute = ({ children }: { children: React.ReactNode }) => { const { isAuthenticated, isLoading } = useAuth(); const [checkingSetup, setCheckingSetup] = useState(true); const [requiresSetup, setRequiresSetup] = useState(false); useEffect(() => { let mounted = true; (async () => { try { const s = await getSetupStatus(); if (mounted) setRequiresSetup(!!s.requires_setup); } catch (_) { if (mounted) setRequiresSetup(false); } finally { if (mounted) setCheckingSetup(false); } })(); return () => { mounted = false; }; }, []); if (isLoading || checkingSetup) { return ; } if (isAuthenticated) { return ; } const currentPath = window.location.pathname; if (requiresSetup && currentPath !== '/setup') { return ; } return <>{children}; }; const AdminRoutesWrapper = () => { return ; }; const AppLazy: React.FC = () => { return ( }> {/* Public routes */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Legal pages */} } /> } /> } /> {/* Article routes */} } /> } /> } /> } /> } /> } /> {/* Redirects */} } /> } /> {/* Setup */} } /> } /> {/* Auth */} } /> } /> } /> } /> } /> } /> } /> } /> {/* Admin routes */} }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* Legacy admin routes */} } /> } /> } /> } /> } /> {/* 404 */} } /> ); }; export default AppLazy;