Login.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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. Router.push({ pathname: "/pt/pemantauan" });
  72. await createLog(auth.data.token, { aktivitas: "Berhasil Login", _csrf: _csrf });
  73. return;
  74. } else if ([2020, 2021, 2023].includes(auth.data.user.role.id)) {
  75. Router.push({ pathname: "/app/pemantauan" });
  76. await createLog(auth.data.token, { aktivitas: "Berhasil Login", _csrf: _csrf });
  77. return;
  78. } else {
  79. this.setState({ error: "Akun tidak ada" });
  80. }
  81. this.setState({ loading: false });
  82. }
  83. } catch (error) {
  84. this.setState({ loading: false });
  85. this.setState({ error: error.response?.data.message || error.response });
  86. }
  87. };
  88. /* Simplify error check */
  89. hasError = (formName, inputName, method) => {
  90. return (
  91. this.state[formName] &&
  92. this.state[formName].errors &&
  93. this.state[formName].errors[inputName] &&
  94. this.state[formName].errors[inputName][method]
  95. );
  96. };
  97. render() {
  98. return (
  99. <Card className="card-login-over">
  100. <img
  101. className="img-login-1"
  102. src="/static/img/logo-login.png"
  103. alt="Logo"
  104. />
  105. <CardBody className="card-body">
  106. {" "}
  107. <h5 className="card-title text-left py-2 bg-gray border-radius-login">
  108. <img
  109. className="icon-triangle"
  110. src="/static/img/icon-caution.png"
  111. ></img>
  112. <b>Login Menggunakan Akun PDDIKTI </b>
  113. </h5>
  114. {this.state.error && <div style={{
  115. backgroundColor: '#f8d7da',
  116. padding: '5px',
  117. borderRadius: '3px'
  118. }}>
  119. <span className=" text-bold">{this.state.error}</span>
  120. </div>}
  121. <form onSubmit={this.onSubmit} method="post" name="formLogin">
  122. <div className="form-group">
  123. <label className="col-form-label">
  124. Username <span className="star-color">*</span>
  125. </label>
  126. <Input
  127. type="text"
  128. name="username"
  129. invalid={this.hasError("formLogin", "username", "required")}
  130. onChange={this.validateOnChange}
  131. data-validate='["required"]'
  132. value={this.state.formLogin.username}
  133. />
  134. {this.hasError("formLogin", "username", "required") && (
  135. <span className="invalid-feedback">Wajib diisi</span>
  136. )}
  137. </div>
  138. <div className="form-group">
  139. <label className="col-form-label">
  140. Password <span className="star-color">*</span>
  141. </label>
  142. <Input
  143. type="password"
  144. id="id-password"
  145. name="password"
  146. invalid={this.hasError("formLogin", "password", "required")}
  147. onChange={this.validateOnChange}
  148. data-validate='["required"]'
  149. value={this.state.formLogin.password}
  150. />
  151. <span className="invalid-feedback">Wajib diisi</span>
  152. </div>
  153. {/* <div className="required">* Required fields</div>
  154. <span>Login Menggunakan Akun PDDIKTI</span> */}
  155. <div className="btn-radius">
  156. <Button color type="submit" block className=" mt-3 btn-login">
  157. <text className="text-login">
  158. <b className="font-color-white">
  159. {" "}
  160. {this.state.loading ? (
  161. <div class="d-flex justify-content-center">
  162. <div
  163. class="spinner-border spinner-border-sm"
  164. role="status"
  165. ></div>
  166. </div>
  167. ) : (
  168. "Login"
  169. )}
  170. </b>
  171. </text>
  172. </Button>
  173. </div>
  174. </form>
  175. </CardBody>
  176. </Card>
  177. );
  178. }
  179. }
  180. const mapStateToProps = (state) => ({ user: state.user });
  181. const mapDispatchToProps = (dispatch) => ({
  182. setUser: (payload) => dispatch({ type: "SET_USER", payload }),
  183. setToken: (payload) => dispatch({ type: "SET_TOKEN", payload }),
  184. setPT: (payload) => dispatch({ type: "SET_PT", payload }),
  185. });
  186. export default connect(mapStateToProps, mapDispatchToProps)(Login);