Login.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import React, { Component } from "react";
  2. import { Input, Card, CardBody, Button } from "reactstrap";
  3. import Router from "next/router";
  4. import FormValidator from "@/components/Forms/Validator.js";
  5. import { connect } from "react-redux";
  6. import { login, getUser } from "@/actions/auth";
  7. import axiosAPI from "@/config/axios";
  8. import { getPT } from "@/actions/PT";
  9. class Login extends Component {
  10. constructor(props) {
  11. super(props);
  12. this.state = {
  13. /* Group each form state in an object.
  14. Property name MUST match the form name */
  15. error: null,
  16. formLogin: {
  17. username: "",
  18. password: "",
  19. },
  20. loading: false,
  21. };
  22. }
  23. /**
  24. * Validate input using onChange event
  25. * @param {String} formName The name of the form in the state object
  26. * @return {Function} a function used for the event
  27. */
  28. validateOnChange = (event) => {
  29. const input = event.target;
  30. const form = input.form;
  31. const value = input.type === "checkbox" ? input.checked : input.value;
  32. const result = FormValidator.validate(input);
  33. this.setState({
  34. [form.name]: {
  35. ...this.state[form.name],
  36. [input.name]: value,
  37. errors: {
  38. ...this.state[form.name].errors,
  39. [input.name]: result,
  40. },
  41. },
  42. });
  43. };
  44. onSubmit = async (e) => {
  45. try {
  46. const form = e.target;
  47. const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));
  48. const { errors, hasError } = FormValidator.bulkValidate(inputs);
  49. this.setState({
  50. [form.name]: {
  51. ...this.state[form.name],
  52. errors,
  53. },
  54. });
  55. console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
  56. e.preventDefault();
  57. if (!hasError) {
  58. this.setState({ loading: true });
  59. const { username, password } = this.state.formLogin;
  60. const auth = await login(username, password);
  61. this.props.setToken(auth.data.token);
  62. this.props.setUser(auth.data.user);
  63. axiosAPI.defaults.headers.common["Authorization"] = auth.data.token;
  64. this.setState({ loading: false });
  65. if (auth.data.user.role.id === 2022) {
  66. Router.push({ pathname: "/pt/pemantauan" });
  67. } else if ([2020, 2021, 2023].includes(auth.data.user.role.id)) {
  68. Router.push({ pathname: "/app/pemantauan" });
  69. } else {
  70. this.setState({ error: "Akun tidak ada" });
  71. }
  72. }
  73. } catch (error) {
  74. this.setState({ loading: false });
  75. this.setState({ error: error.response?.data.message || error.response });
  76. }
  77. };
  78. /* Simplify error check */
  79. hasError = (formName, inputName, method) => {
  80. return this.state[formName] && this.state[formName].errors && this.state[formName].errors[inputName] && this.state[formName].errors[inputName][method];
  81. };
  82. render() {
  83. return (
  84. <Card className="card-login-over">
  85. <img className="img-login-1" src="/static/img/logo-login.png" alt="Logo" />
  86. <CardBody className="card-body">
  87. {" "}
  88. <h5 className="card-title text-left py-2 bg-gray border-radius-login">
  89. <img className="icon-triangle" src="/static/img/icon-caution.png"></img>
  90. <b>Login Menggunakan Akun PDDIKTI </b>
  91. </h5>
  92. {this.state.error}
  93. <form onSubmit={this.onSubmit} method="post" name="formLogin">
  94. <div className="form-group">
  95. <label className="col-form-label">
  96. Username <span className="star-color">*</span>
  97. </label>
  98. <Input type="text" name="username" invalid={this.hasError("formLogin", "username", "required")} onChange={this.validateOnChange} data-validate='["required"]' value={this.state.formLogin.username} />
  99. {this.hasError("formLogin", "username", "required") && <span className="invalid-feedback">Field is required</span>}
  100. </div>
  101. <div className="form-group">
  102. <label className="col-form-label">
  103. Password <span className="star-color">*</span>
  104. </label>
  105. <Input
  106. type="password"
  107. id="id-password"
  108. name="password"
  109. invalid={this.hasError("formLogin", "password", "required")}
  110. onChange={this.validateOnChange}
  111. data-validate='["required"]'
  112. value={this.state.formLogin.password}
  113. />
  114. <span className="invalid-feedback">Field is required</span>
  115. </div>
  116. {/* <div className="required">* Required fields</div>
  117. <span>Login Menggunakan Akun PDDIKTI</span> */}
  118. <div className="btn-radius">
  119. <Button color type="submit" block className=" mt-3 btn-login">
  120. <text className="text-login">
  121. <b className="font-color-white">{this.state.loading ? "Loading..." : "Login"}</b>
  122. </text>
  123. </Button>
  124. </div>
  125. </form>
  126. </CardBody>
  127. </Card>
  128. );
  129. }
  130. }
  131. const mapStateToProps = (state) => ({ user: state.user });
  132. const mapDispatchToProps = (dispatch) => ({
  133. setUser: (payload) => dispatch({ type: "SET_USER", payload }),
  134. setToken: (payload) => dispatch({ type: "SET_TOKEN", payload }),
  135. setPT: (payload) => dispatch({ type: "SET_PT", payload }),
  136. });
  137. export default connect(mapStateToProps, mapDispatchToProps)(Login);