Токен хранится в sessionStorage (design D-9; без Redux): живёт до закрытия вкладки, все обращения к хранилищу в try/catch с запасным токеном в памяти.
apiFetch подставляет Bearer, на 401 сбрасывает токен и шлёт событие armka:unauthorized, ошибки разбирает по трём формам detail (строка / {code,message} / массив 422).
useMe не ходит в /me без токена и отбрасывает устаревшие ответы (флаг cancelled), AuthGate показывает вход, пока профиля нет.
Форма DevLogin вырезается из production-сборки по литералу process.env.NODE_ENV; через Config это не работает: process.env там заменён объектом REACT_APP_*.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
22 lines
508 B
TypeScript
22 lines
508 B
TypeScript
import { useCurrentUser } from '../auth/MeContext';
|
||
|
||
// Каркас: стартовый экран. Содержимое — по docs/context/10-user-journey.md.
|
||
export function Main() {
|
||
const me = useCurrentUser();
|
||
|
||
return (
|
||
<div
|
||
style={{
|
||
margin: 10,
|
||
padding: 16,
|
||
background: 'white',
|
||
borderRadius: 10,
|
||
height: 'calc(100% - 20px)',
|
||
}}>
|
||
<h3>АРМ КА</h3>
|
||
<p>{me.full_name}</p>
|
||
<p>Роли: {me.roles.length > 0 ? me.roles.join(', ') : 'нет'}</p>
|
||
</div>
|
||
);
|
||
}
|