Professional dc66c8041c фикс
2025-05-24 02:10:15 +07:00

125 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 });
}
};