import { useEffect } from "react"; import { BrowserRouter, Routes, Route, Navigate, useLocation, } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { useAuthStore } from "@/stores/authStore"; import { useUiSettingsStore } from "@/stores/uiSettingsStore"; import { Navbar } from "@/components/ui/Navbar"; import { ToastViewport } from "@/components/ui/Toast"; import { ProtectedRoute } from "@/components/auth/ProtectedRoute"; import { LoginPage } from "@/pages/LoginPage"; import { RegisterPage } from "@/pages/RegisterPage"; import { AdminRegisterPage } from "@/pages/AdminRegisterPage"; import { AdminRecoverPage } from "@/pages/AdminRecoverPage"; import { WorldsListPage } from "@/pages/WorldsListPage"; import { WorldBuilderPage } from "@/pages/WorldBuilderPage"; import { WorldEditPage } from "@/pages/WorldEditPage"; import { PlayPage } from "@/pages/PlayPage"; import { AdminPage } from "@/pages/AdminPage"; function Layout({ children }: { children: React.ReactNode }) { return (
{children}
); } function RootRedirect() { const status = useAuthStore((s) => s.status); const user = useAuthStore((s) => s.user); if (status === "authenticated" && user) return ; return ; } function PublicOnly({ children }: { children: React.ReactNode }) { const status = useAuthStore((s) => s.status); const user = useAuthStore((s) => s.user); const location = useLocation(); if (status === "authenticated" && user) { const from = (location.state as { from?: string } | null)?.from; return ; } return <>{children}; } function ScrollToTop() { const { pathname } = useLocation(); useEffect(() => { window.scrollTo(0, 0); }, [pathname]); return null; } export default function App() { const { t } = useTranslation(); const uiSettings = useUiSettingsStore((s) => s.settings); // On mount, fetch public UI settings (page title, favicon, logo). const fetchUiSettings = useUiSettingsStore((s) => s.fetch); useEffect(() => { void fetchUiSettings(); }, [fetchUiSettings]); // Keep document.title in sync with public settings (or default to app name). useEffect(() => { if (uiSettings?.page_title) document.title = uiSettings.page_title; else document.title = t("common.app_name"); }, [uiSettings?.page_title, t]); return ( } /> {/* Public auth routes — full layout but no navbar redirect */} } /> } /> } /> {/* Disaster-recovery admin creation — PUBLIC (no auth), not behind ProtectedRoute. Used when all admins have lost access. */} } /> {/* Protected routes */} } /> } /> } /> } /> } /> {/* Fallback */} } /> ); }