73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
import axios, { AxiosError } from 'axios';
|
||
import type { InternalAxiosRequestConfig } from 'axios';
|
||
import { API_URL } from '../config/api';
|
||
|
||
// Создаём экземпляр axios с базовым URL
|
||
export const apiClient = axios.create({
|
||
baseURL: API_URL,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
timeout: 120000, // 120 seconds timeout
|
||
});
|
||
|
||
// Добавляем токен к каждому запросу
|
||
apiClient.interceptors.request.use(
|
||
(config: InternalAxiosRequestConfig) => {
|
||
const token = localStorage.getItem('access_token');
|
||
if (token && config.headers) {
|
||
config.headers.Authorization = `Bearer ${token}`;
|
||
}
|
||
return config;
|
||
},
|
||
(error) => {
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
// Обработка ответов и ошибок
|
||
apiClient.interceptors.response.use(
|
||
(response) => {
|
||
return response;
|
||
},
|
||
(error: AxiosError) => {
|
||
if (error.response) {
|
||
const status = error.response.status;
|
||
|
||
// Обрабатываем ошибки без автоматического перенаправления
|
||
// Компоненты сами решают, как обрабатывать ошибки
|
||
switch (status) {
|
||
case 401:
|
||
// Unauthorized - очищаем токен
|
||
localStorage.removeItem('access_token');
|
||
sessionStorage.clear();
|
||
// Вызываем событие для реакции на изменение авторизации
|
||
window.dispatchEvent(new Event('unauthorized'));
|
||
break;
|
||
case 403:
|
||
// Forbidden - нет прав доступа
|
||
console.warn('Access denied (403)');
|
||
break;
|
||
case 404:
|
||
// Not Found - ресурс не найден
|
||
console.warn('Resource not found (404)');
|
||
break;
|
||
case 500:
|
||
case 502:
|
||
case 503:
|
||
case 504:
|
||
// Server errors
|
||
console.error(`Server error (${status})`);
|
||
break;
|
||
}
|
||
} else if (error.request) {
|
||
// Ошибка сети - сервер недоступен
|
||
console.error('Network error:', error.message);
|
||
}
|
||
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
export default apiClient;
|