import { useEffect } from 'react'; import { useConnectionStore } from '../store/connectionStore'; import { useConfigStore } from '../store/configStore'; import { Clock, RefreshCw, Play, Pause, AlertCircle, CheckCircle2 } from 'lucide-react'; const STATUS_CONFIG: Record = { active: { icon: Play, color: 'text-green-500', label: '运行中' }, paused: { icon: Pause, color: 'text-yellow-500', label: '已暂停' }, completed: { icon: CheckCircle2, color: 'text-blue-500', label: '已完成' }, error: { icon: AlertCircle, color: 'text-red-500', label: '错误' }, }; export function TaskList() { const scheduledTasks = useConfigStore((s) => s.scheduledTasks); const connectionState = useConnectionStore((s) => s.connectionState); const loadScheduledTasks = useConfigStore((s) => s.loadScheduledTasks); const connected = connectionState === 'connected'; useEffect(() => { if (connected) { loadScheduledTasks(); } }, [connected]); if (!connected) { return (

定时任务

连接 Gateway 后可用

); } return (
{/* Header */}
Heartbeat 任务
{scheduledTasks.length > 0 ? ( scheduledTasks.map((task) => { const cfg = STATUS_CONFIG[task.status] || STATUS_CONFIG.active; const StatusIcon = cfg.icon; return (
{task.name}
{task.schedule}
{task.description && (
{task.description}
)}
{task.lastRun && 上次: {formatTaskTime(task.lastRun)}} {task.nextRun && 下次: {formatTaskTime(task.nextRun)}}
); }) ) : (

暂无定时任务

Heartbeat 引擎管理的定时任务

默认心跳周期: 1h

)}
); } function formatTaskTime(timeStr: string): string { try { const d = new Date(timeStr); const now = new Date(); const diffMs = now.getTime() - d.getTime(); const future = diffMs < 0; const absDiff = Math.abs(diffMs); const mins = Math.floor(absDiff / 60000); if (mins < 1) return future ? '即将' : '刚刚'; if (mins < 60) return future ? `${mins}分钟后` : `${mins}分钟前`; const hrs = Math.floor(mins / 60); if (hrs < 24) return future ? `${hrs}小时后` : `${hrs}小时前`; return `${d.getMonth() + 1}/${d.getDate()} ${d.getHours().toString().padStart(2, '0')}:${d.getMinutes().toString().padStart(2, '0')}`; } catch { return timeStr; } }