From b1c14cc3291fc67f022dcea06db4db1b0f6fae28 Mon Sep 17 00:00:00 2001
From: Ray Schamp <ray@scratch.mit.edu>
Date: Wed, 19 Oct 2016 10:23:25 -0400
Subject: [PATCH] Apply props-passing pattern to all components

---
 src/components/blocks.js          |  7 ++++++-
 src/components/green-flag.js      |  8 +++++++-
 src/components/gui.js             |  9 +++++++--
 src/components/sprite-selector.js | 13 ++++++++++---
 src/components/stage.js           | 13 ++++++++++---
 src/components/stop-all.js        |  8 +++++++-
 src/containers/blocks.js          | 12 ++++++++++--
 src/containers/green-flag.js      | 11 ++++++++++-
 src/containers/sprite-selector.js |  5 +++++
 src/containers/stage.js           |  9 ++++++++-
 src/containers/stop-all.js        |  6 +++++-
 11 files changed, 85 insertions(+), 16 deletions(-)

diff --git a/src/components/blocks.js b/src/components/blocks.js
index fdd6f1467..357ae71b1 100644
--- a/src/components/blocks.js
+++ b/src/components/blocks.js
@@ -2,9 +2,13 @@ const React = require('react');
 
 class BlocksComponent extends React.Component {
     render () {
+        const {
+            componentRef,
+            ...props
+        } = this.props;
         return (
             <div
-                ref={this.props.componentRef}
+                ref={componentRef}
                 className="scratch-blocks"
                 style={{
                     position: 'absolute',
@@ -13,6 +17,7 @@ class BlocksComponent extends React.Component {
                     bottom: 0,
                     left: 0
                 }}
+                {...props}
             />
         );
     }
diff --git a/src/components/green-flag.js b/src/components/green-flag.js
index 20be45505..ce7b490a5 100644
--- a/src/components/green-flag.js
+++ b/src/components/green-flag.js
@@ -2,6 +2,11 @@ const React = require('react');
 
 class GreenFlagComponent extends React.Component {
     render () {
+        const {
+            onClick,
+            title,
+            ...props
+        } = this.props;
         return (
             <div
                 className="scratch-green-flag"
@@ -11,8 +16,9 @@ class GreenFlagComponent extends React.Component {
                     right: 440,
                     width: 50
                 }}
+                {...props}
             >
-                <button onClick={this.props.onClick}>{this.props.title}</button>
+                <button onClick={onClick}>{title}</button>
             </div>
         );
     }
diff --git a/src/components/gui.js b/src/components/gui.js
index 861cda692..4e23bada0 100644
--- a/src/components/gui.js
+++ b/src/components/gui.js
@@ -2,6 +2,10 @@ const React = require('react');
 
 class GUIComponent extends React.Component {
     render () {
+        const {
+            children,
+            ...props
+        } = this.props;
         return (
             <div
                 className="scratch-gui"
@@ -12,15 +16,16 @@ class GUIComponent extends React.Component {
                     bottom: 0,
                     left: 0
                 }}
+                {...props}
             >
-                {this.props.children}
+                {children}
             </div>
         );
     }
 }
 
 GUIComponent.propTypes = {
-    children: React.PropTypes.arrayOf(React.PropTypes.node)
+    children: React.PropTypes.node
 };
 
 module.exports = GUIComponent;
diff --git a/src/components/sprite-selector.js b/src/components/sprite-selector.js
index 93ddcb389..a37213d9b 100644
--- a/src/components/sprite-selector.js
+++ b/src/components/sprite-selector.js
@@ -2,6 +2,12 @@ const React = require('react');
 
 class SpriteSelectorComponent extends React.Component {
     render () {
+        const {
+            onChange,
+            sprites,
+            value,
+            ...props
+        } = this.props;
         return (
             <div
                 style={{
@@ -9,13 +15,14 @@ class SpriteSelectorComponent extends React.Component {
                     top: 380,
                     right: 10,
                 }}
+                {...props}
             >
                 <select
                     multiple
-                    value={this.props.value}
-                    onChange={this.props.onChange}
+                    value={value}
+                    onChange={onChange}
                 >
-                    {this.props.sprites.map(sprite => (
+                    {sprites.map(sprite => (
                         <option value={sprite.id} key={sprite.id}>
                             {sprite.name}
                         </option>
diff --git a/src/components/stage.js b/src/components/stage.js
index 4cdbc7895..89cfa4d15 100644
--- a/src/components/stage.js
+++ b/src/components/stage.js
@@ -2,17 +2,24 @@ const React = require('react');
 
 class StageComponent extends React.Component {
     render () {
+        const {
+            canvasRef,
+            width,
+            height,
+            ...props
+        } = this.props;
         return (
             <canvas
                 className="scratch-stage"
-                ref={this.props.canvasRef}
+                ref={canvasRef}
                 style={{
                     position: 'absolute',
                     top: 10,
                     right: 10,
-                    width: this.props.width,
-                    height: this.props.height,
+                    width: width,
+                    height: height,
                 }}
+                {...props}
             />
         );
     }
diff --git a/src/components/stop-all.js b/src/components/stop-all.js
index 10ed6c397..6b8f616bc 100644
--- a/src/components/stop-all.js
+++ b/src/components/stop-all.js
@@ -2,6 +2,11 @@ const React = require('react');
 
 class StopAllComponent extends React.Component {
     render () {
+        const {
+            onClick,
+            title,
+            ...props
+        } = this.props;
         return (
             <div
                 className="scratch-stop-all"
@@ -11,8 +16,9 @@ class StopAllComponent extends React.Component {
                     right: 400,
                     width: 50
                 }}
+                {...props}
             >
-                <button onClick={this.props.onClick}>{this.props.title}</button>
+                <button onClick={onClick}>{title}</button>
             </div>
         );
     }
diff --git a/src/containers/blocks.js b/src/containers/blocks.js
index a43f18b9a..c9f07ce13 100644
--- a/src/containers/blocks.js
+++ b/src/containers/blocks.js
@@ -67,13 +67,21 @@ class Blocks extends React.Component {
     onWorkspaceUpdate (data) {
         ScratchBlocks.Events.disable();
         this.workspace.clear();
-        let dom = ScratchBlocks.Xml.textToDom(data.xml);
+        const dom = ScratchBlocks.Xml.textToDom(data.xml);
         ScratchBlocks.Xml.domToWorkspace(dom, this.workspace);
         ScratchBlocks.Events.enable();
     }
     render () {
+        const {
+            options, // eslint-disable-line no-unused-vars
+            vm, // eslint-disable-line no-unused-vars
+            ...props
+        } = this.props;
         return (
-            <BlocksComponent componentRef={c => this.blocks = c} />
+            <BlocksComponent
+                componentRef={c => this.blocks = c}
+                {...props}
+            />
         );
     }
 }
diff --git a/src/containers/green-flag.js b/src/containers/green-flag.js
index da97dff71..233313b79 100644
--- a/src/containers/green-flag.js
+++ b/src/containers/green-flag.js
@@ -13,7 +13,16 @@ class GreenFlag extends React.Component {
         this.props.vm.greenFlag();
     }
     render () {
-        return <GreenFlagComponent onClick={this.onClick} />;
+        const {
+            vm, // eslint-disable-line no-unused-vars
+            ...props
+        } = this.props;
+        return (
+            <GreenFlagComponent
+                onClick={this.onClick}
+                {...props}
+            />
+        );
     }
 }
 
diff --git a/src/containers/sprite-selector.js b/src/containers/sprite-selector.js
index b3c8ee744..2f5c83d44 100644
--- a/src/containers/sprite-selector.js
+++ b/src/containers/sprite-selector.js
@@ -23,6 +23,10 @@ class SpriteSelector extends React.Component {
         this.setState({targets: data});
     }
     render () {
+        const {
+            vm, // eslint-disable-line no-unused-vars
+            ...props
+        } = this.props;
         return (
             <SpriteSelectorComponent
                 value={this.state.targets.editingTarget && [this.state.targets.editingTarget]}
@@ -33,6 +37,7 @@ class SpriteSelector extends React.Component {
                         name: target[1]
                     }
                 ))}
+                {...props}
             />
         );
     }
diff --git a/src/containers/stage.js b/src/containers/stage.js
index 11cf4b9e2..3a195ccf7 100644
--- a/src/containers/stage.js
+++ b/src/containers/stage.js
@@ -84,8 +84,15 @@ class Stage extends React.Component {
         this.animationFrame = requestAnimationFrame(this.animate);
     }
     render () {
+        const {
+            vm, // eslint-disable-line no-unused-vars
+            ...props
+        } = this.props;
         return (
-            <StageComponent canvasRef={canvas => this.canvas = canvas} />
+            <StageComponent
+                canvasRef={canvas => this.canvas = canvas}
+                {...props}
+            />
         );
     }
 }
diff --git a/src/containers/stop-all.js b/src/containers/stop-all.js
index 9e08aa16a..9b4f0f95d 100644
--- a/src/containers/stop-all.js
+++ b/src/containers/stop-all.js
@@ -13,10 +13,14 @@ class StopAll extends React.Component {
         this.props.vm.stopAll();
     }
     render () {
+        const {
+            vm, // eslint-disable-line no-unused-vars
+            ...props
+        } = this.props;
         return (
             <StopAllComponent
                 onClick={this.onClick}
-                {... this.props}
+                {...props}
             />
         );
     }
-- 
GitLab