Spaces:
Running
Running
| import React, { useEffect } from "react"; | |
| import { HashRouter as Router, Routes, Route } from "react-router-dom"; | |
| import { ThemeProvider } from "@mui/material/styles"; | |
| import { Box, CssBaseline } from "@mui/material"; | |
| import Navigation from "./components/Navigation/Navigation"; | |
| import LeaderboardPage from "./pages/LeaderboardPage/LeaderboardPage"; | |
| import HowToSubmitPage from "./pages/HowToSubmitPage/HowToSubmitPage"; | |
| import Footer from "./components/Footer/Footer"; | |
| import getTheme from "./config/theme"; | |
| import { useThemeMode } from "./hooks/useThemeMode"; | |
| function App() { | |
| const { mode, toggleTheme } = useThemeMode(); | |
| const theme = getTheme(mode); | |
| // Clean up any theme-related localStorage entries on initial load | |
| useEffect(() => { | |
| localStorage.removeItem("theme-mode"); | |
| }, []); | |
| // Apply theme to document as early as possible | |
| useEffect(() => { | |
| // Apply theme class to document elements | |
| document.documentElement.setAttribute("data-theme", mode); | |
| document.documentElement.classList.remove("light-mode", "dark-mode"); | |
| document.documentElement.classList.add(`${mode}-mode`); | |
| // Apply theme class to body | |
| document.body.classList.remove("light-mode", "dark-mode"); | |
| document.body.classList.add(`${mode}-mode`); | |
| // Apply to root element as well | |
| const rootElement = document.getElementById("root"); | |
| // Update meta theme-color for mobile browsers | |
| let metaThemeColor = document.querySelector("meta[name=theme-color]"); | |
| if (!metaThemeColor) { | |
| metaThemeColor = document.createElement("meta"); | |
| metaThemeColor.name = "theme-color"; | |
| document.head.appendChild(metaThemeColor); | |
| } | |
| }, [mode]); | |
| return ( | |
| <div | |
| className={`App ${mode}-mode`} | |
| style={{ | |
| height: "100%", | |
| width: "100%", | |
| WebkitOverflowScrolling: "touch", | |
| overflow: "auto", | |
| }} | |
| > | |
| <ThemeProvider theme={theme}> | |
| <CssBaseline /> | |
| <Router> | |
| <Box | |
| sx={{ | |
| minHeight: "100vh", | |
| display: "flex", | |
| flexDirection: "column", | |
| bgcolor: "background.default", | |
| color: "text.primary", | |
| }} | |
| > | |
| <Navigation onToggleTheme={toggleTheme} mode={mode} /> | |
| <Box | |
| sx={{ | |
| flex: 1, | |
| display: "flex", | |
| flexDirection: "column", | |
| width: "100%", | |
| px: 4, | |
| pb: 4, | |
| }} | |
| > | |
| <Routes> | |
| <Route path="/" element={<LeaderboardPage />} /> | |
| <Route path="/submit" element={<HowToSubmitPage />} /> | |
| </Routes> | |
| </Box> | |
| <Footer /> | |
| </Box> | |
| </Router> | |
| </ThemeProvider> | |
| </div> | |
| ); | |
| } | |
| export default App; | |