100 lines
4.1 KiB
JavaScript
Raw Normal View History

2025-05-21 22:13:09 +07:00
import axios from 'axios';
import { useAuth } from '../auth'; // Импортируем функцию авторизации
// Создаем экземпляр Axios с базовым URL нашего API
// Настраиваем базовый URL в зависимости от окружения
// Определяем базовый URL в зависимости от среды выполнения
const getBaseUrl = () => {
// Всегда используем относительный путь /api.
// В режиме разработки Vite dev server будет проксировать эти запросы согласно настройке server.proxy в vite.config.js.
// В продакшене предполагается, что веб-сервер (например, Nginx) настроен аналогично для обработки /api.
// return '/api';
return import.meta.env.VITE_API_BASE_URL; // Используем переменную окружения Vite
};
const apiClient = axios.create({
baseURL: getBaseUrl(),
headers: {
'Content-Type': 'application/json',
},
});
// (Опционально, но очень полезно) Перехватчик для добавления JWT токена к запросам
apiClient.interceptors.request.use(
(config) => {
const token = localStorage.getItem('userToken'); // Предполагаем, что токен хранится в localStorage
if (token) {
console.log('[API] Добавление токена к запросу:', config.url);
config.headers['Authorization'] = `Bearer ${token}`;
} else {
console.log('[API] Токен не найден для запроса:', config.url);
}
return config;
},
(error) => {
console.error('[API] Ошибка в перехватчике запросов:', error);
return Promise.reject(error);
}
);
// (Опционально) Перехватчик ответов для обработки глобальных ошибок, например, 401
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response && error.response.status === 401) {
console.error('[API] Неавторизованный запрос (401):', error.config.url);
// Обходим замыкание, чтобы избежать проблем с импортом
// При использовании такого подхода, logout будет вызван после текущего цикла выполнения JS
setTimeout(() => {
const { logout } = useAuth();
logout();
}, 0);
}
return Promise.reject(error);
}
);
// Экспортируем функции для конкретных эндпоинтов
export default {
register(userData) {
return apiClient.post('/auth/register', userData);
},
login(credentials) {
return apiClient.post('/auth/login', credentials);
},
getMe() { // Для получения данных пользователя
return apiClient.get('/auth/me');
},
updateUserProfile(profileData) {
console.log('[API] Отправка запроса на обновление профиля:', profileData);
return apiClient.put('/users/profile', profileData);
},
getSuggestions() {
return apiClient.get('/users/suggestions');
},
likeUser(userId) {
return apiClient.post(`/actions/like/${userId}`);
},
passUser(userId) {
return apiClient.post(`/actions/pass/${userId}`);
},
uploadUserProfilePhoto(formData) {
return apiClient.post('/users/profile/photo', formData, {
headers: {
'Content-Type': 'multipart/form-data', // Важно для FormData
},
});
},
getUserConversations() {
return apiClient.get('/conversations'); // GET /api/conversations
},
getMessagesForConversation(conversationId) {
return apiClient.get(`/conversations/${conversationId}/messages`); // GET /api/conversations/:id/messages
},
deleteMessage(conversationId, messageId) {
return apiClient.delete(`/conversations/${conversationId}/messages/${messageId}`);
}
};