(() => { /** * 文件职责:顶部栏组件,负责标题展示、时钟显示、连接状态指示与主题切换入口。 */ const { Box, Typography, IconButton } = MaterialUI; const { useState, useEffect } = React; function RealTimeClock({ timeZone }) { const [timeStr, setTimeStr] = useState(''); useEffect(() => { const updateTime = () => { // 头部时钟始终使用统一的格式化工具,确保与状态页、任务页时间显示风格一致。 setTimeStr(formatDateTime(new Date(), timeZone || 'Asia/Shanghai', { includeYear: true, includeSeconds: true, })); }; updateTime(); // 每秒刷新一次时钟文本;组件卸载时清理定时器,避免后台泄漏。 const timer = setInterval(updateTime, 1000); return () => clearInterval(timer); }, [timeZone]); // 初始尚未生成时间字符串时先不渲染,避免短暂出现占位空壳。 if (!timeStr) return null; return (
当前时间 🕒 {timeStr}
); } function Header({ currentView }) { const { state, dispatch } = useAppContext(); const { config, status } = state; // 若配置中未单独指定展示时区,则默认按插件主要使用场景的东八区展示。 const displayTimezone = config?.displayTimezone || 'Asia/Shanghai'; const toggleTheme = () => { dispatch({ type: 'TOGGLE_THEME' }); }; // 视图 key 到标题文案的映射集中维护,避免 JSX 中散落条件判断。 const viewTitles = { status: '运行状态', tasks: '任务管理', notifications: '通知中心', docs: '文档浏览', config: '配置管理', }; // Header 不直接感知底层 socket 实例,只消费后端状态中的连接计数结果。 const wsCount = Number(status?.ws_connections ?? 0); const wsConnected = wsCount > 0; return ( <>
{viewTitles[currentView] || viewTitles.status} {/* 连接状态胶囊用于快速反馈实时通道是否可用。 */}
{wsConnected ? '已连接' : '未连接'}
{/* 图标语义与即将切换到的模式对应,帮助用户快速理解当前状态。 */} {state.theme === 'dark' ? '🌞' : '🌙'}
); } // 暴露到全局,供入口应用直接渲染 Header。 window.Header = Header; })();