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