import { useEffect, useState } from "react"; import { QueryClientProvider } from "@tanstack/react-query"; import { RouterProvider } from "@tanstack/react-router"; import { fetchMe, type SessionUser } from "./api.js"; import { Login } from "./Login.js"; import { queryClient } from "./lib/query.js"; import { setLanguage } from "./lib/i18n/index.js"; import { applyTheme, applyFontScale } from "./lib/theme.js"; import { router } from "./router.js"; // App root: bootstraps the session (cookie-based, from /api/auth/me), then hands // off to TanStack Router inside the QueryClient provider. The router renders the // terminal chrome + screens; auth gating stays here (Login until signed in), and // the signed-in user flows into the router context for role-based route guards. // See wiki/entities/react-vite-spa.md and local-jwt-auth.md. export function App() { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { fetchMe() .then(setUser) .finally(() => setLoading(false)); }, []); // Apply the signed-in user's preferred language + theme + font scale whenever they // resolve/change (login, bootstrap, or a toggle). Albanian + dark + 100% are the defaults // before auth resolves; on logout, fall back so the Login screen is consistent. useEffect(() => { if (user) { setLanguage(user.language); applyTheme(user.theme); applyFontScale(user.fontScale); } else { applyTheme("dark"); applyFontScale(100); } }, [user]); if (loading) { return
loading…
; } if (!user) { return ( ); } return ( ); }