35 lines
1.8 KiB
TypeScript
35 lines
1.8 KiB
TypeScript
// Мост токена авторизации в сетевой слой. Модули src/api/* — обычные функции,
|
||
// и хук useAppAuth() в них вызвать нельзя, поэтому текущий токен держим в
|
||
// модульной переменной, которую обновляет React-слой (см. AuthTokenBridge в
|
||
// auth/appAuth). В режиме anonymous токен остаётся null → заголовок Authorization
|
||
// не добавляется и сетевое поведение не меняется.
|
||
|
||
let authToken: string | null = null
|
||
|
||
/**
|
||
* Сохранить текущий токен авторизации для последующих вызовов apiFetch.
|
||
* @param token Токен доступа либо null, чтобы не выставлять заголовок (anonymous).
|
||
*/
|
||
export function setApiAuthToken(token: string | null): void {
|
||
authToken = token
|
||
}
|
||
|
||
/**
|
||
* Обёртка над fetch: при наличии токена добавляет заголовок Authorization: Bearer.
|
||
* По сигнатуре совместима с fetch и служит drop-in заменой в модулях src/api/*.
|
||
* @param input URL или Request, как у штатного fetch.
|
||
* @param init Параметры запроса, как у штатного fetch.
|
||
*
|
||
* @returns Промис ответа сервера, идентичный результату fetch.
|
||
*/
|
||
export function apiFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
|
||
if (!authToken) {
|
||
return fetch(input, init)
|
||
}
|
||
const headers = new Headers(init?.headers)
|
||
if (!headers.has('Authorization')) {
|
||
headers.set('Authorization', `Bearer ${authToken}`)
|
||
}
|
||
return fetch(input, { ...init, headers })
|
||
}
|