Files
api-copp/web-react
jze9 94299d4af6 feat(web): анонимный вход для школьников — только школа и класс
Школьники не должны придумывать пароль, чтобы пройти тест. Бэкенд уже
поддерживал это: POST /polls/{poll_id}/responses принимает user_id как
Optional, а Response.group_id/organization_id — самостоятельные nullable
снимки школы/класса, не завязанные на аккаунт. Не хватало только
фронтенда — все роуты были жёстко завёрнуты в ProtectedRoute с
обязательным JWT.

- AuthContext: параллельная "анонимная идентичность" (org+group в
  localStorage, без токена и без запроса к API)
- ProtectedRoute пускает по токену ИЛИ анонимной сессии; новый
  AccountRoute — строго по токену, для /my-tests, /profile,
  /response/:id (у анонимной сессии нет истории — её негде хранить)
- Новая страница /anonymous — выбор школы+класса тем же
  SearchableDropdown, что и в регистрации
- PollPage при отправке ответа берёт org/group из анонимной сессии,
  если пользователь не залогинен
- HomePage скрывает "Мои тесты" и профиль для анонимов, добавлена
  кнопка выхода из анонимного режима

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 11:56:08 +05:00
..

web-react — фронтенд на React (Vite + TypeScript)

Замена Flet-интерфейса (../web). Обычный SPA: грузится в браузер один раз и работает локально, обращаясь к API по HTTP. Нет WebSocket и серверного UI-стейта — это убирает зависания, которые были у Flet (он рендерил UI на сервере и держал WS на каждого юзера).

Flet-сервис web намеренно оставлен в docker-compose.yml как запасной. Этот новый фронтенд публикуется на порту 3000.

Архитектура

Браузер ──▶ [ nginx :80 (контейнер web-react) ]
                 ├── /         → статика React (SPA, fallback на index.html)
                 └── /api/*    → proxy_pass http://api:8000/  (включая SVG-диаграммы)

API-контейнер доступен только внутри Docker-сети, поэтому браузер ходит к нему через nginx-прокси на том же origin (/api/...). SVG-диаграмма тянется напрямую <img>/<a download>.

Разработка (локально)

# 1. Поднять API + БД (из корня репозитория)
docker compose up -d api postgres redis     # postgres/redis — из docker-compose_db.yml

# 2. Dev-сервер фронтенда
cd web-react
npm install
npm run dev            # http://localhost:5173, /api проксируется на http://localhost:8000

Адрес API для dev-прокси переопределяется переменной API_URL (см. vite.config.ts).

Сборка / прод

# из корня репозитория
docker compose up -d --build web-react       # http://localhost:3000

Либо вручную: npm run build → статика в dist/, раздаётся nginx (см. Dockerfile, nginx.conf).

Структура

Путь Назначение
src/api/client.ts все запросы к API (порт web/api_client.py)
src/auth/ AuthContext — токен в localStorage + /users/me
src/theme/ 5 тем + слайдер масштаба через CSS-переменные
src/components/ переиспользуемые компоненты (Button, TextField, SearchableDropdown, Layout, Modal, RadarBlock…)
src/pages/ экраны: Login, Register, Home, TestList, Poll, MyTests, Response, Profile
src/styles/global.css стили на CSS-переменных

Маршруты

/login, /register, / (домашняя), /tests, /poll/:pollId, /my-tests, /response/:responseId, /profile. Защищённые маршруты требуют токен (ProtectedRoute).