import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; /** * Higher Order Component to manage inputs that submit on blur and * @param {React.Component} Input text input that consumes onChange, onBlur, onKeyPress * @returns {React.Component} Buffered input that calls onSubmit on blur and */ export default function (Input) { class BufferedInput extends React.Component { constructor (props) { super(props); bindAll(this, [ 'handleChange', 'handleKeyPress', 'handleFlush' ]); this.state = { value: null }; } handleKeyPress (e) { if (e.key === 'Enter') { this.handleFlush(); e.target.blur(); } } handleFlush () { const isNumeric = typeof this.props.value === 'number'; const validatesNumeric = isNumeric ? !isNaN(this.state.value) : true; if (this.state.value !== null && validatesNumeric) { this.props.onSubmit(isNumeric ? Number(this.state.value) : this.state.value); } this.setState({value: null}); } handleChange (e) { this.setState({value: e.target.value}); } render () { const bufferedValue = this.state.value === null ? this.props.value : this.state.value; return ( ); } } BufferedInput.propTypes = { onSubmit: PropTypes.func.isRequired, value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }; return BufferedInput; }