import React, { Component } from "react"; import PropTypes from "prop-types"; export default class CustomInput extends Component { static propTypes = { type: PropTypes.string, inputType: PropTypes.string, name: PropTypes.string, value: PropTypes.string, label: PropTypes.string, placeholder: PropTypes.string, customInputEvents: PropTypes.object, }; static defaultProps = { type: "text", inputType: "text", name: "", value: "", label: "", placeholder: "", customInputEvents: {}, }; constructor(props) { super(props); this.state = { customInputEvents: props.customInputEvents, errors: "", value: props.value, }; if (this.state.customInputEvents.onBlur) { const oldOnBlur = this.state.customInputEvents.onBlur; this.state.customInputEvents.onBlur = () => { this.onBlurHandler(); oldOnBlur(); }; } else this.state.customInputEvents.onBlur = this.onBlurHandler; if (this.state.customInputEvents.onChange) { const oldOnChange = this.state.customInputEvents.onChange; this.state.customInputEvents.onChange = (event) => { this.onChangeHandler(event); oldOnChange(event); }; } else this.state.customInputEvents.onChange = this.onChangeHandler; } onBlurHandler = () => { this.validateInput(); }; onChangeHandler = (event) => { this.setState({ value: event.target.value, }); }; listErrors = () => { let errors = this.state.errors; if (errors.length > 0) { errors = errors.map((error) => { return (
  • { error }
  • ); }); return ( ); } return ""; }; validateInput = () => { const value = this.state.value; const type = this.props.type; const errors = []; if (type === "email") { if (value.indexOf("@") === -1) { errors.push(`${ this.props.label } must have at least one @.`); } else if (value.lastIndexOf("@") !== value.indexOf("@")) { errors.push(`${ this.props.label } must not have more than one @.`); } } else if (type === "password") { if (value.length < 4) { errors.push(`${ this.props.label } must be at least 4 characters long.`); } else if (value.length > 10) { errors.push(`${ this.props.label } can't be more than 10 characters long.`); } } this.setState({ errors }); }; render() { return ( ); } }