/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useEffect, Suspense } from 'react'; import { HelmetProvider } from 'react-helmet-async'; import ReactDOM from 'react-dom/client'; import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; import './index.css'; import LandingPage from './components/LandingPage'; import CookieConsent from './components/CookieConsent'; import { LanguageProvider } from './src/i18n/LanguageContext'; import GeoRedirect from './src/i18n/GeoRedirect'; import LanguageRoute from './src/i18n/LanguageRoute'; // Observability — error tracking + product analytics import { initSentry, SentryErrorBoundary } from './src/observability/sentry'; import { initPosthog } from './src/observability/posthog'; // Fire observability init as early as possible. Both modules no-op if their // env vars are missing (dev + untrusted builds stay quiet). initSentry(); initPosthog(); // Lazy-loaded route components for code splitting const Login = React.lazy(() => import('./components/Login')); const Generator = React.lazy(() => import('./components/Generator')); const AdminPanel = React.lazy(() => import('./components/AdminPanel')); // New admin system (Phase 0/1/2/3) — replaces simple AdminPanel with nested RBAC routes const AdminLayout = React.lazy(() => import('./components/admin/AdminLayout')); const AdminDashboard = React.lazy(() => import('./components/admin/AdminDashboard')); const AdminUsers = React.lazy(() => import('./components/admin/AdminUsers')); const AdminRoleManagement = React.lazy(() => import('./components/admin/AdminRoleManagement')); const AdminAuditLog = React.lazy(() => import('./components/admin/AdminAuditLog')); const AdminBilling = React.lazy(() => import('./components/admin/AdminBilling')); const AdminMessages = React.lazy(() => import('./components/admin/AdminMessages')); const AdminAnalytics = React.lazy(() => import('./components/admin/AdminAnalytics')); const AdminContent = React.lazy(() => import('./components/admin/AdminContent')); const AdminPlaceholder = React.lazy(() => import('./components/admin/AdminPlaceholder')); const UserSettings = React.lazy(() => import('./components/UserSettings')); const LegalPages = React.lazy(() => import('./components/LegalPages')); const ContactPage = React.lazy(() => import('./components/ContactPage')); const BlogListPage = React.lazy(() => import('./components/BlogListPage')); const BlogPost = React.lazy(() => import('./components/BlogPost')); const NotFoundPage = React.lazy(() => import('./components/NotFoundPage')); const DemoGenerator = React.lazy(() => import('./components/DemoGenerator')); const GscCallback = React.lazy(() => import('./components/GscCallback')); const GscDashboard = React.lazy(() => import('./components/GscDashboard')); const FeaturePage = React.lazy(() => import('./components/FeaturePage')); const FeaturesListPage = React.lazy(() => import('./components/FeaturesListPage')); const AuditPage = React.lazy(() => import('./components/AuditPage')); // const ChatWidget = React.lazy(() => import('./components/ChatWidget')); function LoadingFallback() { return (
Načítání...
); } function App() { useEffect(() => { // Skip mouse tracking on touch devices (mobile) to save CPU if ('ontouchstart' in window || navigator.maxTouchPoints > 0) return; let ticking = false; const handleMouseMove = (e: MouseEvent) => { if (ticking) return; ticking = true; requestAnimationFrame(() => { const x = (e.clientX / window.innerWidth) * 100; const y = (e.clientY / window.innerHeight) * 100; document.documentElement.style.setProperty('--mouse-x', `${x}%`); document.documentElement.style.setProperty('--mouse-y', `${y}%`); ticking = false; }); }; window.addEventListener('mousemove', handleMouseMove, { passive: true }); return () => window.removeEventListener('mousemove', handleMouseMove); }, []); return ( }> {/* Root → detect language and redirect */} } /> {/* Language-prefixed routes */} }> } /> } /> } /> } /> {/* Legacy admin (master prompts, blog CRUD, live chat) — kept as fallback until Phase 2/3 migrates its features */} } /> {/* New RBAC admin — nested routing with granular permissions */} }> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* OAuth callback — fixed path, no language prefix */} } /> {/* Legacy routes without prefix → redirect to /en/ */} } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> {/* ChatWidget disabled — re-enable when ready */} ); } function ErrorFallback() { return (
Σ

Something broke

SEOKRATES hit an unexpected error. Our team has been notified. Refresh to try again.

); } const rootElement = document.getElementById('root'); if (rootElement) { const root = ReactDOM.createRoot(rootElement); root.render( }> ); }