/
misha_dev
/
game_guild_frontend
Обзор
Документация
Войти
/
misha_dev
/
game_guild_frontend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/shared/api/api.ts
105 строк
3 KB
misha-dev
feat: table
31 мар 2025, 18:20
31 мар 2025, 18:20
bc72834
Код
Авторство
О чём код?
import { authLocalStorageService } from '@/shared/utils/auth/authLocalStorageService'; import { store } from '@/store'; import { logoutThunk } from '@/store/auth/thunks/logout-thunk'; import axios, { AxiosError, AxiosHeaders, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig, } from 'axios'; import { postRefreshJwt } from './auth/postRefreshJwt'; const API_URL = import.meta.env.VITE_APP_API_HOST; const api: AxiosInstance = axios.create({ baseURL: API_URL, }); api.interceptors.request.use((config: InternalAxiosRequestConfig) => { const accessToken = authLocalStorageService.getAccessToken(); if (accessToken) { config.headers = new AxiosHeaders({ Authorization: `Bearer ${accessToken}`, }); } return config; }); let isRefreshing = false; let refreshSubscribers: Array<(token: string) => void> = []; const onRefreshed = (token: string) => { refreshSubscribers.forEach((callback) => callback(token)); refreshSubscribers = []; }; api.interceptors.response.use( (response: AxiosResponse) => response, async (error: AxiosError) => { const originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean; }; const url = originalRequest.url || ''; const isAuthUrl = url.includes('register') || url.includes('login') || url.includes('refresh-jwt'); if ( error.response?.status === 401 && !originalRequest._retry && !isAuthUrl ) { if (isRefreshing) { return new Promise((resolve) => { refreshSubscribers.push((token: string) => { originalRequest.headers = new AxiosHeaders({ ...originalRequest.headers, Authorization: `Bearer ${token}`, }); resolve(api(originalRequest)); }); }); } originalRequest._retry = true; isRefreshing = true; try { const refreshToken = authLocalStorageService.getRefreshToken(); if (!refreshToken) { throw new Error('No refresh token available'); } const { data } = await postRefreshJwt(refreshToken); const { tokenInfo } = data; authLocalStorageService.updateTokens( tokenInfo.accessToken, tokenInfo.refreshToken ); onRefreshed(tokenInfo.accessToken); originalRequest.headers = new AxiosHeaders({ ...originalRequest.headers, Authorization: `Bearer ${tokenInfo.accessToken}`, }); return api(originalRequest); } catch (refreshError) { store.dispatch(logoutThunk()); refreshSubscribers = []; return Promise.reject(refreshError); } finally { isRefreshing = false; } } return Promise.reject(error); } ); export default api;