This commit is contained in:
Professional 2025-05-26 19:30:28 +07:00
parent be4a84dacf
commit 42ab411cce
3 changed files with 16 additions and 38 deletions

View File

@ -181,15 +181,8 @@ const toggleUserActive = async (req, res) => {
socket.emit("account_blocked", blockData);
notificationSent = true;
// Принудительно отключаем сокет
setTimeout(() => {
try {
console.log(`[AdminController] Принудительное отключение сокета: ${userSocket.socketId}`);
socket.disconnect(true);
} catch (socketError) {
console.error(`[AdminController] Ошибка при отключении сокета ${userSocket.socketId}:`, socketError);
}
}, 500);
// НЕ отключаем сокет принудительно - пусть пользователь остается подключенным
// для получения уведомлений о разблокировке
} else {
console.log(`[AdminController] Сокет не найден или не подключен для ID: ${userSocket.socketId}`);
}
@ -204,19 +197,8 @@ const toggleUserActive = async (req, res) => {
console.log(`[AdminController] Пользователь ${userId} не найден в активных соединениях`);
}
// Очищаем устаревшие записи в списке активных пользователей
try {
const updatedActiveUsers = activeUsers.filter(u => {
// Оставляем записи, которые не принадлежат заблокированному пользователю
return u.userId !== userId;
});
// Обновляем список активных пользователей
req.app.set('activeUsers', updatedActiveUsers);
console.log(`[AdminController] Список активных пользователей обновлен, удалены записи для ${userId}`);
} catch (error) {
console.error(`[AdminController] Ошибка при обновлении списка активных пользователей:`, error);
}
// НЕ очищаем записи в списке активных пользователей - оставляем их подключенными
// для возможности получения уведомлений о разблокировке
if (!notificationSent) {
console.log(`[AdminController] Уведомление о блокировке не было отправлено напрямую, но было отправлено глобальное уведомление`);

View File

@ -237,6 +237,16 @@ async function handleAccountBlocked(data) {
console.log('[Auth] Невозможно сохранить сессию - пользователь не авторизован');
}
// Показываем уведомление о блокировке
const notificationEvent = new CustomEvent('show-toast', {
detail: {
message: data?.message || 'Ваш аккаунт был заблокирован администратором.',
type: 'error',
duration: 10000
}
});
window.dispatchEvent(notificationEvent);
// Выходим из системы
await logout();

View File

@ -53,35 +53,21 @@ export const connectSocket = () => {
socket.on('account_blocked', (data) => {
console.log('[SocketService] Получено уведомление о блокировке аккаунта:', data);
// Устанавливаем флаг блокировки аккаунта для предотвращения повторных подключений
// Устанавливаем флаг блокировки аккаунта, но НЕ отключаем сокет
wasAccountBlocked = true;
// Принудительно прерываем соединение
try {
console.log('[SocketService] Принудительное отключение сокета из-за блокировки аккаунта');
socket.disconnect();
} catch (error) {
console.error('[SocketService] Ошибка при отключении сокета:', error);
}
// Вызываем обработчик блокировки для немедленного выхода
// Вызываем обработчик блокировки для выхода из системы
if (typeof handleAccountBlocked === 'function') {
// Оборачиваем в try-catch для надежности
try {
handleAccountBlocked(data);
} catch (error) {
console.error('[SocketService] Ошибка при вызове handleAccountBlocked:', error);
// Аварийный выход в случае ошибки в обработчике
window.location.href = '/login?blocked=true';
}
} else {
console.error('[SocketService] handleAccountBlocked не определен!');
// Принудительная перезагрузка страницы
window.location.reload();
}
// Дополнительно очищаем все соединения и состояние
socket = null;
});
// Обработчик разблокировки аккаунта