Update sidebar when topic is deleted

This commit is contained in:
Thomas Nordquist
2019-07-17 10:05:05 +02:00
parent aa340b2158
commit 72020b02b8
5 changed files with 31 additions and 27 deletions

View File

@@ -12,23 +12,23 @@ import { Theme, withStyles } from '@material-ui/core/styles'
import { TopicViewModel } from '../../model/TopicViewModel' import { TopicViewModel } from '../../model/TopicViewModel'
import TopicPanel from './TopicPanel/TopicPanel' import TopicPanel from './TopicPanel/TopicPanel'
import Panel from './Panel' import Panel from './Panel'
import { usePollingToFetchTreeNode } from '../helper/usePollingToFetchTreeNode'
const throttle = require('lodash.throttle') const throttle = require('lodash.throttle')
const Publish = React.lazy(() => import('./Publish/Publish')) const Publish = React.lazy(() => import('./Publish/Publish'))
interface Props { interface Props {
node?: q.TreeNode<TopicViewModel> nodePath?: string
tree?: q.Tree<TopicViewModel>
actions: typeof sidebarActions actions: typeof sidebarActions
settingsActions: typeof settingsActions settingsActions: typeof settingsActions
classes: any classes: any
connectionId?: string connectionId?: string
} }
function Sidebar(props: Props) { function useUpdateNodeWhenNodeReceivesUpdates(node?: q.TreeNode<any>) {
const { classes, node } = props
const [lastUpdate, setLastUpdate] = useState(0) const [lastUpdate, setLastUpdate] = useState(0)
const updateNode = useCallback( const updateNode = useCallback(
throttle(() => { throttle(() => {
setLastUpdate(node ? node.lastUpdate : 0) setLastUpdate(node ? node.lastUpdate : 0)
@@ -46,11 +46,18 @@ function Sidebar(props: Props) {
node && node.onMessage.unsubscribe(updateCallback) node && node.onMessage.unsubscribe(updateCallback)
} }
}, [node]) }, [node])
}
function Sidebar(props: Props) {
const { classes, tree, nodePath } = props
const node = usePollingToFetchTreeNode(tree, nodePath || '')
useUpdateNodeWhenNodeReceivesUpdates(node)
// console.log(node && node.path(), tree, nodePath)
return ( return (
<div id="Sidebar" className={props.classes.drawer}> <div id="Sidebar" className={classes.drawer}>
<div> <div>
<TopicPanel node={node} updateNode={updateNode} /> <TopicPanel node={node} />
<ValuePanel lastUpdate={node ? node.lastUpdate : 0} /> <ValuePanel lastUpdate={node ? node.lastUpdate : 0} />
<Panel> <Panel>
<span>Publish</span> <span>Publish</span>
@@ -58,7 +65,7 @@ function Sidebar(props: Props) {
</Panel> </Panel>
<Panel detailsHidden={!node}> <Panel detailsHidden={!node}>
<span>Stats</span> <span>Stats</span>
<ExpansionPanelDetails className={props.classes.details}> <ExpansionPanelDetails className={classes.details}>
<NodeStats node={node} /> <NodeStats node={node} />
</ExpansionPanelDetails> </ExpansionPanelDetails>
</Panel> </Panel>
@@ -68,8 +75,10 @@ function Sidebar(props: Props) {
} }
const mapStateToProps = (state: AppState) => { const mapStateToProps = (state: AppState) => {
const node = state.tree.get('selectedTopic')
return { return {
node: state.tree.get('selectedTopic'), tree: state.connection.tree,
nodePath: node && node.path(),
} }
} }
@@ -84,14 +93,9 @@ const styles = (theme: Theme) => ({
drawer: { drawer: {
display: 'block' as 'block', display: 'block' as 'block',
}, },
valuePaper: { details: {
margin: theme.spacing(1), padding: '0px 16px 8px 8px',
}, display: 'block',
summary: { minHeight: '0' },
details: { padding: '0px 16px 8px 8px', display: 'block' },
heading: {
fontSize: theme.typography.pxToRem(15),
fontWeight: theme.typography.fontWeightRegular,
}, },
}) })

View File

@@ -13,7 +13,6 @@ interface Props {
node?: q.TreeNode<TopicViewModel> node?: q.TreeNode<TopicViewModel>
selected?: q.TreeNode<TopicViewModel> selected?: q.TreeNode<TopicViewModel>
actions: typeof treeActions actions: typeof treeActions
didSelectNode: (node: q.TreeNode<TopicViewModel>) => void
} }
const styles = (theme: Theme) => ({ const styles = (theme: Theme) => ({

View File

@@ -1,7 +1,7 @@
import * as q from '../../../../../backend/src/Model' import * as q from '../../../../../backend/src/Model'
import Copy from '../../helper/Copy' import Copy from '../../helper/Copy'
import Panel from '../Panel' import Panel from '../Panel'
import React, { useMemo } from 'react' import React, { useMemo, useCallback } from 'react'
import Topic from './Topic' import Topic from './Topic'
import { bindActionCreators } from 'redux' import { bindActionCreators } from 'redux'
import { connect } from 'react-redux' import { connect } from 'react-redux'
@@ -9,17 +9,18 @@ import { RecursiveTopicDeleteButton } from './RecursiveTopicDeleteButton'
import { sidebarActions } from '../../../actions' import { sidebarActions } from '../../../actions'
import { TopicDeleteButton } from './TopicDeleteButton' import { TopicDeleteButton } from './TopicDeleteButton'
const TopicPanel = (props: { node?: q.TreeNode<any>; actions: typeof sidebarActions; updateNode: () => void }) => { const TopicPanel = (props: { node?: q.TreeNode<any>; actions: typeof sidebarActions }) => {
const { node, updateNode } = props const { node } = props
console.log(node && node.path())
const copyTopic = node ? <Copy value={node.path()} /> : null const copyTopic = node ? <Copy value={node.path()} /> : null
const deleteTopic = (topic?: q.TreeNode<any>, recursive: boolean = false, maxCount = 50) => { const deleteTopic = useCallback((topic?: q.TreeNode<any>, recursive: boolean = false, maxCount = 50) => {
if (!topic) { if (!topic) {
return return
} }
props.actions.clearTopic(topic, recursive, maxCount) props.actions.clearTopic(topic, recursive, maxCount)
} }, [])
return useMemo( return useMemo(
() => ( () => (
@@ -29,7 +30,7 @@ const TopicPanel = (props: { node?: q.TreeNode<any>; actions: typeof sidebarActi
<TopicDeleteButton node={node} deleteTopicAction={deleteTopic} /> <TopicDeleteButton node={node} deleteTopicAction={deleteTopic} />
<RecursiveTopicDeleteButton node={node} deleteTopicAction={deleteTopic} /> <RecursiveTopicDeleteButton node={node} deleteTopicAction={deleteTopic} />
</span> </span>
<Topic node={node} didSelectNode={updateNode} /> <Topic node={node} />
</Panel> </Panel>
), ),
[node, node && node.childTopicCount()] [node, node && node.childTopicCount()]

View File

@@ -19,12 +19,12 @@ export function usePollingToFetchTreeNode(tree: q.Tree<any> | undefined, path: s
}, [treeNode]) }, [treeNode])
function pollUntilTreeNodeHasBeenFound() { function pollUntilTreeNodeHasBeenFound() {
if (!tree || treeNode) { if (!tree) {
return return
} }
const initialTreeNode = tree.findNode(path) const initialTreeNode = tree.findNode(path)
if (initialTreeNode) { if (initialTreeNode && initialTreeNode !== treeNode) {
setTreeNode(initialTreeNode) setTreeNode(initialTreeNode)
return return
} }
@@ -44,6 +44,6 @@ export function usePollingToFetchTreeNode(tree: q.Tree<any> | undefined, path: s
} }
} }
useEffect(pollUntilTreeNodeHasBeenFound, [tree, treeNode]) useEffect(pollUntilTreeNodeHasBeenFound, [tree, treeNode, path])
return treeNode return treeNode
} }

View File

@@ -52,7 +52,7 @@ export class TreeNode<ViewModel extends Destroyable> {
return this.sourceEdge ? this.sourceEdge.source || undefined : undefined return this.sourceEdge ? this.sourceEdge.source || undefined : undefined
} }
private hasMessage() { public hasMessage() {
return this.message && this.message.value && this.message.value.length !== 0 return this.message && this.message.value && this.message.value.length !== 0
} }