EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
TabTasks.jsx
Go to the documentation of this file.
1import React from "react";
2import { apiFetch } from "../../lib/api";
3
4export default function TabTasks({ agentId }) {
5 const [processes, setProcesses] = React.useState([]);
6 const [loading, setLoading] = React.useState(true);
7 const [error, setError] = React.useState(null);
8 const [autoRefresh, setAutoRefresh] = React.useState(true);
9
10 function loadProcesses() {
11 if (!agentId) return;
12 setLoading(true);
13 apiFetch(`/agent/${agentId}/processes`)
14 .then((d) => setProcesses(d))
15 .catch((err) => setError(err.message))
16 .finally(() => setLoading(false));
17 }
18
19 React.useEffect(() => {
20 loadProcesses();
21 let interval = null;
22 if (autoRefresh && agentId) {
23 interval = setInterval(() => loadProcesses(), 5000);
24 }
25 return () => interval && clearInterval(interval);
26 }, [agentId, autoRefresh]);
27
28 function kill(pid) {
29 if (!agentId) return;
30 apiFetch(`/agent/${agentId}/process/${pid}/kill`, { method: "POST" })
31 .then(loadProcesses);
32 }
33
34 if (loading) return <div className="card">Loading processes...</div>;
35 if (error) return <div className="card error">{error}</div>;
36
37 // Defensive: ensure processes is an array
38 if (!Array.isArray(processes)) {
39 return (
40 <div className="tab-container">
41 <h2>Process Manager</h2>
42 <div className="card error">Process data is not available or invalid.</div>
43 </div>
44 );
45 }
46
47 // Show empty state if no processes
48 if (processes.length === 0) {
49 return (
50 <div className="tab-container">
51 <h2>Process Manager</h2>
52 <div className="card controls">
53 <label>
54 <input
55 type="checkbox"
56 checked={autoRefresh}
57 onChange={(e) => setAutoRefresh(e.target.checked)}
58 />
59 Auto-refresh every 5s
60 </label>
61 <button className="btn-sm" onClick={loadProcesses}>Refresh Now</button>
62 </div>
63 <div className="card">
64 <p>No process data available yet. Process list updates every 5 seconds when the agent is connected.</p>
65 </div>
66 </div>
67 );
68 }
69
70 return (
71 <div className="tab-container">
72 <h2>Process Manager</h2>
73 <div className="card controls">
74 <label>
75 <input
76 type="checkbox"
77 checked={autoRefresh}
78 onChange={(e) => setAutoRefresh(e.target.checked)}
79 />
80 Auto-refresh every 5s
81 </label>
82 <button className="btn-sm" onClick={loadProcesses}>Refresh Now</button>
83 </div>
84 <div className="card process-table">
85 <div className="table-header">
86 <span>Name</span>
87 <span>PID</span>
88 <span>CPU %</span>
89 <span>RAM MB</span>
90 <span></span>
91 </div>
92 {processes.map((p) => (
93 <div key={p.pid} className="table-row">
94 <span>{p.name}</span>
95 <span>{p.pid}</span>
96 <span>{p.cpu}</span>
97 <span>{p.mem}</span>
98 <span>
99 <button className="btn-danger-sm" onClick={() => kill(p.pid)}>
100 Kill
101 </button>
102 </span>
103 </div>
104 ))}
105 </div>
106 </div>
107 );
108}