diff --git a/src/contexts/NotificationContext.js b/src/contexts/NotificationContext.js index 518ec9c5..3a22f5e0 100644 --- a/src/contexts/NotificationContext.js +++ b/src/contexts/NotificationContext.js @@ -603,7 +603,53 @@ export const NotificationProvider = ({ children }) => { setIsConnected(true); setReconnectAttempt(0); logger.info('NotificationContext', 'Socket connected', { wasDisconnected }); - console.log('%c[NotificationContext] ✅ Received connect event, updating state to connected', 'color: #4CAF50; font-weight: bold;'); + console.log('%c[NotificationContext] ✅ Socket connected', 'color: #4CAF50; font-weight: bold;'); + + // ========== ✅ 连接成功后注册业务事件监听器 ========== + console.log('%c[NotificationContext] Registering business event listeners...', 'color: #673AB7;'); + + // 移除旧监听器(避免重复注册) + socket.off('new_event'); + socket.off('system_notification'); + + // 监听新事件推送(统一事件名) + socket.on('new_event', (data) => { + logger.info('NotificationContext', 'Received new event', data); + + // ========== Socket层去重检查 ========== + const eventId = data.id || `${data.type}_${data.publishTime}`; + + if (processedEventIds.current.has(eventId)) { + logger.debug('NotificationContext', 'Duplicate event ignored at socket level', { eventId }); + return; // 重复事件,直接忽略 + } + + // 记录已处理的事件ID + processedEventIds.current.add(eventId); + + // 限制Set大小,避免内存泄漏 + if (processedEventIds.current.size > MAX_PROCESSED_IDS) { + const idsArray = Array.from(processedEventIds.current); + processedEventIds.current = new Set(idsArray.slice(-MAX_PROCESSED_IDS)); + logger.debug('NotificationContext', 'Cleaned up old processed event IDs', { + kept: MAX_PROCESSED_IDS + }); + } + // ========== Socket层去重检查结束 ========== + + // 使用适配器转换事件格式 + const notification = adaptEventToNotification(data); + addNotification(notification); + }); + + // 保留系统通知监听(兼容性) + socket.on('system_notification', (data) => { + logger.info('NotificationContext', 'Received system notification', data); + addNotification(data); + }); + + console.log('%c[NotificationContext] ✅ Business event listeners registered', 'color: #4CAF50; font-weight: bold;'); + // ========== 业务事件监听器注册完成 ========== // 如果之前断开过,显示 RECONNECTED 状态2秒后自动消失 if (wasDisconnected) { @@ -682,61 +728,7 @@ export const NotificationProvider = ({ children }) => { }); }); - // 监听新事件推送(统一事件名) - socket.on('new_event', (data) => { - console.log('\n%c════════════════════════════════════════', 'color: #FF9800; font-weight: bold;'); - console.log('%c[NotificationContext] 📨 收到 new_event 事件!', 'color: #FF9800; font-weight: bold;'); - console.log('%c════════════════════════════════════════', 'color: #FF9800; font-weight: bold;'); - console.log('[NotificationContext] 原始事件数据:', data); - console.log('[NotificationContext] 事件 ID:', data?.id); - console.log('[NotificationContext] 事件标题:', data?.title); - console.log('[NotificationContext] 事件类型:', data?.event_type || data?.type); - console.log('[NotificationContext] 事件重要性:', data?.importance); - - logger.info('NotificationContext', 'Received new event', data); - - // ========== Socket层去重检查 ========== - const eventId = data.id || `${data.type}_${data.publishTime}`; - - if (processedEventIds.current.has(eventId)) { - logger.debug('NotificationContext', 'Duplicate event ignored at socket level', { eventId }); - console.warn('[NotificationContext] ⚠️ 重复事件,已忽略:', eventId); - console.log('%c════════════════════════════════════════\n', 'color: #FF9800; font-weight: bold;'); - return; // 重复事件,直接忽略 - } - - // 记录已处理的事件ID - processedEventIds.current.add(eventId); - console.log('[NotificationContext] ✓ 事件已记录,防止重复处理'); - - // 限制Set大小,避免内存泄漏 - if (processedEventIds.current.size > MAX_PROCESSED_IDS) { - const idsArray = Array.from(processedEventIds.current); - processedEventIds.current = new Set(idsArray.slice(-MAX_PROCESSED_IDS)); - logger.debug('NotificationContext', 'Cleaned up old processed event IDs', { - kept: MAX_PROCESSED_IDS - }); - } - // ========== Socket层去重检查结束 ========== - - // 使用适配器转换事件格式 - console.log('[NotificationContext] 正在转换事件格式...'); - const notification = adaptEventToNotification(data); - console.log('[NotificationContext] 转换后的通知对象:', notification); - - console.log('[NotificationContext] 准备添加通知到队列...'); - addNotification(notification); - console.log('[NotificationContext] ✅ 通知已添加到队列'); - console.log('%c════════════════════════════════════════\n', 'color: #FF9800; font-weight: bold;'); - }); - - // 保留系统通知监听(兼容性) - socket.on('system_notification', (data) => { - logger.info('NotificationContext', 'Received system notification', data); - addNotification(data); - }); - - console.log('%c[NotificationContext] ✅ All event listeners registered', 'color: #4CAF50; font-weight: bold;'); + console.log('%c[NotificationContext] ✅ Connection event listeners registered', 'color: #4CAF50; font-weight: bold;'); // ✅ 第二步: 获取最大重连次数 const maxAttempts = socket.getMaxReconnectAttempts?.() || Infinity;