diff --git a/src/lib/vm-listener-hoc.jsx b/src/lib/vm-listener-hoc.jsx index 8c80de40ae7bb4b25cc85ea4be004f77e315cec5..a00516e14a1a09958bac3ba7b83186bfff1b57b1 100644 --- a/src/lib/vm-listener-hoc.jsx +++ b/src/lib/vm-listener-hoc.jsx @@ -164,7 +164,9 @@ const vmListenerHOC = function (WrappedComponent) { }; const mapStateToProps = state => ({ // Do not emit target or project updates in fullscreen or player only mode - shouldEmitUpdates: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly, + // or when recording sounds (it leads to garbled recordings on low-power machines) + shouldEmitUpdates: !state.scratchGui.mode.isFullScreen && !state.scratchGui.mode.isPlayerOnly && + !state.scratchGui.modals.soundRecorder, vm: state.scratchGui.vm, username: state.session && state.session.session && state.session.session.user ? state.session.session.user.username : '' diff --git a/test/unit/util/vm-listener-hoc.test.jsx b/test/unit/util/vm-listener-hoc.test.jsx index a6c61c1a1e96ee34fb67ba01c623b8d3dbdc2473..33753cf8e3d58770626de8937870fe2d1d9b424f 100644 --- a/test/unit/util/vm-listener-hoc.test.jsx +++ b/test/unit/util/vm-listener-hoc.test.jsx @@ -15,6 +15,7 @@ describe('VMListenerHOC', () => { store = mockStore({ scratchGui: { mode: {}, + modals: {}, vm: vm } }); @@ -49,4 +50,45 @@ describe('VMListenerHOC', () => { const child = wrapper.find(Component); expect(child.props().onGreenFlag).toBeUndefined(); }); + + test('targetsUpdate event from vm triggers targets update action', () => { + const Component = () => (<div />); + const WrappedComponent = vmListenerHOC(Component); + mount( + <WrappedComponent + store={store} + vm={vm} + /> + ); + const targetList = []; + const editingTarget = 'id'; + vm.emit('targetsUpdate', {targetList, editingTarget}); + const actions = store.getActions(); + expect(actions[0].type).toEqual('scratch-gui/targets/UPDATE_TARGET_LIST'); + expect(actions[0].targets).toEqual(targetList); + expect(actions[0].editingTarget).toEqual(editingTarget); + }); + + test('targetsUpdate does not dispatch if the sound recorder is visible', () => { + const Component = () => (<div />); + const WrappedComponent = vmListenerHOC(Component); + store = mockStore({ + scratchGui: { + mode: {}, + modals: {soundRecorder: true}, + vm: vm + } + }); + mount( + <WrappedComponent + store={store} + vm={vm} + /> + ); + const targetList = []; + const editingTarget = 'id'; + vm.emit('targetsUpdate', {targetList, editingTarget}); + const actions = store.getActions(); + expect(actions.length).toEqual(0); + }); });