Deselect message history message when topic selection changes
Fixes #93
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import * as q from '../../../backend/src/Model'
|
import * as q from '../../../backend/src/Model'
|
||||||
import { Dispatch } from 'redux'
|
import { ActionTypes } from '../reducers/Sidebar'
|
||||||
import { AppState } from '../reducers'
|
import { AppState } from '../reducers'
|
||||||
|
import { Dispatch } from 'redux'
|
||||||
import { makePublishEvent, rendererEvents } from '../../../events'
|
import { makePublishEvent, rendererEvents } from '../../../events'
|
||||||
|
|
||||||
export const clearRetainedTopic = () => (dispatch: Dispatch<any>, getState: () => AppState) => {
|
export const clearRetainedTopic = () => (dispatch: Dispatch<any>, getState: () => AppState) => {
|
||||||
@@ -12,6 +13,13 @@ export const clearRetainedTopic = () => (dispatch: Dispatch<any>, getState: () =
|
|||||||
dispatch(clearTopic(selectedTopic, false))
|
dispatch(clearTopic(selectedTopic, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const setCompareMessage = (message?: q.Message) => (dispatch: Dispatch<any>) => {
|
||||||
|
dispatch({
|
||||||
|
message,
|
||||||
|
type: ActionTypes.SIDEBAR_SET_COMPARE_MESSAGE,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const clearTopic = (topic: q.TreeNode<any>, recursive: boolean, subtopicClearLimit = 50) => (dispatch: Dispatch<any>, getState: () => AppState) => {
|
export const clearTopic = (topic: q.TreeNode<any>, recursive: boolean, subtopicClearLimit = 50) => (dispatch: Dispatch<any>, getState: () => AppState) => {
|
||||||
const { connectionId } = getState().connection
|
const { connectionId } = getState().connection
|
||||||
if (!connectionId) {
|
if (!connectionId) {
|
||||||
@@ -25,7 +33,6 @@ export const clearTopic = (topic: q.TreeNode<any>, recursive: boolean, subtopicC
|
|||||||
retain: true,
|
retain: true,
|
||||||
qos: 0 as 0,
|
qos: 0 as 0,
|
||||||
}
|
}
|
||||||
console.log('deleting', topic.path())
|
|
||||||
rendererEvents.emit(publishEvent, mqttMessage)
|
rendererEvents.emit(publishEvent, mqttMessage)
|
||||||
|
|
||||||
if (recursive) {
|
if (recursive) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import * as q from '../../../backend/src/Model'
|
import * as q from '../../../backend/src/Model'
|
||||||
import { ActionTypes } from '../reducers/Tree'
|
import { ActionTypes } from '../reducers/Tree'
|
||||||
|
import { ActionTypes as SidebarActionTypes } from '../reducers/Sidebar'
|
||||||
import { AnyAction, Dispatch } from 'redux'
|
import { AnyAction, Dispatch } from 'redux'
|
||||||
import { AppState } from '../reducers'
|
import { AppState } from '../reducers'
|
||||||
import { batchActions } from 'redux-batched-actions'
|
import { batchActions } from 'redux-batched-actions'
|
||||||
@@ -40,6 +41,11 @@ const debouncedSelectTopic = debounce((topic: q.TreeNode<TopicViewModel>, dispat
|
|||||||
type: ActionTypes.TREE_SELECT_TOPIC,
|
type: ActionTypes.TREE_SELECT_TOPIC,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dispatch({
|
||||||
|
type: SidebarActionTypes.SIDEBAR_SET_COMPARE_MESSAGE,
|
||||||
|
message: undefined,
|
||||||
|
})
|
||||||
|
|
||||||
if (setTopicDispatch) {
|
if (setTopicDispatch) {
|
||||||
dispatch(batchActions([selectTreeTopicDispatch, setTopicDispatch]))
|
dispatch(batchActions([selectTreeTopicDispatch, setTopicDispatch]))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -36,12 +36,11 @@ interface Props {
|
|||||||
settingsActions: typeof settingsActions
|
settingsActions: typeof settingsActions
|
||||||
classes: any
|
classes: any
|
||||||
lastUpdate: number
|
lastUpdate: number
|
||||||
}
|
|
||||||
|
|
||||||
interface State {
|
|
||||||
compareMessage?: q.Message
|
compareMessage?: q.Message
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface State {}
|
||||||
|
|
||||||
class ValuePanel extends React.Component<Props, State> {
|
class ValuePanel extends React.Component<Props, State> {
|
||||||
constructor(props: Props) {
|
constructor(props: Props) {
|
||||||
super(props)
|
super(props)
|
||||||
@@ -58,7 +57,7 @@ class ValuePanel extends React.Component<Props, State> {
|
|||||||
<ValueRenderer
|
<ValueRenderer
|
||||||
message={node.message}
|
message={node.message}
|
||||||
messageHistory={node.messageHistory}
|
messageHistory={node.messageHistory}
|
||||||
compareWith={this.state.compareMessage}
|
compareWith={this.props.compareMessage}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -138,10 +137,10 @@ class ValuePanel extends React.Component<Props, State> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private handleMessageHistorySelect = (message: q.Message) => {
|
private handleMessageHistorySelect = (message: q.Message) => {
|
||||||
if (message !== this.state.compareMessage) {
|
if (message !== this.props.compareMessage) {
|
||||||
this.setState({ compareMessage: message })
|
this.props.sidebarActions.setCompareMessage(message)
|
||||||
} else {
|
} else {
|
||||||
this.setState({ compareMessage: undefined })
|
this.props.sidebarActions.setCompareMessage(undefined)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +162,7 @@ class ValuePanel extends React.Component<Props, State> {
|
|||||||
{this.renderValue()}
|
{this.renderValue()}
|
||||||
</React.Suspense>
|
</React.Suspense>
|
||||||
</div>
|
</div>
|
||||||
<div><MessageHistory onSelect={this.handleMessageHistorySelect} selected={this.state.compareMessage} node={this.props.node} /></div>
|
<div><MessageHistory onSelect={this.handleMessageHistorySelect} selected={this.props.compareMessage} node={this.props.node} /></div>
|
||||||
</ExpansionPanelDetails>
|
</ExpansionPanelDetails>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
)
|
)
|
||||||
@@ -181,6 +180,7 @@ const mapStateToProps = (state: AppState) => {
|
|||||||
return {
|
return {
|
||||||
valueRendererDisplayMode: state.settings.get('valueRendererDisplayMode'),
|
valueRendererDisplayMode: state.settings.get('valueRendererDisplayMode'),
|
||||||
node: state.tree.get('selectedTopic'),
|
node: state.tree.get('selectedTopic'),
|
||||||
|
compareMessage: state.sidebar.get('compareMessage'),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
44
app/src/reducers/Sidebar.ts
Normal file
44
app/src/reducers/Sidebar.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import * as q from '../../../backend/src/Model'
|
||||||
|
import { Action } from 'redux'
|
||||||
|
import { createReducer } from './lib'
|
||||||
|
import { Record } from 'immutable'
|
||||||
|
|
||||||
|
interface SidebarModel {
|
||||||
|
compareMessage?: q.Message
|
||||||
|
}
|
||||||
|
|
||||||
|
const initialStateFactory = Record<SidebarModel>({
|
||||||
|
compareMessage: undefined,
|
||||||
|
})
|
||||||
|
|
||||||
|
export type Action = SetCompareMessage
|
||||||
|
export enum ActionTypes {
|
||||||
|
SIDEBAR_SET_COMPARE_MESSAGE = 'SIDEBAR_SET_COMPARE_MESSAGE',
|
||||||
|
SIDEBAR_RESET_STORE = 'SIDEBAR_RESET_STORE',
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SidebarState = Record<SidebarModel>
|
||||||
|
|
||||||
|
const actions: {[s: string]: (state: SidebarState, action: Action) => SidebarState} = {
|
||||||
|
SIDEBAR_SET_COMPARE_MESSAGE: setCompareMessage,
|
||||||
|
SIDEBAR_RESET_STORE: resetStore,
|
||||||
|
}
|
||||||
|
|
||||||
|
export const sidebarReducer = createReducer(initialStateFactory(), actions)
|
||||||
|
|
||||||
|
export interface SetCompareMessage {
|
||||||
|
type: ActionTypes.SIDEBAR_SET_COMPARE_MESSAGE
|
||||||
|
message?: q.Message
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCompareMessage(state: SidebarState, action: SetCompareMessage): SidebarState {
|
||||||
|
return state.set('compareMessage', action.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ResetStore {
|
||||||
|
type: ActionTypes.SIDEBAR_RESET_STORE
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetStore(): SidebarState {
|
||||||
|
return initialStateFactory()
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import { GlobalState, globalState } from './Global'
|
|||||||
import { publishReducer, PublishState } from './Publish'
|
import { publishReducer, PublishState } from './Publish'
|
||||||
import { Record } from 'immutable'
|
import { Record } from 'immutable'
|
||||||
import { settingsReducer, SettingsState } from './Settings'
|
import { settingsReducer, SettingsState } from './Settings'
|
||||||
|
import { sidebarReducer, SidebarState } from './Sidebar'
|
||||||
import { treeReducer, TreeState } from './Tree'
|
import { treeReducer, TreeState } from './Tree'
|
||||||
|
|
||||||
export interface AppState {
|
export interface AppState {
|
||||||
@@ -12,6 +13,7 @@ export interface AppState {
|
|||||||
tree: TreeState
|
tree: TreeState
|
||||||
settings: Record<SettingsState>,
|
settings: Record<SettingsState>,
|
||||||
publish: PublishState
|
publish: PublishState
|
||||||
|
sidebar: SidebarState,
|
||||||
connection: ConnectionState
|
connection: ConnectionState
|
||||||
connectionManager: ConnectionManagerState
|
connectionManager: ConnectionManagerState
|
||||||
}
|
}
|
||||||
@@ -19,6 +21,7 @@ export interface AppState {
|
|||||||
export default combineReducers({
|
export default combineReducers({
|
||||||
globalState,
|
globalState,
|
||||||
publish: publishReducer,
|
publish: publishReducer,
|
||||||
|
sidebar: sidebarReducer,
|
||||||
connection: connectionReducer,
|
connection: connectionReducer,
|
||||||
settings: settingsReducer,
|
settings: settingsReducer,
|
||||||
tree: treeReducer,
|
tree: treeReducer,
|
||||||
|
|||||||
Reference in New Issue
Block a user