register.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import React, { Component } from 'react';
  2. import BasePage from '@/components/Layout/BasePage';
  3. import Link from 'next/link';
  4. import { Input, CustomInput } from 'reactstrap';
  5. import FormValidator from '@/components/Forms/Validator.js';
  6. class Register extends Component {
  7. state = {
  8. formRegister: {
  9. email: '',
  10. password: '',
  11. password2: '',
  12. terms: false
  13. }
  14. }
  15. /**
  16. * Validate input using onChange event
  17. * @param {String} formName The name of the form in the state object
  18. * @return {Function} a function used for the event
  19. */
  20. validateOnChange = event => {
  21. const input = event.target;
  22. const form = input.form
  23. const value = input.type === 'checkbox' ? input.checked : input.value;
  24. const result = FormValidator.validate(input);
  25. this.setState({
  26. [form.name]: {
  27. ...this.state[form.name],
  28. [input.name]: value,
  29. errors: {
  30. ...this.state[form.name].errors,
  31. [input.name]: result
  32. }
  33. }
  34. });
  35. }
  36. onSubmit = e => {
  37. const form = e.target;
  38. const inputs = [...form.elements].filter(i => ['INPUT', 'SELECT'].includes(i.nodeName))
  39. const { errors, hasError } = FormValidator.bulkValidate(inputs)
  40. this.setState({
  41. [form.name]: {
  42. ...this.state[form.name],
  43. errors
  44. }
  45. });
  46. console.log(hasError ? 'Form has errors. Check!' : 'Form Submitted!')
  47. e.preventDefault()
  48. }
  49. /* Simplify error check */
  50. hasError = (formName, inputName, method) => {
  51. return this.state[formName] &&
  52. this.state[formName].errors &&
  53. this.state[formName].errors[inputName] &&
  54. this.state[formName].errors[inputName][method]
  55. }
  56. render() {
  57. return (
  58. <div className="block-center mt-4 wd-xl">
  59. {/* START card */}
  60. <div className="card card-flat">
  61. <div className="card-header text-center bg-dark">
  62. <a href="">
  63. <img className="block-center" src="/static/img/logo.png" alt="Logo"/>
  64. </a>
  65. </div>
  66. <div className="card-body">
  67. <p className="text-center py-2">SIGNUP TO GET INSTANT ACCESS.</p>
  68. <form className="mb-3" name="formRegister" onSubmit={this.onSubmit}>
  69. <div className="form-group">
  70. <label className="text-muted" htmlFor="signupInputEmail1">Email address</label>
  71. <div className="input-group with-focus">
  72. <Input type="email"
  73. name="email"
  74. className="border-right-0"
  75. placeholder="Enter email"
  76. invalid={this.hasError('formRegister','email','required')||this.hasError('formRegister','email','email')}
  77. onChange={this.validateOnChange}
  78. data-validate='["required", "email"]'
  79. value={this.state.formRegister.email}/>
  80. <div className="input-group-append">
  81. <span className="input-group-text text-muted bg-transparent border-left-0">
  82. <em className="fa fa-envelope"></em>
  83. </span>
  84. </div>
  85. { this.hasError('formRegister','email','required') && <span className="invalid-feedback">Field is required</span> }
  86. { this.hasError('formRegister','email','email') && <span className="invalid-feedback">Field must be valid email</span> }
  87. </div>
  88. </div>
  89. <div className="form-group">
  90. <label className="text-muted" htmlFor="signupInputPassword1">Password</label>
  91. <div className="input-group with-focus">
  92. <Input type="text"
  93. id="id-password"
  94. name="password"
  95. className="border-right-0"
  96. placeholder="Password"
  97. invalid={this.hasError('formRegister','password','required')}
  98. onChange={this.validateOnChange}
  99. data-validate='["required"]'
  100. value={this.state.formRegister.password}
  101. />
  102. <div className="input-group-append">
  103. <span className="input-group-text text-muted bg-transparent border-left-0">
  104. <em className="fa fa-lock"></em>
  105. </span>
  106. </div>
  107. <span className="invalid-feedback">Field is required</span>
  108. </div>
  109. </div>
  110. <div className="form-group">
  111. <label className="text-muted" htmlFor="signupInputRePassword1">Retype Password</label>
  112. <div className="input-group with-focus">
  113. <Input type="text" name="password2"
  114. className="border-right-0"
  115. placeholder="Retype assword"
  116. invalid={this.hasError('formRegister','password2','equalto')}
  117. onChange={this.validateOnChange}
  118. data-validate='["equalto"]'
  119. value={this.state.formRegister.password2}
  120. data-param="id-password"
  121. />
  122. <div className="input-group-append">
  123. <span className="input-group-text text-muted bg-transparent border-left-0">
  124. <em className="fa fa-lock"></em>
  125. </span>
  126. </div>
  127. <span className="invalid-feedback">Field must be equal to previous</span>
  128. </div>
  129. </div>
  130. <CustomInput type="checkbox" id="terms"
  131. name="terms"
  132. label="I agree with the terms"
  133. invalid={this.hasError('formRegister','terms','required')}
  134. onChange={this.validateOnChange}
  135. data-validate='["required"]'
  136. checked={this.state.formRegister.terms}>
  137. <span className="invalid-feedback">Field is required</span>
  138. </CustomInput>
  139. <button className="btn btn-block btn-primary mt-3" type="submit">Create account</button>
  140. </form>
  141. <p className="pt-3 text-center">Have an account?</p>
  142. <Link href="/pages/login" as="/login"><button type="button" className="btn btn-block btn-secondary">Signup</button></Link>
  143. </div>
  144. </div>
  145. {/* END card */}
  146. <div className="p-3 text-center">
  147. <span className="mr-2">&copy;</span>
  148. <span>2020</span>
  149. <span className="mx-2">-</span>
  150. <span>Angle</span>
  151. <br/>
  152. <span>Bootstrap Admin Template</span>
  153. </div>
  154. </div>
  155. );
  156. }
  157. }
  158. Register.Layout = BasePage
  159. export default Register;