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;