1import React from 'react';
2import MeshCentralEmbed, { VIEWMODE } from '../../components/MeshCentralEmbed';
3import { apiFetch } from '../../lib/api';
5export default function TabTerminal({ agentId, agentUuid }) {
6 const [nodeId, setNodeId] = React.useState(null);
7 const [loading, setLoading] = React.useState(true);
8 const [error, setError] = React.useState(null);
10 React.useEffect(() => {
11 async function loadNodeId() {
16 const response = await apiFetch(`/agent/${agentUuid || agentId}/meshcentral-url`);
19 const errorData = await response.json();
20 throw new Error(errorData.error || 'Failed to get MeshCentral connection');
23 const data = await response.json();
24 setNodeId(data.meshcentralNodeId);
27 console.error('[TabTerminal] Failed to load node ID:', err);
28 setError(err.message);
34 if (agentUuid || agentId) {
37 }, [agentUuid, agentId]);
41 <div className="tab-container">
42 <div style={{ textAlign: 'center', padding: '3rem' }}>
43 <div className="spinner" style={{ margin: '0 auto 1rem' }}></div>
44 <p>Loading terminal...</p>
52 <div className="tab-container">
53 <div className="card" style={{ textAlign: 'center', padding: '2rem' }}>
54 <div style={{ fontSize: '3rem', marginBottom: '1rem' }}>⚠️</div>
55 <h3>Connection Error</h3>
56 <p style={{ color: '#d32f2f' }}>{error}</p>
63 <div className="tab-container" style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
66 viewMode={VIEWMODE.TERMINAL}