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 { 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 { 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();
useEffect(() => {
document.title = t("common.app_name");
}, [t]);
return (
} />
{/* Public auth routes — full layout but no navbar redirect */}
}
/>
}
/>
}
/>
{/* Protected routes */}
}
/>
}
/>
}
/>
}
/>
}
/>
{/* Fallback */}
} />
);
}