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 }, }); }, // Новые методы для управления фотографиями setMainPhoto(photoId) { return apiClient.put(`/users/profile/photo/${photoId}/set-main`); }, deletePhoto(photoId) { return apiClient.delete(`/users/profile/photo/${photoId}`); }, 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}`); }, editMessage(conversationId, messageId, newText) { return apiClient.put(`/conversations/${conversationId}/messages/${messageId}`, { text: newText }); }, // Новый метод для получения профиля пользователя по ID getUserById(userId) { return apiClient.get(`/users/${userId}`); }, // Новый метод для получения статистики пользователя getUserStats() { return apiClient.get('/users/stats'); } };