login.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { connect } from "react-redux";
  2. import { login, getUser, refreshToken } from "@/actions/auth";
  3. import axiosAPI from "@/config/axios";
  4. import { getPT } from "@/actions/PT";
  5. import React, { Component } from "react";
  6. import BasePage from "@/components/Layout/BasePage";
  7. import { Row, Col, Input, Card, CardHeader, CardBody, Button, CardFooter, CustomInput } from "reactstrap";
  8. import Router from "next/router";
  9. import FormValidator from "@/components/Forms/Validator.js";
  10. class Login extends Component {
  11. constructor(props) {
  12. super(props);
  13. }
  14. state = {
  15. /* Group each form state in an object.
  16. Property name MUST match the form name */
  17. error: null,
  18. formLogin: {
  19. username: "",
  20. password: "",
  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. const form = e.target;
  46. const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));
  47. const { errors, hasError } = FormValidator.bulkValidate(inputs);
  48. this.setState({
  49. [form.name]: {
  50. ...this.state[form.name],
  51. errors,
  52. },
  53. });
  54. console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
  55. e.preventDefault();
  56. if (!hasError) {
  57. const { username, password } = this.state.formLogin;
  58. const auth = await login(username, password);
  59. console.log(auth);
  60. if (auth.success) {
  61. axiosAPI.defaults.headers.Authorization = `Bearer ${auth.access_token}`;
  62. const dataUser = await getUser();
  63. console.log(dataUser);
  64. this.props.setUser(dataUser.data);
  65. if (dataUser.data.peran[0].peran.id === 2022) {
  66. const org_id = dataUser.data.peran[0].organisasi.id;
  67. const pt = await getPT({ id: org_id });
  68. if (pt?.success) {
  69. this.props.setPT(pt.data);
  70. }
  71. Router.push({ pathname: "/app/pt/pemantauan" });
  72. } else {
  73. Router.push({ pathname: "/app/pemantauan" });
  74. }
  75. } else {
  76. this.setState({ error: auth.message || auth.error });
  77. }
  78. }
  79. // e.preventDefault();
  80. };
  81. /* Simplify error check */
  82. hasError = (formName, inputName, method) => {
  83. return this.state[formName] && this.state[formName].errors && this.state[formName].errors[inputName] && this.state[formName].errors[inputName][method];
  84. };
  85. render() {
  86. return (
  87. <div className="block-center mt-4 wd-xl">
  88. <Card className="card card-flat">
  89. <img className="card-img-top" src="/static/img/logo.png" alt="Logo" />
  90. <CardBody className="card-body">
  91. {" "}
  92. <h5 className="card-title text-center py-2 bg-gray">Aplikasi Perguruan Tinggi Bermasalah </h5>
  93. {this.state.error}
  94. <form onSubmit={this.onSubmit} method="post" name="formLogin">
  95. <div className="form-group">
  96. <label className="col-form-label">Username *</label>
  97. <Input type="text" name="username" invalid={this.hasError("formLogin", "username", "required")} onChange={this.validateOnChange} data-validate='["required"]' value={this.state.formLogin.username} />
  98. {this.hasError("formLogin", "username", "required") && <span className="invalid-feedback">Field is required</span>}
  99. </div>
  100. <div className="form-group">
  101. <label className="col-form-label">Password *</label>
  102. <Input
  103. type="password"
  104. id="id-password"
  105. name="password"
  106. invalid={this.hasError("formLogin", "password", "required")}
  107. onChange={this.validateOnChange}
  108. data-validate='["required"]'
  109. value={this.state.formLogin.password}
  110. />
  111. <span className="invalid-feedback">Field is required</span>
  112. </div>
  113. <div className="required">* Required fields</div>
  114. <Button color="primary" type="submit" block className=" mt-3">
  115. Login
  116. </Button>
  117. </form>
  118. </CardBody>
  119. </Card>
  120. </div>
  121. );
  122. }
  123. }
  124. Login.Layout = BasePage;
  125. const mapStateToProps = (state) => ({ user: state.user });
  126. const mapDispatchToProps = (dispatch) => ({
  127. setUser: (payload) => dispatch({ type: "SET_USER", payload }),
  128. setPT: (payload) => dispatch({ type: "SET_PT", payload }),
  129. });
  130. export default connect(mapStateToProps, mapDispatchToProps)(Login);