| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | import { connect } from "react-redux";import { login, getUser, refreshToken } from "@/actions/auth";import axiosJWT from "@/config/axios";import { getPT } from "@/actions/PT";import React, { Component } from "react";import BasePage from "@/components/Layout/BasePage";import { Row, Col, Input, Card, CardHeader, CardBody, Button, CardFooter, CustomInput } from "reactstrap";import Router from "next/router";import FormValidator from "@/components/Forms/Validator.js";class Login extends Component {	constructor(props) {		super(props);	}	state = {		/* Group each form state in an object.           Property name MUST match the form name */		formLogin: {			username: "",			password: "",		},	};	/**	 * Validate input using onChange event	 * @param  {String} formName The name of the form in the state object	 * @return {Function} a function used for the event	 */	validateOnChange = (event) => {		const input = event.target;		const form = input.form;		const value = input.type === "checkbox" ? input.checked : input.value;		const result = FormValidator.validate(input);		this.setState({			[form.name]: {				...this.state[form.name],				[input.name]: value,				errors: {					...this.state[form.name].errors,					[input.name]: result,				},			},		});	};	onSubmit = async (e) => {		const form = e.target;		const inputs = [...form.elements].filter((i) => ["INPUT", "SELECT"].includes(i.nodeName));		const { errors, hasError } = FormValidator.bulkValidate(inputs);		this.setState({			[form.name]: {				...this.state[form.name],				errors,			},		});		console.log(hasError ? "Form has errors. Check!" : "Form Submitted!");		e.preventDefault();		if (!hasError) {			const { username, password } = this.state.formLogin;			const auth = await login(username, password);			// console.log(auth);			if (auth.success) {				axiosJWT.defaults.headers.Authorization = `Bearer ${auth.access_token}`;				const dataUser = await getUser();				// console.log(dataUser);				this.props.setUser(dataUser.data);				// const token = await refreshToken();				// console.log(token);				if (dataUser.data.peran[0].peran.id === 2022) {					const org_id = dataUser.data.peran[0].organisasi.id;					const pt = await getPT({ id: org_id });					this.props.setPT(pt);					Router.push({ pathname: "/app/pt/pemantauan" });				} else {					const pt = await getPT();					this.props.setPT(pt);					Router.push({ pathname: "/app/pemantauan" });				}			}		}		// e.preventDefault();	};	/* Simplify error check */	hasError = (formName, inputName, method) => {		return this.state[formName] && this.state[formName].errors && this.state[formName].errors[inputName] && this.state[formName].errors[inputName][method];	};	render() {		return (			<div className="block-center mt-4 wd-xl">				<Card className="card card-flat">					<img className="card-img-top" src="/static/img/logo.png" alt="Logo" />					<CardBody className="card-body">						{" "}						<h5 className="card-title text-center py-2 bg-gray">Aplikasi Perguruan Tinggi Bermasalah </h5>						<form onSubmit={this.onSubmit} method="post" name="formLogin">							<div className="form-group">								<label className="col-form-label">Username *</label>								<Input type="text" name="username" invalid={this.hasError("formLogin", "username", "required")} onChange={this.validateOnChange} data-validate='["required"]' value={this.state.formLogin.username} />								{this.hasError("formLogin", "username", "required") && <span className="invalid-feedback">Field is required</span>}							</div>							<div className="form-group">								<label className="col-form-label">Password *</label>								<Input									type="password"									id="id-password"									name="password"									invalid={this.hasError("formLogin", "password", "required")}									onChange={this.validateOnChange}									data-validate='["required"]'									value={this.state.formLogin.password}								/>								<span className="invalid-feedback">Field is required</span>							</div>							<div className="required">* Required fields</div>							<Button color="primary" type="submit" block className=" mt-3">								Login							</Button>						</form>					</CardBody>				</Card>			</div>		);	}}Login.Layout = BasePage;const mapStateToProps = (state) => ({ user: state.user });const mapDispatchToProps = (dispatch) => ({	setUser: (payload) => dispatch({ type: "SET_USER", payload }),	setPT: (payload) => dispatch({ type: "SET_PT", payload }),});export default connect(mapStateToProps, mapDispatchToProps)(Login);
 |