Guest User

Untitled

a guest
Jun 19th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.18 KB | None | 0 0
  1. import React, {Component} from 'react'
  2. import PropTypes from 'prop-types';
  3. import {stringValueMandatoryValidator} from './validators.js'
  4. import './ValidatingForm.css'
  5.  
  6. class ValidatingForm extends Component {
  7. static propTypes = {
  8. onValidSubmit: PropTypes.func.isRequired
  9. }
  10. state = {
  11. name: {
  12. value: '',
  13. messages: [],
  14. },
  15. role: {
  16. value: '',
  17. messages: [],
  18. }
  19. }
  20. validators = {
  21. name: [
  22. stringValueMandatoryValidator
  23. ]
  24. }
  25.  
  26.  
  27. addMessageTo = (field, message) => {
  28. const newField = {...this.state[field], messages: [...this.state[field].messages, message]}
  29. this.setState(prevState => ({...prevState, newField}))
  30. }
  31.  
  32. validate = (field) => {
  33. const results = this.validators[field].map(validator => validator(this.state[field].value, field))
  34. results.forEach(result => this.addMessageTo(field, result.message))
  35. return results.reduce((acc, result) => acc && result.valid, true)
  36. }
  37.  
  38. handleNameChange = event => {
  39. const {value} = event.target
  40. this.setState(prevState => ({...prevState, name: {...prevState.name, value}}))
  41. }
  42.  
  43. handleSelectChange = event => {
  44. const {value} = event.target
  45. this.setState(prevState => ({...prevState, role: {...prevState.role, value}}))
  46. }
  47.  
  48. onSubmit = () => this.validate('name') && this.props.onValidSubmit(this.state)
  49.  
  50.  
  51. render() {
  52. return (
  53. <form className="ValidatingForm" onSubmit={this.onSubmit}>
  54. <legend>Form Validation</legend>
  55. <div>
  56. <label className="name">Name</label>
  57. <input className="name" type="text" onChange={this.handleNameChange}/>
  58. </div>
  59. <div>
  60. <label className="role">Role</label>
  61. <select className="role" onChange={this.handleSelectChange}>
  62. <option/>
  63. <option>Member</option>
  64. <option>Guest</option>
  65. </select>
  66. </div>
  67. </form>
  68. )
  69. }
  70. }
  71.  
  72. export default ValidatingForm
Add Comment
Please, Sign In to add comment