From e752ffdf8a997dd11c1ea3da3f0a76b555a3c6ef Mon Sep 17 00:00:00 2001 From: Karishma Chadha <kchadha@media.mit.edu> Date: Tue, 27 Nov 2018 17:54:50 -0500 Subject: [PATCH] Disconnect from cloud when viewing someone else's project in editor mode --- src/lib/cloud-manager-hoc.jsx | 16 ++++++++++++---- src/reducers/gui.js | 8 ++++++-- src/reducers/mode.js | 6 ++++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/lib/cloud-manager-hoc.jsx b/src/lib/cloud-manager-hoc.jsx index 6ca6b7500..73a66b8f4 100644 --- a/src/lib/cloud-manager-hoc.jsx +++ b/src/lib/cloud-manager-hoc.jsx @@ -46,18 +46,22 @@ const cloudManagerHOC = function (WrappedComponent) { // This should cover info about the website specifically, like scrather status return !!(props.cloudHost && props.username && props.vm && props.projectId); } + shouldNotModifyCloudData (props) { + return (props.hasEverEnteredEditor && !props.canSave); + } shouldConnect (props) { - return !this.isConnected() && this.canUseCloud(props) && props.isShowingWithId; + return !this.isConnected() && this.canUseCloud(props) && + props.isShowingWithId && !this.shouldNotModifyCloudData(props); } shouldDisconnect (props, prevProps) { return this.isConnected() && ( // Can no longer use cloud or cloud provider info is now stale !this.canUseCloud(this.props) || (props.projectId !== prevProps.projectId) || - (props.username !== prevProps.username) + (props.username !== prevProps.username) || + // Editing someone else's project + this.shouldNotModifyCloudData(props) ); - // TODO need to add provisions for viewing someone - // else's project in editor mode } isConnected () { return this.cloudProvider && !!this.cloudProvider.connection; @@ -83,6 +87,7 @@ const cloudManagerHOC = function (WrappedComponent) { cloudHost, projectId, username, + hasEverEnteredEditor, isShowingWithId, /* eslint-enable no-unused-vars */ vm, @@ -99,7 +104,9 @@ const cloudManagerHOC = function (WrappedComponent) { } CloudManager.propTypes = { + canSave: PropTypes.bool.isRequired, cloudHost: PropTypes.string, + hasEverEnteredEditor: PropTypes.bool, isShowingWithId: PropTypes.bool, projectId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), username: PropTypes.string, @@ -109,6 +116,7 @@ const cloudManagerHOC = function (WrappedComponent) { const mapStateToProps = state => { const loadingState = state.scratchGui.projectState.loadingState; return { + hasEverEnteredEditor: state.scratchGui.mode.hasEverEnteredEditor, isShowingWithId: getIsShowingWithId(loadingState), projectId: state.scratchGui.projectState.projectId }; diff --git a/src/reducers/gui.js b/src/reducers/gui.js index 6ae91b95a..35046b343 100644 --- a/src/reducers/gui.js +++ b/src/reducers/gui.js @@ -60,7 +60,10 @@ const initPlayer = function (currentState) { currentState, {mode: { isFullScreen: currentState.mode.isFullScreen, - isPlayerOnly: true + isPlayerOnly: true, + // When initializing in player mode, make sure to reset + // hasEverEnteredEditorMode + hasEverEnteredEditor: false }} ); }; @@ -70,7 +73,8 @@ const initFullScreen = function (currentState) { currentState, {mode: { isFullScreen: true, - isPlayerOnly: currentState.mode.isPlayerOnly + isPlayerOnly: currentState.mode.isPlayerOnly, + hasEverEnteredEditor: currentState.mode.hasEverEnteredEditor }} ); }; diff --git a/src/reducers/mode.js b/src/reducers/mode.js index d95cb1f99..739ae163d 100644 --- a/src/reducers/mode.js +++ b/src/reducers/mode.js @@ -3,7 +3,8 @@ const SET_PLAYER = 'scratch-gui/mode/SET_PLAYER'; const initialState = { isFullScreen: false, - isPlayerOnly: false + isPlayerOnly: false, + hasEverEnteredEditor: true }; const reducer = function (state, action) { @@ -17,7 +18,8 @@ const reducer = function (state, action) { case SET_PLAYER: return { isFullScreen: state.isFullScreen, - isPlayerOnly: action.isPlayerOnly + isPlayerOnly: action.isPlayerOnly, + hasEverEnteredEditor: state.hasEverEnteredEditor || !action.isPlayerOnly }; default: return state; -- GitLab