/
foult080
/
hackaton-app
Обзор
Документация
Войти
/
foult080
/
hackaton-app
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
web-app/src/api/client.ts
83 строки
2 KB
Foult080
fix(): some fixes for auth
10 июл 2026, 10:58
10 июл 2026, 10:58
ff9ca13
Код
Авторство
О чём код?
import axios from 'axios' import type { AxiosError, InternalAxiosRequestConfig } from 'axios' import { useAuthStore } from '../store/authStore' import type { ApiResponse } from '../types/api' const client = axios.create({ baseURL: '/api', headers: { 'Content-Type': 'application/json' }, }) let isRefreshing = false let failedQueue: Array<{ resolve: (token: string) => void reject: (err: unknown) => void }> = [] function processQueue(error: unknown, token: string | null) { failedQueue.forEach((p) => { if (error) { p.reject(error) } else { p.resolve(token!) } }) failedQueue = [] } client.interceptors.request.use((config: InternalAxiosRequestConfig) => { const token = useAuthStore.getState().token if (token) { config.headers.set('x-auth-token', token) } return config }) client.interceptors.response.use( (res) => res, async (err: AxiosError<ApiResponse<unknown>>) => { const originalRequest = err.config as InternalAxiosRequestConfig & { _retry?: boolean } if (err.response?.status === 401 && !originalRequest._retry) { const { refreshToken } = useAuthStore.getState() if (!refreshToken) { useAuthStore.getState().logout() return Promise.reject(err) } if (isRefreshing) { return new Promise((resolve, reject) => { failedQueue.push({ resolve, reject }) }).then((token) => { originalRequest.headers.set('x-auth-token', token) return client(originalRequest) }) } originalRequest._retry = true isRefreshing = true try { const res = await axios.post<ApiResponse<{ token: string; refreshToken: string }>>('/api/auth/refresh', { refreshToken, }) const { token: newToken, refreshToken: newRefreshToken } = res.data.data useAuthStore.getState().setTokens(newToken, newRefreshToken) processQueue(null, newToken) originalRequest.headers.set('x-auth-token', newToken) return client(originalRequest) } catch (refreshError) { processQueue(refreshError, null) useAuthStore.getState().logout() return Promise.reject(refreshError) } finally { isRefreshing = false } } return Promise.reject(err) }, ) export default client