) => {
if (node.data.kind === "card") onSelect(node.data.item);
}, [onSelect]);
const matched = graph.nodes.filter((item) => {
const node = canvas.nodes.find((candidate) => candidate.id === item.id);
return node?.data.kind === "card" && !node.data.dimmed && !node.hidden;
}).length;
return <>
BUILD #{graph.run.script_build_id}{graph.run.title}
FAKE DATA
{graph.run.status}
{graph.run.node_count} nodes
{selected ? onSelect(null)} /> : null}
>;
}
function MissionControlInner() {
const [runs, setRuns] = useState([]);
const [graph, setGraph] = useState(null);
const [selected, setSelected] = useState(null);
const [error, setError] = useState(null);
const [nonce, setNonce] = useState(0);
useEffect(() => {
const controller = new AbortController();
setError(null);
Promise.all([fetchRuns(controller.signal), fetchGraph(10001, controller.signal)])
.then(([nextRuns, nextGraph]) => { setRuns(nextRuns); setGraph(nextGraph); })
.catch((reason: unknown) => {
if (!controller.signal.aborted) setError(reason instanceof Error ? reason.message : "未知错误");
});
return () => controller.abort();
}, [nonce]);
if (error) return setNonce((value) => value + 1)} />;
if (!graph || !runs.length) return ;
return ;
}
export function MissionControl() {
return ;
}