From 08f5b6c786d08c4cf82914d928377a5be1712089 Mon Sep 17 00:00:00 2001 From: DD Liu <liudi@media.mit.edu> Date: Wed, 10 May 2017 17:01:20 -0400 Subject: [PATCH] add add monitors event --- src/lib/vm-listener-hoc.jsx | 6 ++++++ src/reducers/monitors.js | 31 ++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/lib/vm-listener-hoc.jsx b/src/lib/vm-listener-hoc.jsx index d65441f1f..a4bc41e0b 100644 --- a/src/lib/vm-listener-hoc.jsx +++ b/src/lib/vm-listener-hoc.jsx @@ -33,6 +33,7 @@ const vmListenerHOC = function (WrappedComponent) { this.props.vm.on('SPRITE_INFO_REPORT', this.props.onSpriteInfoReport); this.props.vm.on('MONITORS_UPDATE', this.props.onMonitorsUpdate); this.props.vm.on('MONITORS_REMOVED', this.props.onMonitorsRemoved); + this.props.vm.on('MONITORS_ADDED', this.props.onMonitorsAdded); } componentDidMount () { if (this.props.attachKeyboardEvents) { @@ -80,6 +81,7 @@ const vmListenerHOC = function (WrappedComponent) { onKeyDown, onKeyUp, onSpriteInfoReport, + onMonitorsAdded, onMonitorsUpdate, onMonitorsRemoved, onTargetsUpdate, @@ -93,6 +95,7 @@ const vmListenerHOC = function (WrappedComponent) { attachKeyboardEvents: PropTypes.bool, onKeyDown: PropTypes.func, onKeyUp: PropTypes.func, + onMonitorsAdded: PropTypes.func, onMonitorsRemoved: PropTypes.func, onMonitorsUpdate: PropTypes.func, onSpriteInfoReport: PropTypes.func, @@ -114,6 +117,9 @@ const vmListenerHOC = function (WrappedComponent) { onSpriteInfoReport: spriteInfo => { dispatch(targets.updateTarget(spriteInfo)); }, + onMonitorsAdded: monitorList => { + dispatch(monitors.addMonitors(monitorList)); + }, onMonitorsUpdate: monitorList => { dispatch(monitors.updateMonitors(monitorList)); }, diff --git a/src/reducers/monitors.js b/src/reducers/monitors.js index 190735cfc..226f3d806 100644 --- a/src/reducers/monitors.js +++ b/src/reducers/monitors.js @@ -1,5 +1,6 @@ const UPDATE_MONITORS = 'scratch-gui/monitors/UPDATE_MONITORS'; const REMOVE_MONITORS = 'scratch-gui/monitors/REMOVE_MONITORS'; +const ADD_MONITORS = 'scratch-gui/monitors/ADD_MONITORS'; const initialState = []; @@ -7,21 +8,27 @@ const reducer = function (state, action) { if (typeof state === 'undefined') state = initialState; let newState; switch (action.type) { + case ADD_MONITORS: + for (let i = 0; i < action.monitors.length; i++) { + for (let j = 0; j < state.length; j++) { + if (action.monitors[i].id === state[j].id) { + // If the ID is already in the list, return instead of adding + // a duplicate to remain idempotent + return state; + } + } + } + return [...state, ...action.monitors]; // Adds or updates monitors case UPDATE_MONITORS: newState = [...state]; - for (let i = 0, updated = false; i < action.monitors.length; i++) { + for (let i = 0; i < action.monitors.length; i++) { for (let j = 0; j < state.length; j++) { if (action.monitors[i].id === state[j].id) { - newState[j] = action.monitors[i]; - updated = true; + newState[j] = Object.assign({}, newState[j], action.monitors[i]); continue; } } - if (!updated) { - newState.push(action.monitors[i]); - } - updated = false; } return newState; // Removes monitors @@ -52,6 +59,16 @@ reducer.updateMonitors = function (monitors) { }; }; +reducer.addMonitors = function (monitors) { + return { + type: ADD_MONITORS, + monitors: monitors, + meta: { + throttle: 30 + } + }; +}; + reducer.removeMonitors = function (monitors) { return { type: REMOVE_MONITORS, -- GitLab