Reflex/src/services/socketService.js
Professional 4ef4c5f428 фикс
2025-05-26 15:52:26 +07:00

125 lines
7.0 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 { io } from 'socket.io-client';
import { useAuth } from '@/auth'; // Чтобы получить ID текущего пользователя
let socket;
// const SOCKET_URL = 'http://localhost:5000'; // Закомментируем, так как Vite будет проксировать
// Для разработки через Vite proxy, URL должен быть относительным к домену фронтенда
const SOCKET_URL = '/'; // Vite будет перехватывать /socket.io/ путь
export const connectSocket = () => {
const { user, isAuthenticated, handleAccountBlocked, handleAccountUnblocked } = useAuth();
if (isAuthenticated.value && user.value && user.value._id) {
// Подключаемся только если пользователь аутентифицирован и есть ID
// Передаем userId в query для идентификации на сервере при подключении (альтернатива событию addUser)
// Однако, мы используем событие addUser, так что query здесь может быть избыточен, если сервер его не использует при connect.
// Оставим его, если вдруг понадобится.
// socket = io(SOCKET_URL, {
// query: { userId: user.value._id }
// });
// При использовании Vite proxy, путь для Socket.IO должен быть относительным,
// а Vite добавит префикс /socket.io/ к target в proxy.
// Однако, клиентская библиотека socket.io обычно сама добавляет /socket.io/
// поэтому мы можем просто указать базовый URL (который будет проксироваться)
// или указать полный путь, который будет проксирован.
// Для ясности и чтобы соответствовать настройке proxy, можно использовать path.
socket = io(SOCKET_URL, {
path: '/socket.io/', // Явно указываем путь, который будет проксироваться
transports: ['websocket', 'polling'] // Явно указываем транспорты для лучшей совместимости
});
console.log('[SocketService] Попытка подключения к Socket.IO серверу через Vite proxy...');
socket.on('connect', () => {
console.log('[SocketService] Успешно подключен к Socket.IO. Socket ID:', socket.id);
// Отправляем ID пользователя на сервер, чтобы он знал, кто подключился
socket.emit('addUser', user.value._id);
});
socket.on('disconnect', (reason) => {
console.log('[SocketService] Отключен от Socket.IO. Причина:', reason);
});
socket.on('connect_error', (error) => {
console.error('[SocketService] Ошибка подключения к Socket.IO:', error.message, error.data);
});
// Добавляем обработчик для события блокировки аккаунта
socket.on('account_blocked', (data) => {
console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
// Вызываем функцию обработки блокировки из auth.js тихо, без показа браузерного уведомления
// Отложенный вызов, чтобы избежать показа стандартного уведомления браузера
setTimeout(() => {
handleAccountBlocked(data);
}, 10);
});
// Добавляем обработчик для события разблокировки аккаунта
socket.on('account_unblocked', (data) => {
console.log('[SocketService] Получено уведомление о разблокировке аккаунта:', data);
// Аналогично блокировке, используем setTimeout для предотвращения браузерного уведомления
setTimeout(() => {
// Если есть функция handleAccountUnblocked, вызываем её
if (typeof handleAccountUnblocked === 'function') {
handleAccountUnblocked(data);
} else {
console.log('[SocketService] Аккаунт разблокирован, но обработчик не определен');
}
}, 10);
});
// Можно здесь же слушать глобальные события, если нужно
// socket.on('getUsers', (users) => {
// console.log('[SocketService] Получен список активных пользователей:', users);
// // Тут можно обновить какой-нибудь стор активных пользователей
// });
return socket;
} else {
console.warn('[SocketService] Не удалось подключиться: пользователь не аутентифицирован или нет ID.');
return null;
}
};
export const disconnectSocket = () => {
if (socket) {
console.log('[SocketService] Отключение от Socket.IO...');
socket.disconnect();
socket = null;
}
};
export const getSocket = () => {
if (!socket) {
console.warn('[SocketService] getSocket вызван, но сокет не инициализирован. Попытка подключения...');
// Можно попробовать подключиться здесь, если это желаемое поведение,
// но лучше управлять подключением более явно.
// return connectSocket(); // Будь осторожен с рекурсией или множественными подключениями
}
return socket;
};
// Функции для отправки и прослушивания специфичных событий можно добавить здесь
// или использовать getSocket() в компонентах и вызывать socket.emit / socket.on там.
// Пример:
// export const sendMessageOnSocket = (messageData) => {
// const currentSocket = getSocket();
// if (currentSocket) {
// currentSocket.emit('sendMessage', messageData);
// } else {
// console.error('[SocketService] Не могу отправить сообщение: сокет не подключен.');
// }
// };
// export const listenForMessage = (callback) => {
// const currentSocket = getSocket();
// if (currentSocket) {
// currentSocket.on('getMessage', callback);
// // Возвращаем функцию для отписки
// return () => currentSocket.off('getMessage', callback);
// }
// return () => {}; // Пустая функция отписки, если сокета нет
// };