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
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
},
|
2025-05-21 23:43:24 +07:00
|
|
|
|
// Новые методы для управления фотографиями
|
|
|
|
|
setMainPhoto(photoId) {
|
|
|
|
|
return apiClient.put(`/users/profile/photo/${photoId}/set-main`);
|
|
|
|
|
},
|
|
|
|
|
deletePhoto(photoId) {
|
|
|
|
|
return apiClient.delete(`/users/profile/photo/${photoId}`);
|
|
|
|
|
},
|
2025-05-21 22:13:09 +07:00
|
|
|
|
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}`);
|
2025-05-22 00:28:14 +07:00
|
|
|
|
},
|
|
|
|
|
editMessage(conversationId, messageId, newText) {
|
|
|
|
|
return apiClient.put(`/conversations/${conversationId}/messages/${messageId}`, { text: newText });
|
2025-05-21 22:13:09 +07:00
|
|
|
|
}
|
|
|
|
|
};
|