Files
vidconf/frontend/src/App.tsx
Max Ronzhin 4f82ebe17a
Some checks failed
CI / backend (push) Has been cancelled
CI / frontend (push) Has been cancelled
feat(auth): согласие на обработку персональных данных при регистрации
Отключаемый модуль (instance_settings.consent_policy): галочка + ссылка на
публичную страницу регламента на форме регистрации, редактируемый в админке
текст с типовым шаблоном по умолчанию (плейсхолдеры под организацию, не
проходил юридическую проверку), версия текста растёт при каждой правке.
Факт согласия хранится в users (consent_version, consent_given_at) — второй
эшелон проверки на сервере, как и для отключаемых модулей ранее. Дефолт
(выключено) сохраняет поведение существующих инсталляций, у уже
зарегистрированных пользователей согласие не запрашивается.
2026-08-04 22:20:00 +03:00

85 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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