Login.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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 { createLog } from "@/actions/log";
  8. import axiosAPI from "@/config/axios";
  9. import { getPT } from "@/actions/PT";
  10. import { getCsrf } from "../../actions/security";
  11. class Login extends Component {
  12. constructor(props) {
  13. super(props);
  14. this.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. loading: false,
  23. };
  24. }
  25. /**
  26. * Validate input using onChange event
  27. * @param {String} formName The name of the form in the state object
  28. * @return {Function} a function used for the event
  29. */
  30. validateOnChange = (event) => {
  31. const input = event.target;
  32. const form = input.form;
  33. const value = input.type === "checkbox" ? input.checked : input.value;
  34. const result = FormValidator.validate(input);
  35. this.setState({
  36. [form.name]: {
  37. ...this.state[form.name],
  38. [input.name]: value,
  39. errors: {
  40. ...this.state[form.name].errors,
  41. [input.name]: result,
  42. },
  43. },
  44. });
  45. };
  46. onSubmit = async (e) => {
  47. try {
  48. const form = e.target;
  49. const inputs = [...form.elements].filter((i) =>
  50. ["INPUT", "SELECT"].includes(i.nodeName)
  51. );
  52. const { errors, hasError } = FormValidator.bulkValidate(inputs);
  53. this.setState({
  54. [form.name]: {
  55. ...this.state[form.name],
  56. errors,
  57. },
  58. });
  59. console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");
  60. e.preventDefault();
  61. if (!hasError) {
  62. const getTokenCsrf = await getCsrf();
  63. const _csrf = getTokenCsrf.token;
  64. this.setState({ loading: true });
  65. const { username, password } = this.state.formLogin;
  66. const auth = await login(username, password);
  67. this.props.setToken(auth.data.token);
  68. this.props.setUser(auth.data.user);
  69. axiosAPI.defaults.headers.common["Authorization"] = auth.data.token;
  70. if (auth.data.user.role.id === 2022) {
  71. await createLog(auth.data.token, { aktivitas: "PT berhasil Login", menu: "Pelaporan", _csrf: _csrf });
  72. return location.href = '/pt/pemantauan';
  73. } else if ([2020, 2021, 2023, 2024].includes(auth.data.user.role.id)) {
  74. await createLog(auth.data.token, { aktivitas: "Berhasil Login", menu: "Pelaporan", _csrf: _csrf });
  75. return location.href = '/app/pemantauan';
  76. } else {
  77. this.setState({ error: "Akun tidak ada" });
  78. }
  79. this.setState({ loading: false });
  80. }
  81. } catch (error) {
  82. this.setState({ loading: false });
  83. this.setState({ error: error.response?.data.message || error.response });
  84. }
  85. };
  86. /* Simplify error check */
  87. hasError = (formName, inputName, method) => {
  88. return (
  89. this.state[formName] &&
  90. this.state[formName].errors &&
  91. this.state[formName].errors[inputName] &&
  92. this.state[formName].errors[inputName][method]
  93. );
  94. };
  95. render() {
  96. return (
  97. <Card className="card-login-over">
  98. <img
  99. className="img-login-1"
  100. src="/static/img/logo-login.png"
  101. alt="Logo"
  102. />
  103. <CardBody className="card-body">
  104. {" "}
  105. <h5 className="card-title text-left py-2 bg-gray border-radius-login">
  106. <img
  107. className="icon-triangle"
  108. src="/static/img/icon-caution.png"
  109. ></img>
  110. <b>Login Menggunakan Akun PDDIKTI </b>
  111. </h5>
  112. {this.state.error && <div style={{
  113. backgroundColor: '#f8d7da',
  114. padding: '5px',
  115. borderRadius: '3px'
  116. }}>
  117. <span className=" text-bold">{this.state.error}</span>
  118. </div>}
  119. <form onSubmit={this.onSubmit} method="post" name="formLogin">
  120. <div className="form-group">
  121. <label className="col-form-label">
  122. Username <span className="star-color">*</span>
  123. </label>
  124. <Input
  125. type="text"
  126. name="username"
  127. invalid={this.hasError("formLogin", "username", "required")}
  128. onChange={this.validateOnChange}
  129. data-validate='["required"]'
  130. value={this.state.formLogin.username}
  131. />
  132. {this.hasError("formLogin", "username", "required") && (
  133. <span className="invalid-feedback">Wajib diisi</span>
  134. )}
  135. </div>
  136. <div className="form-group">
  137. <label className="col-form-label">
  138. Password <span className="star-color">*</span>
  139. </label>
  140. <Input
  141. type="password"
  142. id="id-password"
  143. name="password"
  144. invalid={this.hasError("formLogin", "password", "required")}
  145. onChange={this.validateOnChange}
  146. data-validate='["required"]'
  147. value={this.state.formLogin.password}
  148. />
  149. <span className="invalid-feedback">Wajib diisi</span>
  150. </div>
  151. {/* <div className="required">* Required fields</div>
  152. <span>Login Menggunakan Akun PDDIKTI</span> */}
  153. <div className="btn-radius">
  154. <Button color type="submit" block className=" mt-3 btn-login">
  155. <text className="text-login">
  156. <b className="font-color-white">
  157. {" "}
  158. {this.state.loading ? (
  159. <div class="d-flex justify-content-center">
  160. <div
  161. class="spinner-border spinner-border-sm"
  162. role="status"
  163. ></div>
  164. </div>
  165. ) : (
  166. "Login"
  167. )}
  168. </b>
  169. </text>
  170. </Button>
  171. </div>
  172. </form>
  173. </CardBody>
  174. </Card>
  175. );
  176. }
  177. }
  178. const mapStateToProps = (state) => ({ user: state.user });
  179. const mapDispatchToProps = (dispatch) => ({
  180. setUser: (payload) => dispatch({ type: "SET_USER", payload }),
  181. setToken: (payload) => dispatch({ type: "SET_TOKEN", payload }),
  182. setPT: (payload) => dispatch({ type: "SET_PT", payload }),
  183. });
  184. export default connect(mapStateToProps, mapDispatchToProps)(Login);