import React from 'react'; import Logo from './logo'; import AppStore from '../stores/app-store'; import Footer from './footer.js'; import Sidebar from './sidebar.js'; import Status from './status.js'; import Topologies from './topologies.js'; import TopologyOptions from './topology-options.js'; import { getApiDetails, getTopologies } from '../utils/web-api-utils'; import { lockNextMetric, hitEsc } from '../actions/app-actions'; import Details from './details'; import Nodes from './nodes'; import MetricSelector from './metric-selector'; import EmbeddedTerminal from './embedded-terminal'; import { getRouter } from '../utils/router-utils'; import { showingDebugToolbar, DebugToolbar } from './debug-toolbar.js'; const ESC_KEY_CODE = 27; const RIGHT_ANGLE_KEY_IDENTIFIER = 'U+003C'; const LEFT_ANGLE_KEY_IDENTIFIER = 'U+003E'; function getStateFromStores() { return { activeTopologyOptions: AppStore.getActiveTopologyOptions(), controlStatus: AppStore.getControlStatus(), controlPipe: AppStore.getControlPipe(), currentTopology: AppStore.getCurrentTopology(), currentTopologyId: AppStore.getCurrentTopologyId(), currentTopologyOptions: AppStore.getCurrentTopologyOptions(), errorUrl: AppStore.getErrorUrl(), forceRelayout: AppStore.isForceRelayout(), highlightedEdgeIds: AppStore.getHighlightedEdgeIds(), highlightedNodeIds: AppStore.getHighlightedNodeIds(), hostname: AppStore.getHostname(), lockedMetric: AppStore.getLockedMetric(), availableCanvasMetrics: AppStore.getAvailableCanvasMetrics(), nodeDetails: AppStore.getNodeDetails(), nodes: AppStore.getNodes(), selectedNodeId: AppStore.getSelectedNodeId(), selectedMetric: AppStore.getSelectedMetric(), topologies: AppStore.getTopologies(), topologiesLoaded: AppStore.isTopologiesLoaded(), updatePaused: AppStore.isUpdatePaused(), updatePausedAt: AppStore.getUpdatePausedAt(), version: AppStore.getVersion(), websocketClosed: AppStore.isWebsocketClosed() }; } export default class App extends React.Component { constructor(props, context) { super(props, context); this.onChange = this.onChange.bind(this); this.onKeyPress = this.onKeyPress.bind(this); this.state = getStateFromStores(); } componentDidMount() { AppStore.addListener(this.onChange); window.addEventListener('keyup', this.onKeyPress); getRouter().start({hashbang: true}); if (!AppStore.isRouteSet()) { // dont request topologies when already done via router getTopologies(AppStore.getActiveTopologyOptions()); } getApiDetails(); } onChange() { this.setState(getStateFromStores()); } onKeyPress(ev) { if (ev.keyCode === ESC_KEY_CODE) { hitEsc(); } else if (ev.keyIdentifier === RIGHT_ANGLE_KEY_IDENTIFIER) { lockNextMetric(-1); } else if (ev.keyIdentifier === LEFT_ANGLE_KEY_IDENTIFIER) { lockNextMetric(1); } } render() { const {nodeDetails, controlPipe } = this.state; const showingDetails = nodeDetails.size > 0; const showingTerminal = controlPipe; // width of details panel blocking a view const detailsWidth = showingDetails ? 450 : 0; const topMargin = 100; return (