51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import axios from 'axios';
|
||
|
||
// Создаем экземпляр axios с базовыми настройками
|
||
const api = axios.create({
|
||
baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://127.0.0.1:8000/api',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
});
|
||
|
||
// Перехватчик запросов для добавления токена авторизации
|
||
api.interceptors.request.use(
|
||
(config) => {
|
||
// Проверяем, что мы в браузере, а не на сервере
|
||
if (typeof window !== 'undefined') {
|
||
const token = localStorage.getItem('token');
|
||
if (token) {
|
||
config.headers.Authorization = `Bearer ${token}`;
|
||
}
|
||
}
|
||
return config;
|
||
},
|
||
(error) => Promise.reject(error)
|
||
);
|
||
|
||
// Перехватчик ответов для обработки ошибок
|
||
api.interceptors.response.use(
|
||
(response) => response,
|
||
async (error) => {
|
||
// Проверяем, что error.response существует
|
||
if (error.response) {
|
||
const originalRequest = error.config;
|
||
|
||
// Если ошибка 401 (неавторизован) и это не повторный запрос
|
||
if (error.response.status === 401 && !originalRequest._retry) {
|
||
originalRequest._retry = true;
|
||
|
||
// Здесь можно добавить логику обновления токена
|
||
// Например, перенаправление на страницу входа
|
||
if (typeof window !== 'undefined') {
|
||
localStorage.removeItem('token');
|
||
window.location.href = '/login';
|
||
}
|
||
}
|
||
}
|
||
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
export default api;
|