diff --git a/backend/controllers/adminController.js b/backend/controllers/adminController.js index 4a7c468..17f5c9c 100644 --- a/backend/controllers/adminController.js +++ b/backend/controllers/adminController.js @@ -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] Уведомление о блокировке не было отправлено напрямую, но было отправлено глобальное уведомление`); diff --git a/src/auth.js b/src/auth.js index c937aa7..5e81aeb 100644 --- a/src/auth.js +++ b/src/auth.js @@ -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(); diff --git a/src/services/socketService.js b/src/services/socketService.js index 6092f4d..a914546 100644 --- a/src/services/socketService.js +++ b/src/services/socketService.js @@ -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; }); // Обработчик разблокировки аккаунта