Files
rowy/src/App.tsx

192 lines
7.3 KiB
TypeScript
Raw Permalink Normal View History

2021-09-01 15:54:20 +10:00
import { lazy, Suspense } from "react";
import { Routes, Route, Navigate } from "react-router-dom";
import { useAtom } from "jotai";
2021-09-01 15:54:20 +10:00
import { Backdrop } from "@mui/material";
2021-10-29 11:47:12 +11:00
import Loading from "@src/components/Loading";
import ProjectSourceFirebase from "@src/sources/ProjectSourceFirebase";
2022-08-15 12:45:45 +02:00
import MembersSourceFirebase from "@src/sources/MembersSourceFirebase";
import ConfirmDialog from "@src/components/ConfirmDialog";
import RowyRunModal from "@src/components/RowyRunModal";
2022-06-08 14:11:00 +10:00
import NotFound from "@src/pages/NotFoundPage";
import RequireAuth from "@src/layouts/RequireAuth";
2022-09-27 16:17:44 +10:00
import AdminRoute from "@src/layouts/AdminRoute";
2021-09-01 15:54:20 +10:00
import {
2022-07-18 14:40:46 +10:00
projectScope,
currentUserAtom,
2022-08-15 12:45:45 +02:00
userRolesAtom,
altPressAtom,
2022-07-18 14:40:46 +10:00
} from "@src/atoms/projectScope";
import { ROUTES } from "@src/constants/routes";
import useKeyPressWithAtom from "@src/hooks/useKeyPressWithAtom";
2021-09-01 15:54:20 +10:00
2022-06-08 14:11:00 +10:00
import TableGroupRedirectPage from "./pages/TableGroupRedirectPage";
import SignOutPage from "@src/pages/Auth/SignOutPage";
import ProvidedArraySubTablePage from "./pages/Table/ProvidedArraySubTablePage";
2021-09-01 20:32:48 +10:00
// prettier-ignore
2022-06-08 14:11:00 +10:00
const AuthPage = lazy(() => import("@src/pages/Auth/AuthPage" /* webpackChunkName: "AuthPage" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const SignUpPage = lazy(() => import("@src/pages/Auth/SignUpPage" /* webpackChunkName: "SignUpPage" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const JwtAuthPage = lazy(() => import("@src/pages/Auth/JwtAuthPage" /* webpackChunkName: "JwtAuthPage" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const ImpersonatorAuthPage = lazy(() => import("@src/pages/Auth/ImpersonatorAuthPage" /* webpackChunkName: "ImpersonatorAuthPage" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const SetupPage = lazy(() => import("@src/pages/SetupPage" /* webpackChunkName: "SetupPage" */));
// prettier-ignore
const Navigation = lazy(() => import("@src/layouts/Navigation" /* webpackChunkName: "Navigation" */));
// prettier-ignore
const TableSettingsDialog = lazy(() => import("@src/components/TableSettingsDialog" /* webpackChunkName: "TableSettingsDialog" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const TablesPage = lazy(() => import("@src/pages/TablesPage" /* webpackChunkName: "TablesPage" */));
// prettier-ignore
const ProvidedTablePage = lazy(() => import("@src/pages/Table/ProvidedTablePage" /* webpackChunkName: "ProvidedTablePage" */));
// prettier-ignore
const ProvidedSubTablePage = lazy(() => import("@src/pages/Table/ProvidedSubTablePage" /* webpackChunkName: "ProvidedSubTablePage" */));
2022-07-14 13:36:17 +10:00
// prettier-ignore
const TableTutorialPage = lazy(() => import("@src/pages/Table/TableTutorialPage" /* webpackChunkName: "TableTutorialPage" */));
// prettier-ignore
2022-06-08 14:11:00 +10:00
const UserSettingsPage = lazy(() => import("@src/pages/Settings/UserSettingsPage" /* webpackChunkName: "UserSettingsPage" */));
2021-09-14 11:13:01 +10:00
// prettier-ignore
2022-06-08 14:11:00 +10:00
const ProjectSettingsPage = lazy(() => import("@src/pages/Settings/ProjectSettingsPage" /* webpackChunkName: "ProjectSettingsPage" */));
// prettier-ignore
2022-07-06 15:23:05 +10:00
const MembersPage = lazy(() => import("@src/pages/Settings/MembersPage" /* webpackChunkName: "MembersPage" */));
2022-06-28 17:14:11 +10:00
// prettier-ignore
2022-10-11 12:01:00 +11:00
const DebugPage = lazy(() => import("@src/pages/Settings/DebugPage" /* webpackChunkName: "DebugPage" */));
2021-09-01 15:54:20 +10:00
export default function App() {
2022-07-18 14:40:46 +10:00
const [currentUser] = useAtom(currentUserAtom, projectScope);
2022-08-15 12:45:45 +02:00
const [userRoles] = useAtom(userRolesAtom, projectScope);
2022-07-18 14:40:46 +10:00
useKeyPressWithAtom("Alt", altPressAtom, projectScope);
2021-09-01 15:59:30 +10:00
return (
<Suspense fallback={<Loading fullScreen />}>
<ProjectSourceFirebase />
2022-08-15 12:45:45 +02:00
{userRoles.includes("ADMIN") && <MembersSourceFirebase />}
<ConfirmDialog />
<RowyRunModal />
{currentUser === undefined ? (
<Loading fullScreen message="Authenticating" />
) : (
<Routes>
<Route path="*" element={<NotFound />} />
<Route path={ROUTES.auth} element={<AuthPage />} />
<Route path={ROUTES.signUp} element={<SignUpPage />} />
<Route path={ROUTES.signOut} element={<SignOutPage />} />
<Route path={ROUTES.jwtAuth} element={<JwtAuthPage />} />
<Route
path={ROUTES.impersonatorAuth}
element={
<RequireAuth>
<ImpersonatorAuthPage />
</RequireAuth>
}
/>
<Route path={ROUTES.setup} element={<SetupPage />} />
<Route
path="/"
element={
<RequireAuth>
<Navigation>
<TableSettingsDialog />
</Navigation>
</RequireAuth>
}
>
<Route
path={ROUTES.home}
element={<Navigate to={ROUTES.tables} replace />}
/>
<Route path={ROUTES.tables} element={<TablesPage />} />
<Route path={ROUTES.table}>
<Route index element={<Navigate to={ROUTES.tables} replace />} />
<Route path=":id" element={<ProvidedTablePage />}>
<Route path={ROUTES.subTable}>
<Route index element={<NotFound />} />
<Route
path=":docPath/:subTableKey"
element={
<Suspense
fallback={
<Backdrop
key="sub-table-modal-backdrop"
open
sx={{ zIndex: "modal" }}
>
<Loading />
</Backdrop>
}
>
<ProvidedSubTablePage />
</Suspense>
}
/>
</Route>
<Route path={ROUTES.arraySubTable}>
<Route index element={<NotFound />} />
<Route
path=":docPath/:subTableKey"
element={
<Suspense
fallback={
<Backdrop
key="sub-table-modal-backdrop"
open
sx={{ zIndex: "modal" }}
>
<Loading />
</Backdrop>
}
>
<ProvidedArraySubTablePage />
</Suspense>
}
/>
</Route>
</Route>
</Route>
<Route path={ROUTES.tableGroup}>
<Route index element={<Navigate to={ROUTES.tables} replace />} />
<Route path=":id" element={<TableGroupRedirectPage />} />
</Route>
2022-07-14 13:36:17 +10:00
<Route
path={ROUTES.tableTutorial}
element={<TableTutorialPage />}
/>
<Route
path={ROUTES.settings}
element={<Navigate to={ROUTES.userSettings} replace />}
/>
<Route path={ROUTES.userSettings} element={<UserSettingsPage />} />
<Route
path={ROUTES.projectSettings}
2022-09-27 16:17:44 +10:00
element={
<AdminRoute>
<ProjectSettingsPage />
</AdminRoute>
}
/>
2022-07-06 15:23:05 +10:00
<Route path={ROUTES.members} element={<MembersPage />} />
2022-10-11 12:01:00 +11:00
<Route path={ROUTES.debug} element={<DebugPage />} />
</Route>
</Routes>
)}
</Suspense>
2021-09-01 15:59:30 +10:00
);
2021-09-01 15:54:20 +10:00
}