(() => {
/**
* 文件职责:顶部栏组件,负责标题展示、时钟显示、连接状态指示与主题切换入口。
*/
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;
})();