All files / components/register index.js

0% Statements 0/65
0% Branches 0/49
0% Functions 0/15
0% Lines 0/24
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104                                                                                                                                                                                                               
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import './styles.css';
 
class Register extends Component {
  constructor(props) {
    super(props);
 
    this.state = {
      validation: {
        userName: false,
        userEmail: false
      }
    };
  }
 
  handleChange = event => {
    const { name, validity, value } = event.target;
 
    this.showInputError(name, validity);
    this.props.handleChange(name, value);
  };
 
  handleSubmit = event => {
    event.preventDefault();
 
    const invalidForm = Object.keys(this.state.validation).reduce(
      (accumulator, value) => accumulator || this.state.validation[value],
      false
    );
 
    if (!invalidForm) {
      this.props.handleSubmit();
    }
  };
 
  showInputError(name, validity) {
    if (!validity.valid) {
      this.setState({
        validation: Object.assign({}, this.state.validation, { [name]: true })
      });
    } else {
      this.setState({
        validation: Object.assign({}, this.state.validation, { [name]: false })
      });
    }
  }
 
  render() {
    const { userName, userEmail } = this.props;
 
    return (
      <section className="blabbr-register">
        <h2>Register to add comments</h2>
        <form>
          <div>
            <label id="userNameLabel" htmlFor="userName">
              Display name:
            </label>
            <input
              id="userName"
              name="userName"
              type="text"
              pattern=".{3,}"
              value={userName || ''}
              onChange={this.handleChange}
            />
            {!!this.state.validation.userName &&
              <div className="error">
                Display name must be at least 3 characters.
              </div>}
          </div>
          <div>
            <label id="userEmailLabel" htmlFor="userEmail">
              Email:
            </label>
            <input
              id="userEmail"
              name="userEmail"
              type="email"
              value={userEmail || ''}
              onChange={this.handleChange}
            />
            {!!this.state.validation.userEmail &&
              <div className="error">Please use a valid email address.</div>}
          </div>
          <button type="submit" onClick={this.handleSubmit}>
            Register
          </button>
        </form>
      </section>
    );
  }
}
 
Register.propTypes = {
  handleChange: PropTypes.func.isRequired,
  handleSubmit: PropTypes.func.isRequired,
  userName: PropTypes.string.isRequired,
  userEmail: PropTypes.string.isRequired
};
 
export default Register;