Portal/rsconcept/frontend/src/app/Router.tsx

101 lines
3.2 KiB
TypeScript
Raw Normal View History

2024-11-25 19:52:57 +03:00
import { createBrowserRouter } from 'react-router';
2024-06-07 20:17:03 +03:00
import { Loader } from '@/components/Loader';
import { prefetchAuth } from '@/features/auth/backend/useAuth';
import LoginPage from '@/features/auth/pages/LoginPage';
import HomePage from '@/features/home/HomePage';
import NotFoundPage from '@/features/home/NotFoundPage';
import { prefetchLibrary } from '@/features/library/backend/useLibrary';
import CreateItemPage from '@/features/library/pages/CreateItemPage';
import { prefetchOSS } from '@/features/oss/backend/useOSS';
import { prefetchRSForm } from '@/features/rsform/backend/useRSForm';
import { prefetchProfile } from '@/features/users/backend/useProfile';
import { prefetchUsers } from '@/features/users/backend/useUsers';
2024-06-07 20:17:03 +03:00
import ApplicationLayout from './ApplicationLayout';
import { ErrorFallback } from './ErrorFallback';
2024-06-07 20:17:03 +03:00
import { routes } from './urls';
export const Router = createBrowserRouter([
{
path: '/',
element: <ApplicationLayout />,
2025-01-30 12:55:51 +03:00
errorElement: <ErrorFallback />,
2025-01-29 23:18:08 +03:00
loader: prefetchAuth,
hydrateFallbackElement: <Loader />,
2024-06-07 20:17:03 +03:00
children: [
{
path: '',
element: <HomePage />
},
{
path: `${routes.not_found}`,
element: <NotFoundPage />
},
2024-06-07 20:17:03 +03:00
{
path: routes.login,
element: <LoginPage />
},
{
path: routes.signup,
lazy: () => import('@/features/users/pages/RegisterPage')
2024-06-07 20:17:03 +03:00
},
{
path: routes.profile,
2025-01-29 23:18:08 +03:00
loader: prefetchProfile,
lazy: () => import('@/features/users/pages/UserProfilePage')
2024-06-07 20:17:03 +03:00
},
{
path: routes.restore_password,
lazy: () => import('@/features/auth/pages/RestorePasswordPage')
2024-06-07 20:17:03 +03:00
},
{
path: routes.password_change,
lazy: () => import('@/features/auth/pages/PasswordChangePage')
2024-06-07 20:17:03 +03:00
},
{
path: routes.library,
2025-01-29 23:18:08 +03:00
loader: () => Promise.allSettled([prefetchLibrary(), prefetchUsers()]),
lazy: () => import('@/features/library/pages/LibraryPage')
2024-06-07 20:17:03 +03:00
},
{
path: routes.create_schema,
element: <CreateItemPage />
},
{
path: `${routes.rsforms}/:id`,
2025-01-29 23:18:08 +03:00
loader: data => prefetchRSForm(parseRSFormURL(data.params.id, data.request.url)),
lazy: () => import('@/features/rsform/pages/RSFormPage')
2024-06-07 20:17:03 +03:00
},
{
path: `${routes.oss}/:id`,
2025-01-29 23:18:08 +03:00
loader: data => prefetchOSS(parseOssURL(data.params.id)),
lazy: () => import('@/features/oss/pages/OssPage')
2024-06-07 20:17:03 +03:00
},
2024-07-28 13:07:00 +03:00
{
path: routes.manuals,
lazy: () => import('@/features/help/pages/ManualsPage')
2024-07-28 13:07:00 +03:00
},
2024-06-07 20:17:03 +03:00
{
path: `${routes.icons}`,
lazy: () => import('@/features/home/IconsPage')
2024-06-07 20:17:03 +03:00
},
{
2024-07-28 13:07:00 +03:00
path: `${routes.database_schema}`,
lazy: () => import('@/features/home/DatabaseSchemaPage')
2024-06-07 20:17:03 +03:00
}
]
}
]);
2025-01-29 23:18:08 +03:00
// ======= Internals =========
function parseRSFormURL(id: string | undefined, url: string) {
const params = new URLSearchParams(url.split('?')[1]);
const version = params.get('v');
return { itemID: id ? Number(id) : undefined, version: version ? Number(version) : undefined };
}
function parseOssURL(id: string | undefined) {
return { itemID: id ? Number(id) : undefined };
}