Files
magistr/frontend/react/shared/use-authorized-session.js
dipatrik10 97bf3cc50a feat: завершить миграцию фронтенда на React (этапы 1-5)
Админка, настройки, логин, кабинеты преподавателя и студента
полностью переведены на React 19 (модель strangler, docs/REACT_MIGRATION.md).

- 15 вкладок админки: lazy-загрузка, общий error boundary, сервисный слой
- Удалены legacy-views и переходный слой LegacyTabView (45 файлов)
- Сборка esbuild (frontend/scripts/build-react.mjs) с бюджетами gzip на чанки
- CSP-хэши, кэширование: chunk'и immutable, CSS/HTML no-cache (react-cache.conf)
- Фиксы: lazy-импорт именованных экспортов (краш после авторизации),
  растяжение #admin-root/#settings-root на всю ширину,
  возврат subjects/lessonTypes из справочников (краш просмотра расписаний),
  отказ от заведомо широкого поиска расписания без выбранной цели,
  центрирование карточки логина
- Тесты: 237/237 (npm run check), регрессионные на lazy-вкладки и ширину
- Документация: REACT_MIGRATION.md, REACT_MIGRATION_RESULT.md, FRONTEND.md
2026-09-28 23:15:04 +03:00

36 lines
1.1 KiB
JavaScript

import { useEffect, useMemo, useState } from 'react';
import { loadAuthorizedSession } from './auth-client.js';
import { loadingSessionState, SESSION_PHASES } from './session-policy.js';
export function useAuthorizedSession(allowedRoles = [], { redirectOnUnauthorized = true } = {}) {
const roleKey = useMemo(
() => [...allowedRoles].sort().join('|'),
[allowedRoles]
);
const normalizedRoles = useMemo(
() => roleKey ? roleKey.split('|') : [],
[roleKey]
);
const [state, setState] = useState(loadingSessionState);
useEffect(() => {
let active = true;
setState(loadingSessionState());
void loadAuthorizedSession(normalizedRoles).then(result => {
if (!active) return;
setState(result);
if (redirectOnUnauthorized && result.phase === SESSION_PHASES.unauthorized) {
window.location.replace('/');
}
});
return () => {
active = false;
};
}, [normalizedRoles, redirectOnUnauthorized]);
return state;
}