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