login.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { connect } from "react-redux";
  2. // import Router, { withRouter } from "next/router";
  3. import { login } from "@/store/actions/user";
  4. import React, { Component } from "react";
  5. import BasePage from "@/components/Layout/BasePage";
  6. import { Row, Col, Input, Card, CardHeader, CardBody, CardFooter, CustomInput } from "reactstrap";
  7. import FormValidator from "@/components/Forms/Validator.js";
  8. /**
  9. * Validation flow using controlled components
  10. *
  11. * 1- User type on input
  12. * 2- onChange event trigger validation
  13. * 3- Validate methods are listed using "data-validate"
  14. * attribute. Content must be an array in json format.
  15. * 4- The validation returns an object with format {[input name]: status}
  16. * where status is an array of boolean per each method
  17. * 5- Methods that requires an argument, read the 'data-param' attribute
  18. * 6- Similarly, onSubmit event does a bulk validation on all form elements
  19. */
  20. class Login extends Component {
  21. state = {
  22. /* Group each form state in an object.
  23. Property name MUST match the form name */
  24. formLogin: {
  25. username: "",
  26. password: "",
  27. },
  28. };
  29. /**
  30. * Validate input using onChange event
  31. * @param {String} formName The name of the form in the state object
  32. * @return {Function} a function used for the event
  33. */
  34. validateOnChange = (event) => {
  35. const input = event.target;
  36. const form = input.form;
  37. const value = input.type === "checkbox" ? input.checked : input.value;
  38. const result = FormValidator.validate(input);
  39. this.setState({
  40. [form.name]: {
  41. ...this.state[form.name],
  42. [input.name]: value,
  43. errors: {
  44. ...this.state[form.name].errors,
  45. [input.name]: result,
  46. },
  47. },
  48. });
  49. };
  50. onSubmit = (e) => {
  51. const form = e.target;
  52. const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));
  53. const { errors, hasError } = FormValidator.bulkValidate(inputs);
  54. this.setState({
  55. [form.name]: {
  56. ...this.state[form.name],
  57. errors,
  58. },
  59. });
  60. console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
  61. if (!hasError) {
  62. const { username, password } = this.state.formLogin;
  63. console.log(this.state);
  64. this.dispatch(login(username, password));
  65. }
  66. e.preventDefault();
  67. };
  68. /* Simplify error check */
  69. hasError = (formName, inputName, method) => {
  70. return this.state[formName] && this.state[formName].errors && this.state[formName].errors[inputName] && this.state[formName].errors[inputName][method];
  71. };
  72. render() {
  73. return (
  74. <div className="block-center mt-4 wd-xl">
  75. <div className="card card-flat">
  76. <img className="card-img-top" src="/static/img/logo.png" alt="Logo"></img>
  77. <div className="card-body">
  78. {" "}
  79. <h5 className="card-title text-center py-2 bg-gray">Aplikasi Perguruan Tinggi Bermasalah </h5>
  80. <form onSubmit={this.onSubmit} method="post" name="formLogin">
  81. <div className="form-group">
  82. <label className="col-form-label">Username *</label>
  83. <Input type="text" name="username" invalid={this.hasError("formLogin", "username", "required")} onChange={this.validateOnChange} data-validate='["required"]' value={this.state.formLogin.username} />
  84. {this.hasError("formLogin", "username", "required") && <span className="invalid-feedback">Field is required</span>}
  85. </div>
  86. <div className="form-group">
  87. <label className="col-form-label">Password *</label>
  88. <Input
  89. type="password"
  90. id="id-password"
  91. name="password"
  92. invalid={this.hasError("formLogin", "password", "required")}
  93. onChange={this.validateOnChange}
  94. data-validate='["required"]'
  95. value={this.state.formLogin.password}
  96. />
  97. <span className="invalid-feedback">Field is required</span>
  98. </div>
  99. <div className="required">* Required fields</div>
  100. <button type="submit" className="btn btn-block btn-primary mt-3">
  101. Login
  102. </button>
  103. </form>
  104. </div>
  105. </div>
  106. </div>
  107. );
  108. }
  109. }
  110. Login.Layout = BasePage;
  111. export default connect(null)(Login);