|
import React, { useEffect } from "react"; |
|
import { |
|
HashRouter as Router, |
|
Routes, |
|
Route, |
|
useSearchParams, |
|
useLocation, |
|
} 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 AddModelPage from "./pages/AddModelPage/AddModelPage"; |
|
import QuotePage from "./pages/QuotePage/QuotePage"; |
|
import VoteModelPage from "./pages/VoteModelPage/VoteModelPage"; |
|
import Footer from "./components/Footer/Footer"; |
|
import getTheme from "./config/theme"; |
|
import { useThemeMode } from "./hooks/useThemeMode"; |
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; |
|
import LeaderboardProvider from "./pages/LeaderboardPage/components/Leaderboard/context/LeaderboardContext"; |
|
|
|
const queryClient = new QueryClient({ |
|
defaultOptions: { |
|
queries: { |
|
retry: 1, |
|
refetchOnWindowFocus: false, |
|
}, |
|
}, |
|
}); |
|
|
|
function UrlHandler() { |
|
const location = useLocation(); |
|
const [searchParams] = useSearchParams(); |
|
|
|
|
|
useEffect(() => { |
|
|
|
const isHFSpace = window.location !== window.parent.location; |
|
if (!isHFSpace) return; |
|
|
|
|
|
const queryString = window.location.search; |
|
const hash = window.location.hash; |
|
|
|
|
|
window.parent.postMessage( |
|
{ |
|
queryString, |
|
hash, |
|
}, |
|
"https://huggingface.co" |
|
); |
|
}, [location, searchParams]); |
|
|
|
|
|
useEffect(() => { |
|
const handleHashChange = (event) => { |
|
console.log("hash change event", event); |
|
}; |
|
|
|
window.addEventListener("hashchange", handleHashChange); |
|
return () => window.removeEventListener("hashchange", handleHashChange); |
|
}, []); |
|
|
|
return null; |
|
} |
|
|
|
function App() { |
|
const { mode, toggleTheme } = useThemeMode(); |
|
const theme = getTheme(mode); |
|
|
|
return ( |
|
<div |
|
className="App" |
|
style={{ |
|
height: "100%", |
|
width: "100%", |
|
WebkitOverflowScrolling: "touch", |
|
overflow: "auto", |
|
}} |
|
> |
|
<QueryClientProvider client={queryClient}> |
|
<ThemeProvider theme={theme}> |
|
<CssBaseline /> |
|
<Router> |
|
<LeaderboardProvider> |
|
<UrlHandler /> |
|
<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="/add" element={<AddModelPage />} /> |
|
<Route path="/quote" element={<QuotePage />} /> |
|
<Route path="/vote" element={<VoteModelPage />} /> |
|
</Routes> |
|
</Box> |
|
<Footer /> |
|
</Box> |
|
</LeaderboardProvider> |
|
</Router> |
|
</ThemeProvider> |
|
</QueryClientProvider> |
|
</div> |
|
); |
|
} |
|
|
|
export default App; |
|
|