85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
import axios from "axios";
|
||
import { dbManager } from "../utils/indexedDB";
|
||
|
||
const axiosClient = axios.create({
|
||
baseURL: "/api",
|
||
withCredentials: true,
|
||
headers: {
|
||
"Content-Type": "application/json",
|
||
},
|
||
});
|
||
|
||
// Добавляем interceptor для логирования запросов (для отладки)
|
||
axiosClient.interceptors.request.use(
|
||
(config) => {
|
||
console.log("API Request:", config.method?.toUpperCase(), config.url);
|
||
return config;
|
||
},
|
||
(error) => {
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
axiosClient.interceptors.response.use(
|
||
(response) => {
|
||
console.log("API Response:", response.status, response.config.url);
|
||
return response;
|
||
},
|
||
(error) => {
|
||
console.error("API Error:", {
|
||
url: error.config?.url,
|
||
status: error.response?.status,
|
||
message: error.message,
|
||
data: error.response?.data,
|
||
});
|
||
|
||
if (error.response?.status === 401) {
|
||
// Список URL, где 401 означает неправильный пароль, а не истечение сессии
|
||
const passwordProtectedUrls = [
|
||
"/login", // Страница входа
|
||
"/register", // Страница регистрации
|
||
"/notes/archived/all", // Удаление всех архивных заметок
|
||
"/user/delete-account", // Удаление аккаунта
|
||
"/user/2fa/verify", // Проверка 2FA кода
|
||
"/user/2fa/disable", // Отключение 2FA
|
||
];
|
||
|
||
// URL, где 401 не должен обрабатываться как ошибка сессии
|
||
const statusCheckUrls = [
|
||
"/auth/status", // Проверка статуса аутентификации
|
||
];
|
||
|
||
// Проверяем, является ли это запросом с проверкой пароля
|
||
const isPasswordProtected = passwordProtectedUrls.some((url) =>
|
||
error.config?.url?.includes(url)
|
||
);
|
||
|
||
// Проверяем, является ли это запросом проверки статуса
|
||
const isStatusCheck = statusCheckUrls.some((url) =>
|
||
error.config?.url?.includes(url)
|
||
);
|
||
|
||
// Разлогиниваем только если это НЕ запрос с проверкой пароля и НЕ проверка статуса
|
||
if (!isPasswordProtected && !isStatusCheck) {
|
||
// Очищаем IndexedDB при автоматическом разлогинивании
|
||
dbManager.clearAll().catch((err) => {
|
||
console.error("Ошибка очистки IndexedDB при 401:", err);
|
||
});
|
||
localStorage.removeItem("isAuthenticated");
|
||
window.location.href = "/";
|
||
}
|
||
}
|
||
|
||
// Если это ошибка сети (нет ответа от сервера)
|
||
if (!error.response) {
|
||
console.error(
|
||
"Network error - server might be down or proxy not working"
|
||
);
|
||
}
|
||
|
||
return Promise.reject(error);
|
||
}
|
||
);
|
||
|
||
export default axiosClient;
|