auto-sync: 2026-05-17 06:15:50

This commit is contained in:
cfdaily
2026-05-17 06:15:50 +08:00
parent c0096f9dcb
commit 1159c22a0e
+87
View File
@@ -0,0 +1,87 @@
// 全局监控页面
import React from 'react';
import { useDaemonStatus } from '../hooks/useApi';
import { useProjects } from '../hooks/useApi';
export function Monitor() {
const { status, refresh: refreshStatus } = useDaemonStatus();
const { projects, loading, refresh: refreshProjects } = useProjects();
return (
<div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 16 }}>
<h2 className="page-title"></h2>
<button className="btn" onClick={() => { refreshStatus(); refreshProjects(); }}>
</button>
</div>
{/* Daemon 状态 */}
<div className="stat-grid">
<div className="stat-card">
<div className="value">{status?.status === 'running' ? '🟢' : '🔴'}</div>
<div className="label">Daemon </div>
</div>
<div className="stat-card">
<div className="value">{status?.tick_count ?? '-'}</div>
<div className="label">Tick </div>
</div>
<div className="stat-card">
<div className="value">{status?.active_projects ?? '-'}</div>
<div className="label"></div>
</div>
<div className="stat-card">
<div className="value">{status?.uptime_seconds ? Math.floor(status.uptime_seconds / 60) + 'm' : '-'}</div>
<div className="label"></div>
</div>
</div>
{/* 项目列表 */}
<h3 style={{ fontSize: 15, fontWeight: 600, marginBottom: 12 }}></h3>
{loading ? (
<div className="loading">...</div>
) : (
<div className="card">
<div className="table-wrapper">
<table>
<thead>
<tr>
<th>ID</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
{projects.map(p => (
<tr key={p.id}>
<td>{p.id.substring(0, 8)}</td>
<td>{p.name}</td>
<td>
<span className={`badge badge-${p.status === 'active' ? 'done' : 'blocked'}`}>
{p.status}
</span>
</td>
<td>{p.created_at?.substring(0, 19) ?? '-'}</td>
</tr>
))}
{projects.length === 0 && (
<tr><td colSpan={4} style={{ color: 'var(--muted)' }}></td></tr>
)}
</tbody>
</table>
</div>
</div>
)}
{/* 最近事件 */}
<h3 style={{ fontSize: 15, fontWeight: 600, margin: '20px 0 12px' }}></h3>
<div className="card">
<div className="event-log">
<p style={{ color: 'var(--muted)' }}> SSE </p>
</div>
</div>
</div>
);
}