import { useMemo } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; import { ThemeProvider as NextThemesProvider } from "next-themes"; import { FontScaleApplier } from "@/components/font-scale"; import { QueryClientProvider } from "@/components/query-client-provider"; import { AuthSyncWatcher } from "@/core/auth/sync"; import { I18nProvider } from "@/core/i18n/context"; import { detectLocale } from "@/core/i18n/locale"; import { ChatProvider } from "@/contexts/ChatContext"; import { ThemeProvider } from "@/contexts/ThemeContext"; import { HashRouter, useLocation } from "react-router-dom"; import LandingPage from "./pages/LandingPage"; import LoginPage from "./pages/LoginPage"; import PageRoutes from "./pages/PageRoutes"; import PublicScheduledTaskPage, { PublicScheduledTaskFullscreenPage, } from "./pages/PublicScheduledTaskPage"; import PublicSharePage from "./pages/PublicSharePage"; import PublicLeaderboardPage from "./pages/PublicLeaderboardPage"; import PublicRoundtableSharePage from "./pages/PublicRoundtableSharePage"; import EmbedChatPage from "./pages/EmbedChatPage"; import EmbedRoundtablePage from "./pages/EmbedRoundtablePage"; import { ChatRuntime } from "./pages/WorkspaceRoutes"; import { NotFoundPage } from "./pages/NotFoundPage"; function AppProviders({ children }: { children: React.ReactNode }) { const locale = useMemo(() => detectLocale(), []); const location = useLocation(); const forcedTheme = location.pathname === "/landing" ? "light" : undefined; return ( {/* QueryClientProvider must wrap ThemeProvider because the custom ThemeProvider reads the admin-configured default via useQuery. */} {children} ); } export function App() { return ( } /> } /> } /> } /> {/* Public read-only conversation viewer — no authentication. */} } /> {/* Public read-only user leaderboard publish page — no authentication. */} } /> {/* Public read-only roundtable share — landing + full result report. */} } /> } /> {/* Public read-only scheduled-task runs viewer — no authentication. */} } /> } /> {/* Embedded workspace Q&A — no page/workspace sidebars; parent passes message/username/theme */} } /> {/* Embedded roundtable planning — body only, no sidebars; username login (not wujie ticket) */} } /> } /> } /> ); }