// Слой сессии и прав. Опционален: панель без учёток и ролей (плоский список // вкладок, доступных всем) обходится BasePageProps и в этот модуль не заходит. // "*" в permissions — владелец, доступ ко всему в обход остальных проверок. export const OWNER_PERMISSION = '*'; export function hasPermission(permissions: string[], perm: string): boolean { return permissions.includes(OWNER_PERMISSION) || permissions.includes(perm); } // Что оболочка узнаёт о вошедшем. Отдаётся эндпоинтом сессии, адрес и форма // ответа которого задаются в конфиге панели (loadSession). export interface Session { user: string | null; userId: string | null; role: string; permissions: string[]; } export const EMPTY_SESSION: Session = { user: null, userId: null, role: '', permissions: [] }; // Пропсы вкладки в панели без прав: вкладке нужен только токен и снэкбар. export interface BasePageProps { token: string; showMsg: (text: string) => void; } // Пропсы вкладки в панели с сессией и правами. export interface SessionPageProps extends BasePageProps { username: string; userId: string; role: string; permissions: string[]; // Все permission-строки, встречающиеся у вкладок — нужно только тем вкладкам, // которые сами выдают права; остальные это поле игнорируют. availablePermissions: string[]; // Переключить активную вкладку по её id из metadata.json. Роутера в панели // нет — активная вкладка это состояние оболочки. onNavigate: (tabId: string) => void; }