2024-11-25 19:52:57 +03:00
|
|
|
import { createBrowserRouter } from 'react-router';
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2025-01-29 23:18:08 +03:00
|
|
|
import { prefetchAuth } from '@/backend/auth/useAuth';
|
|
|
|
import { prefetchLibrary } from '@/backend/library/useLibrary';
|
|
|
|
import { prefetchOSS } from '@/backend/oss/useOSS';
|
|
|
|
import { prefetchRSForm } from '@/backend/rsform/useRSForm';
|
|
|
|
import { prefetchProfile } from '@/backend/users/useProfile';
|
|
|
|
import { prefetchUsers } from '@/backend/users/useUsers';
|
|
|
|
import Loader from '@/components/ui/Loader';
|
2024-06-07 20:17:03 +03:00
|
|
|
import CreateItemPage from '@/pages/CreateItemPage';
|
|
|
|
import HomePage from '@/pages/HomePage';
|
|
|
|
import LoginPage from '@/pages/LoginPage';
|
|
|
|
import NotFoundPage from '@/pages/NotFoundPage';
|
|
|
|
|
|
|
|
import ApplicationLayout from './ApplicationLayout';
|
|
|
|
import { routes } from './urls';
|
|
|
|
|
|
|
|
export const Router = createBrowserRouter([
|
|
|
|
{
|
|
|
|
path: '/',
|
|
|
|
element: <ApplicationLayout />,
|
|
|
|
errorElement: <NotFoundPage />,
|
2025-01-29 23:18:08 +03:00
|
|
|
loader: prefetchAuth,
|
|
|
|
hydrateFallbackElement: <Loader />,
|
2024-06-07 20:17:03 +03:00
|
|
|
children: [
|
|
|
|
{
|
|
|
|
path: '',
|
|
|
|
element: <HomePage />
|
|
|
|
},
|
2024-09-26 11:38:55 +03:00
|
|
|
{
|
|
|
|
path: `${routes.not_found}`,
|
|
|
|
element: <NotFoundPage />
|
|
|
|
},
|
2024-06-07 20:17:03 +03:00
|
|
|
{
|
|
|
|
path: routes.login,
|
|
|
|
element: <LoginPage />
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: routes.signup,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/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('@/pages/UserProfilePage')
|
2024-06-07 20:17:03 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
path: routes.restore_password,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/pages/RestorePasswordPage')
|
2024-06-07 20:17:03 +03:00
|
|
|
},
|
|
|
|
{
|
|
|
|
path: routes.password_change,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/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('@/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('@/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('@/pages/OssPage')
|
2024-06-07 20:17:03 +03:00
|
|
|
},
|
2024-07-28 13:07:00 +03:00
|
|
|
{
|
|
|
|
path: routes.manuals,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/pages/ManualsPage')
|
2024-07-28 13:07:00 +03:00
|
|
|
},
|
2024-06-07 20:17:03 +03:00
|
|
|
{
|
|
|
|
path: `${routes.icons}`,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/pages/IconsPage')
|
2024-06-07 20:17:03 +03:00
|
|
|
},
|
|
|
|
{
|
2024-07-28 13:07:00 +03:00
|
|
|
path: `${routes.database_schema}`,
|
2025-01-29 23:18:08 +03:00
|
|
|
lazy: () => import('@/pages/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 };
|
|
|
|
}
|