nquest/frontend/src/App.jsx

81 lines
2.1 KiB
React
Raw Normal View History

2023-11-01 23:21:12 +03:00
import { Navigate, Route, RouterProvider, createBrowserRouter, createRoutesFromElements, useLocation, useNavigate, useRouteLoaderData } from 'react-router-dom'
import Layout from './components/Layout'
import Index from './pages/Index'
import Login from './pages/Login'
import Register from './pages/Register'
import NoMatch from './pages/NoMatch'
import Team from './pages/Team'
import Teams from './pages/Teams'
import { UserProvider } from './store/user'
import { ajax } from './utils/fetch'
import TeamNew from './pages/TeamNew'
2023-11-19 22:54:54 +03:00
import Admin from './pages/Admin'
import AdminGame from './pages/AdminGame'
2023-11-01 23:21:12 +03:00
const router = createBrowserRouter(
createRoutesFromElements(
<Route
path="/"
id="root"
element={<Layout />}
loader={async () => ajax("/api/user")}
>
2023-11-19 22:54:54 +03:00
<Route
index
element={<Index />}
loader={() => ajax("/api/games")}
/>
2023-11-01 23:21:12 +03:00
<Route path="login" element={<Login />} />
<Route path="register" element={<Register />} />
<Route
path="teams"
element={<Auth><Teams /></Auth>}
loader={() => ajax("/api/teams")}
/>
<Route
path="teams/new"
element={<Auth><TeamNew /></Auth>}
/>
<Route
path="teams/:teamId"
element={<Auth><Team /></Auth>}
loader={({ params }) => ajax(`/api/teams/${params.teamId}`)}
/>
2023-11-19 22:54:54 +03:00
<Route
path="admin"
element={<Auth role="creator"><Admin /></Auth>}
loader={() => ajax(`/api/admin/games`)}
/>
<Route
path="admin/games/new"
element={<Auth role="creator"><AdminGame /></Auth>}
loader={() => ({
title: "Новая игра",
tasks: []
})}
/>
2023-11-01 23:21:12 +03:00
<Route path="*" element={<NoMatch />} />
</Route>
)
);
function App() {
return (
<RouterProvider router={router} />
)
}
function Auth({ children }) {
const baseUser = useRouteLoaderData("root")
2023-11-19 22:54:54 +03:00
const { user } = UserProvider.useContainer();
2023-11-01 23:21:12 +03:00
const location = useLocation();
if (!user && !baseUser) {
2023-11-19 22:54:54 +03:00
return <Navigate to="/login" state={{ from: location }} replace />;
2023-11-01 23:21:12 +03:00
}
2023-11-19 22:54:54 +03:00
2023-11-01 23:21:12 +03:00
return children;
}
export default App