diff --git a/app/src/components/ChartPanel/Chart.tsx b/app/src/components/ChartPanel/Chart.tsx index 908cc84..dc82c61 100644 --- a/app/src/components/ChartPanel/Chart.tsx +++ b/app/src/components/ChartPanel/Chart.tsx @@ -1,7 +1,6 @@ import * as q from '../../../../backend/src/Model' -import * as React from 'react' +import React, { useState } from 'react' import TopicPlot from '../TopicPlot' -import { AppState } from '../../reducers' import { bindActionCreators } from 'redux' import { chartActions } from '../../actions' import { ChartParameters } from '../../reducers/Charts' @@ -20,32 +19,48 @@ interface Props { } /** - * Subscribes to onMessage of treeNode + * Subscribes to onMessages keeping track of additional data points */ function useMessageSubscriptionToUpdate(treeNode?: q.TreeNode) { - const [lastUpdated, setLastUpdate] = React.useState(0) + const [lastUpdated, setLastUpdate] = useState(0) + const [messageHistory, setMessageHistory] = useState() + let amendMessageCallback: any + function subscribeToMessageUpdates() { - const onUpdateCallback = throttle(() => setLastUpdate(treeNode ? treeNode.lastUpdate : 0), 300) - treeNode && treeNode.onMessage.subscribe(onUpdateCallback) + const throttledUpdate = throttle(() => setLastUpdate(treeNode ? treeNode.lastUpdate : 0), 300) + + if (treeNode) { + const newMessageHistory = treeNode.messageHistory.clone() + newMessageHistory.setCapacity(500, 2 * 500 * 10000) + + amendMessageCallback = (message: q.Message) => { + newMessageHistory.add(message) + throttledUpdate() + } + treeNode.onMessage.subscribe(amendMessageCallback) + setMessageHistory(newMessageHistory) + } return function cleanup() { - treeNode && treeNode.onMessage.unsubscribe(onUpdateCallback) + treeNode && treeNode.onMessage.unsubscribe(amendMessageCallback) } } React.useEffect(subscribeToMessageUpdates, [treeNode]) + + return messageHistory } function Chart(props: Props) { const { parameters, treeNode } = props - const [freezedHistory, setHistory] = React.useState() - useMessageSubscriptionToUpdate(treeNode) + const [frozenHistory, setFrozenHistory] = React.useState() + const messageHistory = useMessageSubscriptionToUpdate(treeNode) const togglePause = React.useCallback(() => { if (!props.treeNode) { return } - setHistory(freezedHistory ? undefined : props.treeNode.messageHistory.clone()) - }, [props.treeNode, freezedHistory]) + setFrozenHistory(frozenHistory ? undefined : messageHistory && messageHistory.clone()) + }, [props.treeNode, frozenHistory]) const onRemove = React.useCallback(() => { props.actions.chart.removeChart(props.parameters) @@ -63,18 +78,18 @@ function Chart(props: Props) { - {props.treeNode ? ( + {messageHistory ? ( ) : ( diff --git a/app/src/components/ChartPanel/ChartSettings/TimeRangeSettings.tsx b/app/src/components/ChartPanel/ChartSettings/TimeRangeSettings.tsx index 6885326..db8b29e 100644 --- a/app/src/components/ChartPanel/ChartSettings/TimeRangeSettings.tsx +++ b/app/src/components/ChartPanel/ChartSettings/TimeRangeSettings.tsx @@ -4,7 +4,6 @@ import { Button, Menu, TextField, Typography } from '@material-ui/core' import { chartActions } from '../../../actions' import { ChartParameters } from '../../../reducers/Charts' import { connect } from 'react-redux' -import { KeyCodes } from '../../../utils/KeyCodes' const parseDuration = require('parse-duration') interface Props { @@ -22,13 +21,16 @@ function TimeRangeSettings(props: Props) { ) const ranges = ['all', '10s', '30s', '1m', '5m', '15m', '1h', '6h', '1d'] - const manuallySetIntervalHandler = useCallback( - (e: React.KeyboardEvent) => setValue(e.currentTarget.value), - [] - ) + const manuallySetIntervalHandler = useCallback((e: React.ChangeEvent) => { + setValue(e.target.value) + }, []) useEffect(() => { if (!value) { + props.actions.chart.updateChart({ + ...props.chart, + timeRange: undefined, + }) return } @@ -54,8 +56,8 @@ function TimeRangeSettings(props: Props) { open={props.open} onClose={props.onClose} > - Discard values older then -
+ Chart data within a time interval +
{ranges.map(r => { return (