From 70bd41ea67becb50d3e5691bfff73eb75f736e8b Mon Sep 17 00:00:00 2001
From: Florrie <towerofnix@gmail.com>
Date: Tue, 12 Feb 2019 13:02:21 -0400
Subject: [PATCH] Also save dimensions in workspaceMetrics

---
 src/containers/blocks.jsx         | 23 ++++++++++++--------
 src/reducers/workspace-metrics.js | 35 +++++++++++++++++++++++++------
 2 files changed, 43 insertions(+), 15 deletions(-)

diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx
index 94cf25a59..312ba4cc0 100644
--- a/src/containers/blocks.jsx
+++ b/src/containers/blocks.jsx
@@ -301,12 +301,17 @@ class Blocks extends React.Component {
     onWorkspaceMetricsChange () {
         const target = this.props.vm.editingTarget;
         if (target && target.id) {
-            this.props.updateMetrics({
-                targetID: target.id,
-                scrollX: this.workspace.scrollX,
-                scrollY: this.workspace.scrollY,
-                scale: this.workspace.scale
-            });
+            // Dispatch updateMetrics later, since onWorkspaceMetricsChange may be (very indirectly)
+            // called from a reducer, i.e. when you create a custom procedure.
+            // TODO: Is this a vehement hack?
+            setTimeout(() => {
+                this.props.updateMetrics({
+                    targetID: target.id,
+                    scrollX: this.workspace.scrollX,
+                    scrollY: this.workspace.scrollY,
+                    scale: this.workspace.scale
+                });
+            }, 0);
         }
     }
     onScriptGlowOn (data) {
@@ -353,7 +358,7 @@ class Blocks extends React.Component {
             this.props.updateToolboxState(toolboxXML);
         }
 
-        if (this.props.vm.editingTarget && !this.props.workspaceMetrics[this.props.vm.editingTarget.id]) {
+        if (this.props.vm.editingTarget && !this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {
             this.onWorkspaceMetricsChange();
         }
 
@@ -379,8 +384,8 @@ class Blocks extends React.Component {
         }
         this.workspace.addChangeListener(this.props.vm.blockListener);
 
-        if (this.props.vm.editingTarget && this.props.workspaceMetrics[this.props.vm.editingTarget.id]) {
-            const {scrollX, scrollY, scale} = this.props.workspaceMetrics[this.props.vm.editingTarget.id];
+        if (this.props.vm.editingTarget && this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id]) {
+            const {scrollX, scrollY, scale} = this.props.workspaceMetrics.targets[this.props.vm.editingTarget.id];
             this.workspace.scrollX = scrollX;
             this.workspace.scrollY = scrollY;
             this.workspace.scale = scale;
diff --git a/src/reducers/workspace-metrics.js b/src/reducers/workspace-metrics.js
index ca4dd1ec1..de44cbe26 100644
--- a/src/reducers/workspace-metrics.js
+++ b/src/reducers/workspace-metrics.js
@@ -1,24 +1,47 @@
+const UPDATE_DIMENSIONS = 'scratch-gui/workspace-metrics/UPDATE_DIMENSIONS';
 const UPDATE_METRICS = 'scratch-gui/workspace-metrics/UPDATE_METRICS';
 
-const initialState = {};
+const initialState = {
+    dimensions: {
+        width: 0,
+        height: 0
+    },
+    targets: {}
+};
 
 const reducer = function (state, action) {
     if (typeof state === 'undefined') state = initialState;
 
     switch (action.type) {
-    case UPDATE_METRICS:
+    case UPDATE_DIMENSIONS:
         return Object.assign({}, state, {
-            [action.targetID]: {
-                scrollX: action.scrollX,
-                scrollY: action.scrollY,
-                scale: action.scale
+            dimensions: {
+                width: action.width,
+                height: action.height
             }
         });
+    case UPDATE_METRICS:
+        return Object.assign({}, state, {
+            targets: Object.assign({}, state.targets, {
+                [action.targetID]: {
+                    scrollX: action.scrollX,
+                    scrollY: action.scrollY,
+                    scale: action.scale
+                }
+            })
+        });
     default:
         return state;
     }
 };
 
+const updateDimensions = function (dimensions) {
+    return {
+        type: UPDATE_DIMENSIONS,
+        ...dimensions
+    };
+};
+
 const updateMetrics = function (metrics) {
     return {
         type: UPDATE_METRICS,
-- 
GitLab