Отключаемый модуль (instance_settings.consent_policy): галочка + ссылка на публичную страницу регламента на форме регистрации, редактируемый в админке текст с типовым шаблоном по умолчанию (плейсхолдеры под организацию, не проходил юридическую проверку), версия текста растёт при каждой правке. Факт согласия хранится в users (consent_version, consent_given_at) — второй эшелон проверки на сервере, как и для отключаемых модулей ранее. Дефолт (выключено) сохраняет поведение существующих инсталляций, у уже зарегистрированных пользователей согласие не запрашивается.
85 lines
3.0 KiB
TypeScript
85 lines
3.0 KiB
TypeScript
import { Navigate, Route, Routes } from 'react-router-dom'
|
||
import { LoginPage } from '@/pages/LoginPage'
|
||
import { RegisterPage } from '@/pages/RegisterPage'
|
||
import { VerifyEmailPage } from '@/pages/VerifyEmailPage'
|
||
import { ConsentPolicyPage } from '@/pages/ConsentPolicyPage'
|
||
import { LobbyPage } from '@/pages/LobbyPage'
|
||
import { JoinPage } from '@/pages/JoinPage'
|
||
import { RoomPage } from '@/pages/RoomPage'
|
||
import { CalendarPage } from '@/pages/CalendarPage'
|
||
import { MyConferencesPage } from '@/pages/MyConferencesPage'
|
||
import { ProfilePage } from '@/pages/ProfilePage'
|
||
import { AdminPage } from '@/pages/AdminPage'
|
||
import { RequireAuth } from '@/auth/RequireAuth'
|
||
import { RequireAdmin } from '@/auth/RequireAdmin'
|
||
|
||
function App() {
|
||
return (
|
||
<Routes>
|
||
<Route path="/" element={<Navigate to="/lobby" replace />} />
|
||
<Route path="/login" element={<LoginPage />} />
|
||
<Route path="/register" element={<RegisterPage />} />
|
||
<Route path="/verify-email" element={<VerifyEmailPage />} />
|
||
{/* Публичная страница регламента обработки ПДн — читается до регистрации,
|
||
когда пользователя ещё нет; ссылка на неё — рядом с галочкой согласия
|
||
на RegisterPage. */}
|
||
<Route path="/legal/personal-data-consent" element={<ConsentPolicyPage />} />
|
||
<Route
|
||
path="/lobby"
|
||
element={
|
||
<RequireAuth>
|
||
<LobbyPage />
|
||
</RequireAuth>
|
||
}
|
||
/>
|
||
{/* Подключение по ссылке/номеру — публичное: доступно и гостю без аккаунта. */}
|
||
<Route path="/join" element={<JoinPage />} />
|
||
<Route path="/j/:slug" element={<JoinPage />} />
|
||
{/*
|
||
* Комната конференции — тоже публичная: гость подключается по токену,
|
||
* переданному через navigation state из JoinPage (без JWT-сессии
|
||
* приложения). Авторизация внутри самой страницы не требуется — см.
|
||
* комментарий в RoomPage.tsx.
|
||
*/}
|
||
<Route path="/room/:slug" element={<RoomPage />} />
|
||
<Route
|
||
path="/calendar"
|
||
element={
|
||
<RequireAuth>
|
||
<CalendarPage />
|
||
</RequireAuth>
|
||
}
|
||
/>
|
||
<Route
|
||
path="/my-conferences"
|
||
element={
|
||
<RequireAuth>
|
||
<MyConferencesPage />
|
||
</RequireAuth>
|
||
}
|
||
/>
|
||
<Route
|
||
path="/profile"
|
||
element={
|
||
<RequireAuth>
|
||
<ProfilePage />
|
||
</RequireAuth>
|
||
}
|
||
/>
|
||
<Route
|
||
path="/admin"
|
||
element={
|
||
<RequireAuth>
|
||
<RequireAdmin>
|
||
<AdminPage />
|
||
</RequireAdmin>
|
||
</RequireAuth>
|
||
}
|
||
/>
|
||
<Route path="*" element={<Navigate to="/lobby" replace />} />
|
||
</Routes>
|
||
)
|
||
}
|
||
|
||
export default App
|