import PropTypes from 'prop-types' 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, } export default function OptionMaster({option, name, updateOptions, ...props}) { let WrappedComponent = null if (option.choices) { WrappedComponent = PureChoicesOption } else { WrappedComponent = OptionTypes[option.type] } let onChange = (e) => { switch (option.type) { case 'bool' : updateOptions({[name]: !option.value}) break case 'int': updateOptions({[name]: parseInt(e.target.value)}) break default: updateOptions({[name]: e.target.value}) } } return (