UNPKG

react-form-with-constraints

Version:
86 lines (85 loc) 2.95 kB
import * as React from 'react'; import { instanceOf } from 'prop-types'; import { FormWithConstraints } from './FormWithConstraints'; export class Input extends React.Component { constructor() { super(...arguments); this.state = { field: undefined }; this.fieldWillValidate = (fieldName) => { if (fieldName === this.props.name) { this.setState({ field: 'pending' }); } }; this.fieldDidValidate = (field) => { if (field.name === this.props.name) { this.setState({ field }); } }; this.fieldDidReset = (field) => { if (field.name === this.props.name) { this.setState({ field: undefined }); } }; } componentDidMount() { this.context.form.addFieldWillValidateEventListener(this.fieldWillValidate); this.context.form.addFieldDidValidateEventListener(this.fieldDidValidate); this.context.form.addFieldDidResetEventListener(this.fieldDidReset); } componentWillUnmount() { this.context.form.removeFieldWillValidateEventListener(this.fieldWillValidate); this.context.form.removeFieldDidValidateEventListener(this.fieldDidValidate); this.context.form.removeFieldDidResetEventListener(this.fieldDidReset); } fieldValidationStates() { const { field } = this.state; const states = []; if (field !== undefined) { if (field === 'pending') { states.push('isPending'); } else { if (field.hasErrors()) states.push('hasErrors'); if (field.hasWarnings()) states.push('hasWarnings'); if (field.hasInfos()) states.push('hasInfos'); if (field.isValid()) states.push('isValid'); } } return states; } render() { const { innerRef, className, classes, ...inputProps } = this.props; const validationStates = this.fieldValidationStates(); let classNames = className; validationStates.forEach(validationState => { const tmp = classes[validationState]; if (tmp !== undefined) { if (classNames !== undefined) { classNames += ` ${tmp}`; } else { classNames = tmp; } } }); return React.createElement("input", { ref: innerRef, ...inputProps, className: classNames }); } } Input.contextTypes = { form: instanceOf(FormWithConstraints).isRequired }; Input.defaultProps = { classes: { isPending: 'is-pending', hasErrors: 'has-errors', hasWarnings: 'has-warnings', hasInfos: 'has-infos', isValid: 'is-valid' } };