// src/components/NotificationTestTool/index.js /** * 金融资讯通知测试工具 - 仅在开发环境显示 * 用于手动测试4种通知类型 */ import React, { useState, useEffect } from 'react'; import { Box, Button, VStack, HStack, Text, IconButton, Collapse, useDisclosure, Badge, Divider, Alert, AlertIcon, AlertTitle, AlertDescription, Code, UnorderedList, ListItem, } from '@chakra-ui/react'; import { MdNotifications, MdClose, MdVolumeOff, MdVolumeUp, MdCampaign, MdTrendingUp, MdArticle, MdAssessment, MdWarning } from 'react-icons/md'; import { useNotification } from '../../contexts/NotificationContext'; import { NOTIFICATION_TYPES, PRIORITY_LEVELS } from '../../constants/notificationTypes'; const NotificationTestTool = () => { // 只在开发环境显示 - 必须在所有 Hooks 调用之前检查 if (process.env.NODE_ENV !== 'development') { return null; } const { isOpen, onToggle } = useDisclosure(); const { addNotification, soundEnabled, toggleSound, isConnected, clearAllNotifications, notifications, browserPermission, requestBrowserPermission } = useNotification(); const [testCount, setTestCount] = useState(0); // 测试状态 const [isTestingNotification, setIsTestingNotification] = useState(false); const [testCountdown, setTestCountdown] = useState(0); const [notificationShown, setNotificationShown] = useState(null); // null | true | false // 系统环境检测 const [isFullscreen, setIsFullscreen] = useState(false); const [isMacOS, setIsMacOS] = useState(false); // 故障排查面板 const { isOpen: isTroubleshootOpen, onToggle: onTroubleshootToggle } = useDisclosure(); // 检测系统环境 useEffect(() => { // 检测是否为 macOS const platform = navigator.platform.toLowerCase(); setIsMacOS(platform.includes('mac')); // 检测全屏状态 const checkFullscreen = () => { setIsFullscreen(!!document.fullscreenElement); }; document.addEventListener('fullscreenchange', checkFullscreen); checkFullscreen(); return () => { document.removeEventListener('fullscreenchange', checkFullscreen); }; }, []); // 倒计时逻辑 useEffect(() => { if (testCountdown > 0) { const timer = setTimeout(() => { setTestCountdown(testCountdown - 1); }, 1000); return () => clearTimeout(timer); } else if (testCountdown === 0 && isTestingNotification) { // 倒计时结束,询问用户 setIsTestingNotification(false); // 延迟一下再询问,确保用户有时间看到通知 setTimeout(() => { const sawNotification = window.confirm('您是否看到了浏览器桌面通知?\n\n点击"确定"表示看到了\n点击"取消"表示没看到'); setNotificationShown(sawNotification); if (!sawNotification) { // 没看到通知,展开故障排查面板 if (!isTroubleshootOpen) { onTroubleshootToggle(); } } }, 500); } }, [testCountdown, isTestingNotification, isTroubleshootOpen, onTroubleshootToggle]); // 浏览器权限状态标签 const getPermissionLabel = () => { switch (browserPermission) { case 'granted': return '已授权'; case 'denied': return '已拒绝'; case 'default': return '未授权'; default: return '不支持'; } }; const getPermissionColor = () => { switch (browserPermission) { case 'granted': return 'green'; case 'denied': return 'red'; case 'default': return 'gray'; default: return 'gray'; } }; // 请求浏览器权限 const handleRequestPermission = async () => { await requestBrowserPermission(); }; // 公告通知测试数据 const testAnnouncement = () => { addNotification({ type: NOTIFICATION_TYPES.ANNOUNCEMENT, priority: PRIORITY_LEVELS.IMPORTANT, title: '【测试】贵州茅台发布2024年度财报公告', content: '2024年度营收同比增长15.2%,净利润创历史新高,董事会建议每10股派息180元', publishTime: Date.now(), pushTime: Date.now(), isAIGenerated: false, clickable: true, link: '/event-detail/test001', extra: { announcementType: '财报', companyCode: '600519', companyName: '贵州茅台', }, autoClose: 10000, }); setTestCount(prev => prev + 1); }; // 事件动向测试数据 const testEventAlert = () => { addNotification({ type: NOTIFICATION_TYPES.EVENT_ALERT, priority: PRIORITY_LEVELS.IMPORTANT, title: '【测试】央行宣布降准0.5个百分点', content: '中国人民银行宣布下调金融机构存款准备金率0.5个百分点,释放长期资金约1万亿元,利好股市', publishTime: Date.now(), pushTime: Date.now(), isAIGenerated: false, clickable: true, link: '/event-detail/test003', extra: { eventId: 'test003', relatedStocks: 12, impactLevel: '重大利好', }, autoClose: 12000, }); setTestCount(prev => prev + 1); }; // 分析报告测试数据(非AI) const testAnalysisReport = () => { addNotification({ type: NOTIFICATION_TYPES.ANALYSIS_REPORT, priority: PRIORITY_LEVELS.IMPORTANT, title: '【测试】医药行业深度报告:创新药迎来政策拐点', content: 'CXO板块持续受益于全球创新药研发外包需求,建议关注药明康德、凯莱英等龙头企业', publishTime: Date.now(), pushTime: Date.now(), author: { name: '李明', organization: '中信证券', }, isAIGenerated: false, clickable: true, link: '/forecast-report?id=test004', extra: { reportType: '行业研报', industry: '医药', }, autoClose: 12000, }); setTestCount(prev => prev + 1); }; // 预测通知测试数据(不可跳转) const testPrediction = () => { addNotification({ type: NOTIFICATION_TYPES.EVENT_ALERT, priority: PRIORITY_LEVELS.NORMAL, title: '【测试】【预测】央行可能宣布降准政策', content: '基于最新宏观数据分析,预计央行将在本周宣布降准0.5个百分点,释放长期资金', publishTime: Date.now(), pushTime: Date.now(), isAIGenerated: true, clickable: false, // ❌ 不可点击 link: null, extra: { isPrediction: true, statusHint: '详细报告生成中...', }, autoClose: 15000, }); setTestCount(prev => prev + 1); }; // 预测→详情流程测试(先推预测,5秒后推详情) const testPredictionFlow = () => { // 阶段 1: 推送预测 addNotification({ type: NOTIFICATION_TYPES.EVENT_ALERT, priority: PRIORITY_LEVELS.NORMAL, title: '【测试】【预测】新能源汽车补贴政策将延期', content: '根据政策趋势分析,预计财政部将宣布新能源汽车购置补贴政策延长至2025年底', publishTime: Date.now(), pushTime: Date.now(), isAIGenerated: true, clickable: false, link: null, extra: { isPrediction: true, statusHint: '详细报告生成中...', relatedPredictionId: 'pred_test_001', }, autoClose: 15000, }); setTestCount(prev => prev + 1); // 阶段 2: 5秒后推送详情 setTimeout(() => { addNotification({ type: NOTIFICATION_TYPES.EVENT_ALERT, priority: PRIORITY_LEVELS.IMPORTANT, title: '【测试】新能源汽车补贴政策延期至2025年底', content: '财政部宣布新能源汽车购置补贴政策延长至2025年底,涉及比亚迪、理想汽车等5家龙头企业', publishTime: Date.now(), pushTime: Date.now(), isAIGenerated: false, clickable: true, // ✅ 可点击 link: '/event-detail/test_pred_001', extra: { isPrediction: false, relatedPredictionId: 'pred_test_001', eventId: 'test_pred_001', relatedStocks: 5, impactLevel: '重大利好', }, autoClose: 12000, }); setTestCount(prev => prev + 1); }, 5000); }; return ( {/* 折叠按钮 */} 金融资讯测试工具 {isConnected ? 'Connected' : 'Disconnected'} REAL 浏览器: {getPermissionLabel()} : } size="xs" variant="ghost" colorScheme="whiteAlpha" aria-label={isOpen ? '关闭' : '打开'} /> {/* 工具面板 */} 通知类型测试 {/* 公告通知 */} {/* 事件动向 */} {/* 分析报告 */} {/* 预测通知 */} 组合测试 {/* 预测→详情流程测试 */} 浏览器通知 {/* 请求权限按钮 */} {browserPermission !== 'granted' && ( )} {/* 测试浏览器通知按钮 */} {browserPermission === 'granted' && ( )} {/* 浏览器通知状态说明 */} {browserPermission === 'granted' && ( ✅ 浏览器通知已启用 )} {browserPermission === 'denied' && ( ❌ 请在浏览器设置中允许通知 )} {/* 实时权限状态 */} 实际权限: {('Notification' in window) ? Notification.permission : '不支持'} {/* 环境警告 */} {isFullscreen && ( 全屏模式 某些浏览器在全屏模式下不显示通知 )} {isMacOS && notificationShown === false && ( 未检测到通知显示 可能是专注模式阻止了通知 )} {/* 故障排查面板 */} 如果看不到浏览器通知,请检查: {/* macOS 专注模式 */} {isMacOS && ( macOS 专注模式 点击右上角控制中心 关闭「专注模式」或「勿扰模式」 或者:系统设置 → 专注模式 → 关闭 )} {/* macOS 系统通知设置 */} {isMacOS && ( macOS 系统通知设置 系统设置 → 通知 找到 Google ChromeMicrosoft Edge 确保「允许通知」已开启 通知样式设置为「横幅」或「提醒」 )} {/* Chrome 浏览器设置 */} Chrome 浏览器设置 地址栏输入: chrome://settings/content/notifications 确保「网站可以请求发送通知」已开启 检查本站点是否在「允许」列表中 {/* 全屏模式提示 */} {isFullscreen && ( 退出全屏模式 ESC 键退出全屏,然后重新测试 )} {/* 测试结果反馈 */} {notificationShown === true && ( ✅ 通知功能正常! )} {/* 功能按钮 */} : } colorScheme={soundEnabled ? 'blue' : 'gray'} onClick={toggleSound} aria-label="切换音效" /> {/* 统计信息 */} 当前队列: = 5 ? 'red' : 'blue'}> {notifications.length} / 5 已测试: {testCount} 条通知 ); }; export default NotificationTestTool;