import PropTypes from 'prop-types' import { connect } from 'react-redux' import { update as updateOptions } from '../../ducks/options' PureBooleanOption.PropTypes = { value: PropTypes.bool.isRequired, onChange: PropTypes.func.isRequired, } function PureBooleanOption({ value, onChange, name, help}) { return (
) } PureStringOption.PropTypes = { value: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, } function PureStringOption( { value, onChange, name, help }) { let onKeyDown = (e) => {e.stopPropagation()} return (
) } PureNumberOption.PropTypes = { value: PropTypes.number.isRequired, onChange: PropTypes.func.isRequired, } function PureNumberOption( {value, onChange, name, help }) { let onKeyDown = (e) => {e.stopPropagation()} return (
) } PureChoicesOption.PropTypes = { value: PropTypes.string.isRequired, onChange: PropTypes.func.isRequired, } function PureChoicesOption( { value, onChange, name, help, choices }) { return (
) } const OptionTypes = { bool: PureBooleanOption, str: PureStringOption, int: PureNumberOption, "optional str": PureStringOption, "sequence of str": PureStringOption, } Wrapper.displayName = 'OptionWrapper' function Wrapper({option, options, updateOptions, ...props}) { let optionObj = options[option], WrappedComponent = null if (optionObj.choices) { WrappedComponent = PureChoicesOption } else { WrappedComponent = OptionTypes[optionObj.type] } let onChange = (e) => { switch (optionObj.type) { case 'bool' : updateOptions({[option]: !optionObj.value}) break case 'int': updateOptions({[option]: parseInt(e.target.value)}) break default: updateOptions({[option]: e.target.value}) } } return } export default connect( state => ({ options: state.options, }), { updateOptions, } )(Wrapper)