import { useEffect, useState } from "react"; import type { Session } from "./api/types"; import { api } from "./api/client"; import { isPrivateRoute } from "./auth/routing"; import { AppShell } from "./layout/AppShell"; import { AdminAutomationPage } from "./pages/AdminAutomationPage"; import { AdminPage } from "./pages/AdminPage"; import { BookPage } from "./pages/BookPage"; import { HomePage } from "./pages/HomePage"; import { LibraryPage } from "./pages/LibraryPage"; import { LoginPage } from "./pages/LoginPage"; import { ProfilePage } from "./pages/ProfilePage"; import { ReaderPage } from "./pages/ReaderPage"; import { SearchPage } from "./pages/SearchPage"; import { SeriesPage } from "./pages/SeriesPage"; import { SetupPage } from "./pages/SetupPage"; import { navigate, parseRoute, type Route } from "./router"; function renderRoute(route: Route, session: Session, refreshSession: () => Promise) { if (route.name === "login") return ; if (route.name === "setup") return ; const content = route.name === "home" ? ( ) : route.name === "library" ? ( ) : route.name === "catalogSeries" ? ( ) : route.name === "book" ? ( ) : route.name === "reader" ? ( ) : route.name === "search" ? ( ) : route.name === "me" ? ( ) : route.name === "admin" && route.section === "automation" ? ( ) : ( ); return ( {content} ); } export function App() { const [route, setRoute] = useState(parseRoute()); const [session, setSession] = useState({ user: null, degraded: false }); const [sessionChecked, setSessionChecked] = useState(false); async function refreshSession() { setSession(await api.session()); setSessionChecked(true); } useEffect(() => { refreshSession(); }, []); useEffect(() => { const listener = () => setRoute(parseRoute()); window.addEventListener("popstate", listener); return () => window.removeEventListener("popstate", listener); }, []); useEffect(() => { const listener = () => { setSession({ user: null, degraded: false }); setSessionChecked(true); if (isPrivateRoute(parseRoute())) navigate("/login"); }; window.addEventListener("readabook:session-expired", listener); return () => window.removeEventListener("readabook:session-expired", listener); }, []); useEffect(() => { if (sessionChecked && !session.user && isPrivateRoute(route)) navigate("/login"); }, [route, session.user, sessionChecked]); if (!sessionChecked && isPrivateRoute(route)) { return (

Cabinet de curiosites numerique

ReadaBook

Verification de session.
); } if (sessionChecked && !session.user && isPrivateRoute(route)) { return ; } return renderRoute(route, session, refreshSession); }