Маршрут /admin (вкладки «Пользователи» и «Матрица прав») и пункт «Система → Пользователи и роли» в меню; без USERS_ADMIN в /me — экран «Нет доступа», таблицы не монтируются и запросов к /admin/* нет, пункт меню скрыт. Почему без Redux: данные экрана нужны только ему, после каждой правки перечитываются с сервера — хватает локального state и маленького хука useAsyncData (отбрасывает устаревшие ответы и ответы после ухода со страницы). Клиент один — api/client.ts (Bearer из sessionStorage, ошибки сервера -> ApiError с кодом и текстом); ошибки показываются через App.useApp().message (корень обёрнут в antd App). Экран показывает только серверное состояние: при отказе (409 LAST_ADMIN и др.) — уведомление и перечитывание, матрица сохраняет роли по очереди. РАИСА появится в auth/: токен даст SSO вместо dev-входа; этот экран и клиент не меняются. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
34 lines
983 B
TypeScript
34 lines
983 B
TypeScript
import './App.css';
|
|
import { Layout } from 'antd';
|
|
import { Provider } from 'react-redux';
|
|
import { BrowserRouter, Route, Routes } from 'react-router-dom';
|
|
import { AuthGate } from './auth/AuthGate';
|
|
import { Config } from './conf/config';
|
|
import { Admin } from './layouts/Admin';
|
|
import { Main } from './layouts/Main';
|
|
import { store } from './store/store';
|
|
import { Sidebar } from './widgets/Sidebar/Sidebar';
|
|
|
|
// Каркас: экраны по docs/context/10-user-journey.md добавляются срезами.
|
|
function App() {
|
|
return (
|
|
<Provider store={store}>
|
|
<BrowserRouter basename={Config.APP_ADDRESS}>
|
|
<AuthGate>
|
|
<Layout hasSider={true} style={{ height: '100vh' }}>
|
|
<Sidebar />
|
|
<Layout.Content>
|
|
<Routes>
|
|
<Route path='/' element={<Main />} />
|
|
<Route path='/admin' element={<Admin />} />
|
|
</Routes>
|
|
</Layout.Content>
|
|
</Layout>
|
|
</AuthGate>
|
|
</BrowserRouter>
|
|
</Provider>
|
|
);
|
|
}
|
|
|
|
export default App;
|