125 lines
5.1 KiB
JavaScript
125 lines
5.1 KiB
JavaScript
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');
|
||
},
|
||
|
||
// Новый метод для записи просмотра профиля
|
||
recordProfileView(userId, source = 'other') {
|
||
return apiClient.post(`/users/${userId}/view`, { source });
|
||
}
|
||
}; |