import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import {connect} from 'react-redux'; /** * Turbo Mode component passes toggleTurboMode function to its child. * It also includes `turboMode` in the props passed to the children. * It expects this child to be a function with the signature * function (toggleTurboMode, {turboMode, ...props}) {} * The component can then be used to attach turbo mode setting functionality * to any other component: * * <TurboMode>{(toggleTurboMode, props) => ( * <MyCoolComponent * turboEnabled={props.turboMode} * onClick={toggleTurboMode} * {...props} * /> * )}</TurboMode> */ class TurboMode extends React.Component { constructor (props) { super(props); bindAll(this, [ 'toggleTurboMode' ]); } toggleTurboMode () { this.props.vm.setTurboMode(!this.props.turboMode); } render () { const { /* eslint-disable no-unused-vars */ children, vm, /* eslint-enable no-unused-vars */ ...props } = this.props; return this.props.children(this.toggleTurboMode, props); } } TurboMode.propTypes = { children: PropTypes.func, turboMode: PropTypes.bool, vm: PropTypes.shape({ setTurboMode: PropTypes.func }) }; const mapStateToProps = state => ({ vm: state.scratchGui.vm, turboMode: state.scratchGui.vmStatus.turbo }); export default connect( mapStateToProps, () => ({}) // omit dispatch prop )(TurboMode);