ma7engine: ядро, шаблон панели, скаффолдер и доктор
Первый коммит существующего состояния. Ядро кладётся под git ради того, чтобы половины разъезжались в продуктовые репозитории через git subtree, а не копированием: subtree делает настоящий merge, хранит историю и умеет отдавать правки обратно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
// Единственная точка выхода вкладок в сеть. Вкладка не создаёт свой axios и не
|
||||
// собирает заголовок авторизации руками — иначе обработка протухшего токена
|
||||
// разъезжается по вкладкам.
|
||||
import axios from 'axios';
|
||||
|
||||
// Что делать, когда сервер ответил 401. Ставит оболочка при старте: токен
|
||||
// протух или отозван — надо разлогинить, а не показывать ошибку в снэкбаре.
|
||||
// Само ядро про localStorage не знает — ключ хранения принадлежит приложению.
|
||||
let onUnauthorized: (() => void) | null = null;
|
||||
|
||||
export function setUnauthorizedHandler(fn: (() => void) | null) {
|
||||
onUnauthorized = fn;
|
||||
}
|
||||
|
||||
export async function apiFetch(method: string, path: string, token: string, body?: object): Promise<any> {
|
||||
try {
|
||||
const r = await axios({ method, url: path, headers: { Authorization: `Bearer ${token}` }, data: body });
|
||||
return r.data;
|
||||
} catch (e) {
|
||||
if (axios.isAxiosError(e) && e.response?.status === 401) {
|
||||
onUnauthorized?.();
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Бэкенды панелей отдают ошибку по-разному: одни как {error}, другие как
|
||||
// {message}. Вкладки читают через этот хелпер, а не разбирают форму ответа
|
||||
// в каждом catch.
|
||||
export function errText(e: unknown, fallback = 'Сервер недоступен'): string {
|
||||
const data = (e as { response?: { data?: { error?: string; message?: string } } })?.response?.data;
|
||||
return data?.error ?? data?.message ?? fallback;
|
||||
}
|
||||
Reference in New Issue
Block a user