From 7329942e0b105bf107f420defda6d96f5413c499 Mon Sep 17 00:00:00 2001
From: DD Liu <liudi@media.mit.edu>
Date: Wed, 10 May 2017 15:14:34 -0400
Subject: [PATCH] GUI accepts remove monitors actions

---
 src/lib/vm-listener-hoc.jsx |  6 ++++++
 src/reducers/monitors.js    | 30 +++++++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/lib/vm-listener-hoc.jsx b/src/lib/vm-listener-hoc.jsx
index 265b3cfb8..d65441f1f 100644
--- a/src/lib/vm-listener-hoc.jsx
+++ b/src/lib/vm-listener-hoc.jsx
@@ -32,6 +32,7 @@ const vmListenerHOC = function (WrappedComponent) {
             this.props.vm.on('targetsUpdate', this.props.onTargetsUpdate);
             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);
         }
         componentDidMount () {
             if (this.props.attachKeyboardEvents) {
@@ -80,6 +81,7 @@ const vmListenerHOC = function (WrappedComponent) {
                 onKeyUp,
                 onSpriteInfoReport,
                 onMonitorsUpdate,
+                onMonitorsRemoved,
                 onTargetsUpdate,
                 /* eslint-enable no-unused-vars */
                 ...props
@@ -91,6 +93,7 @@ const vmListenerHOC = function (WrappedComponent) {
         attachKeyboardEvents: PropTypes.bool,
         onKeyDown: PropTypes.func,
         onKeyUp: PropTypes.func,
+        onMonitorsRemoved: PropTypes.func,
         onMonitorsUpdate: PropTypes.func,
         onSpriteInfoReport: PropTypes.func,
         onTargetsUpdate: PropTypes.func,
@@ -113,6 +116,9 @@ const vmListenerHOC = function (WrappedComponent) {
         },
         onMonitorsUpdate: monitorList => {
             dispatch(monitors.updateMonitors(monitorList));
+        },
+        onMonitorsRemoved: monitorList => {
+            dispatch(monitors.removeMonitors(monitorList));
         }
     });
     return connect(
diff --git a/src/reducers/monitors.js b/src/reducers/monitors.js
index 0e9832fcd..cf1d8e177 100644
--- a/src/reducers/monitors.js
+++ b/src/reducers/monitors.js
@@ -1,15 +1,16 @@
 const UPDATE_MONITORS = 'scratch-gui/monitors/UPDATE_MONITORS';
+const REMOVE_MONITORS = 'scratch-gui/monitors/REMOVE_MONITORS';
 
 const initialState = [];
 
 const reducer = function (state, action) {
     if (typeof state === 'undefined') state = initialState;
+    let newState;
     switch (action.type) {
     // Adds or updates monitors
     case UPDATE_MONITORS:
-        let newState = [...state];
-        let updated = false;
-        for (let i = 0; i < action.monitors.length; i++) {
+        newState = [...state];
+        for (let i = 0, updated = false; 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];
@@ -23,6 +24,19 @@ const reducer = function (state, action) {
             updated = false;
         }
         return newState;
+    // Removes monitors
+    case REMOVE_MONITORS:
+        newState = [...state];
+        for (let i = 0; i < action.monitors.length; i++) {
+            // Move backwards to keep indices aligned
+            for (let j = state.length - 1; j >= 0; j--) {
+                if (action.monitors[i].id == state[j].id) {
+                    newState.splice(j, 1);
+                    continue;
+                }
+            }
+        }
+        return newState;
     default:
         return state;
     }
@@ -38,4 +52,14 @@ reducer.updateMonitors = function (monitors) {
     };
 };
 
+reducer.removeMonitors = function (monitors) {
+    return {
+        type: REMOVE_MONITORS,
+        monitors: monitors,
+        meta: {
+            throttle: 30
+        }
+    };
+};
+
 module.exports = reducer;
-- 
GitLab