yazid138 3 jaren geleden
bovenliggende
commit
1c305d57dc

+ 39 - 0
actions/PT.js

@@ -0,0 +1,39 @@
+import https from "https";
+
+export const getPT = async (params) => {
+	try {
+		const controller = new AbortController();
+		const timeoutId = setTimeout(() => controller.abort(), 10000);
+
+		const httpsAgent = new https.Agent({
+			rejectUnauthorized: false,
+		});
+		let url = "https://api.kemdikbud.go.id:8243/pddikti/1.2/pt";
+		if (params.id) {
+			url += `/${params.id}`;
+		} else if (params.search) {
+			url += `?q=${params.search}`;
+		}
+
+		const res = await fetch(url, {
+			method: "GET",
+			headers: new Headers({
+				Authorization: "Bearer 5b62f743-eef2-3370-8c66-6951b2e9c2c5",
+				Accept: "application/json",
+				"Access-Control-Allow-Origin": "*",
+			}),
+			agent: httpsAgent,
+			signal: controller.signal,
+		});
+		if (!res.ok) {
+			throw new Error(`Error! status: ${response.status}`);
+		}
+
+		clearTimeout(timeoutId);
+		const result = await res.json();
+		return result;
+	} catch (error) {
+		console.log("error", error);
+		return false;
+	}
+};

+ 4 - 5
actions/auth.js

@@ -1,17 +1,16 @@
 import axios from "axios";
 import axiosJWT from "../config/axios";
-import qs from "qs";
 
 export const login = async (username, password) => {
 	try {
-		const data = qs.stringify({
+		const data = {
 			username,
 			password,
-		});
+		};
 
 		const response = await axios.post("http://localhost:5000/login", data, {
 			headers: {
-				"Content-Type": "application/x-www-form-urlencoded",
+				"Content-Type": "application/json",
 			},
 			withCredentials: true,
 		});
@@ -33,7 +32,7 @@ export const refreshToken = async () => {
 
 export const getUser = async () => {
 	try {
-		const response = await axiosJWT.get("http://localhost:5000/user");
+		const response = await axiosJWT.get("/user");
 		return response.data;
 	} catch (error) {
 		if (error.response) return error.response.data;

+ 0 - 4
actions/cabutSanksi.js

@@ -8,11 +8,9 @@ export const addCabutSanksi = async ({ noSanksi, ptId }, data) => {
 		});
 		const result = await res.json();
 		console.log(result);
-		// addLog({ status: "SUCCESS", action: "CREATE", from: { id: result.added._id, data: "cabut-sanksi" }, description: "membuat permohonan cabut-sanksi" });
 		return result;
 	} catch (error) {
 		console.log("error", error);
-		addLog({ status: "FAIL", action: "ADD", from: { data: "cabut-sanksi" }, description: error.message || "membuat permohonan banding" });
 		return false;
 	}
 };
@@ -25,11 +23,9 @@ export const addJawabanCabutSanksi = async ({ noSanksi, ptId }, data) => {
 		});
 		const result = await res.json();
 		console.log(result);
-		// addLog({ status: "SUCCESS", action: "CREATE", from: { id: result.added._id, data: "cabut-sanksi" }, description: "membuat jawaban permohonan cabut-sanksi" });
 		return result;
 	} catch (error) {
 		console.log("error", error);
-		// addLog({ status: "FAIL", action: "ADD", from: { data: "cabut-sanksi" }, description: error.message || "membuat jawaban permohonan banding" });
 		return false;
 	}
 };

+ 5 - 6
components/Layout/Sidebar.js

@@ -10,7 +10,7 @@ import { bindActionCreators } from "redux";
 import * as actions from "../../store/actions/actions";
 
 import SidebarUserBlock from "./SidebarUserBlock";
-import { getUser } from "@/actions/auth";
+// import { getUser } from "@/actions/auth";
 
 import Menu from "./Menu.js";
 import MenuPT from "./MenuPT.js";
@@ -145,10 +145,9 @@ class Sidebar extends Component {
 	};
 
 	async componentDidMount() {
-		// this.menu = JSON.parse(sessionStorage.getItem("user")).peran[0].peran.id === 2 ? MenuPT : Menu;
-		const user = await getUser();
-		// dataUser.data.peran[0].peran.id === 2;
-		this.menu = user.data.peran[0].peran.id === 2 ? MenuPT : Menu;
+		// const user = await getUser();
+		const user = this.props.user;
+		this.menu = user.data.peran[0].peran.id === 2022 ? MenuPT : Menu;
 		// prepare the flags to handle menu collapsed states
 		this.buildCollapseList();
 
@@ -318,7 +317,7 @@ Sidebar.propTypes = {
 	settings: PropTypes.object,
 };
 
-const mapStateToProps = (state) => ({ settings: state.settings });
+const mapStateToProps = (state) => ({ settings: state.settings, user: state.user });
 const mapDispatchToProps = (dispatch) => ({
 	actions: bindActionCreators(actions, dispatch),
 });

+ 3 - 3
components/Layout/SidebarUserBlock.js

@@ -1,7 +1,6 @@
 import React, { Component } from "react";
 import PropTypes from "prop-types";
 import { Collapse } from "reactstrap";
-import { getUser } from "@/actions/auth";
 
 import { connect } from "react-redux";
 
@@ -13,7 +12,8 @@ class SidebarUserBlock extends Component {
 	};
 
 	async componentDidMount() {
-		const user = await getUser();
+		// const user = await getUser();
+		const user = this.props.user;
 		this.setState({ user: user.data, role: user.data.peran[0].peran.nama });
 	}
 
@@ -52,6 +52,6 @@ SidebarUserBlock.propTypes = {
 	showUserBlock: PropTypes.bool,
 };
 
-const mapStateToProps = (state) => ({ showUserBlock: state.settings.showUserBlock });
+const mapStateToProps = (state) => ({ showUserBlock: state.settings.showUserBlock, user: state.user });
 
 export default connect(mapStateToProps)(SidebarUserBlock);

+ 11 - 6
components/Main/DetailPT.js

@@ -1,19 +1,24 @@
-function DetailPT() {
+import React, { useState, useEffect } from "react";
+import { getPT } from "@/actions/PT";
+import { useSelector } from "react-redux";
+
+function DetailPT({ data }) {
 	return (
 		<div className="card card-default">
 			<div className="card-body">
 				<div className="text-center">
-					<h3 className="mt-0">Universitas Satyagama</h3>
-					<p>0742/O/1990</p>
+					<h3 className="mt-0">{data.nama}</h3>
+					<p>{data.sk_pendirian}</p>
 				</div>
 				<hr />
 				<ul className="list-unstyled px-4">
 					<li>
-						<em className="fa fa-globe fa-fw mr-3"></em>www.satyagama.ac.id
+						<em className="fa fa-globe fa-fw mr-3"></em>
+						<a href={`https://${data.website}`}>{data.website}</a>
 					</li>
-					<li>
+					{/* <li>
 						<em className="fa fa-graduation-cap fa-fw mr-3"></em>Status Pelanggaran : Tidak Ada
-					</li>
+					</li> */}
 				</ul>
 			</div>
 		</div>

+ 6 - 3
components/PT/JawabanKeberatan/ModalPermohonan.js

@@ -3,6 +3,7 @@ import Router from "next/router";
 import { Row, Col, FormGroup, Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
 import { addBanding } from "@/actions/banding";
 import { addDocPerbaikan } from "@/actions/docPerbaikan";
+import { connect } from "react-redux";
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -66,14 +67,15 @@ export class ModalPermohonan extends Component {
 
 	onSubmit = async (e) => {
 		e.preventDefault();
-		const { noSanksi } = this.props.query;
+		const { user, query } = this.props;
+		const { noSanksi } = query;
 		const formdata = new FormData();
 		if (this.state.files.length > 0) {
 			this.state.files.forEach((e) => {
 				formdata.append("files", e);
 			});
 
-			const added = await addBanding({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" }, formdata);
+			const added = await addBanding({ noSanksi, ptId: user.data.peran[0].organisasi.id }, formdata);
 
 			if (added) {
 				Router.push({
@@ -151,4 +153,5 @@ export class ModalPermohonan extends Component {
 	}
 }
 
-export default ModalPermohonan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(ModalPermohonan);

+ 6 - 3
components/PT/Keberatan/ModalPermohonan.js

@@ -3,6 +3,7 @@ import Router from "next/router";
 import { Row, Col, FormGroup, Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
 import { addKeberatan } from "@/actions/keberatan";
 import { addDocPerbaikan } from "@/actions/docPerbaikan";
+import { connect } from "react-redux";
 
 let Dropzone = null;
 class DropzoneWrapper extends Component {
@@ -66,14 +67,15 @@ export class ModalPermohonan extends Component {
 
 	onSubmit = async (e) => {
 		e.preventDefault();
-		const { noSanksi } = this.props.query;
+		const { user, query } = this.props;
+		const { noSanksi } = query;
 		const formdata = new FormData();
 		if (this.state.files.length > 0) {
 			this.state.files.forEach((e) => {
 				formdata.append("files", e);
 			});
 
-			const added = await addKeberatan({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" }, formdata);
+			const added = await addKeberatan({ noSanksi, ptId: user.data.peran[0].organisasi.id }, formdata);
 			// formdata.append("keberatan", added.add.sanksi.keberatan._id);
 			// formdata.append("data", added.add.sanksi.keberatan._id);
 			// formdata.append("model", "Keberatan");
@@ -155,4 +157,5 @@ export class ModalPermohonan extends Component {
 	}
 }
 
-export default ModalPermohonan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(ModalPermohonan);

+ 21 - 6
config/axios.js

@@ -2,7 +2,10 @@ import axios from "axios";
 import { refreshToken } from "@/actions/auth";
 // import jwt_decode from "jwt-decode";
 
-const axiosJWT = axios.create();
+const axiosJWT = axios.create({
+	baseURL: "http://localhost:5000",
+	withCredentials: true,
+});
 
 axiosJWT.interceptors.request.use(
 	async (config) => {
@@ -12,14 +15,26 @@ axiosJWT.interceptors.request.use(
 		// const currentDate = Date.now();
 		// if (expire * 1000 < currentDate) {
 		const response = await refreshToken();
-		config.headers = {
-			Authorization: `Bearer ${response.access_token}`,
-		};
-		config.withCredentials = true;
+		// console.log(response);
+		if (response.success) config.headers.Authorization = `Bearer ${response.access_token}`;
+		// config.withCredentials = true;
 		return config;
 		// }
 	},
-	(error) => {
+	async (error) => {
+		const originalConfig = err.config;
+		// if (error.response.status === 403 || error.response.status === 401) {
+		try {
+			const response = await refreshToken();
+			if (response.success) {
+				// axiosJWT.defaults.headers.Authorization = `Bearer ${response.access_token}`;
+				originalConfig.headers.Authorization = `Bearer ${response.access_token}`;
+				return axiosJWT(originalConfig);
+			}
+		} catch (error) {
+			return Promise.reject(error);
+		}
+		// }
 		return Promise.reject(error);
 	}
 );

+ 4 - 0
pages/app/pelaporan/index.js

@@ -9,6 +9,9 @@ import TableLaporan from "@/components/Main/TableLaporan";
 class Pelaporan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			user: {},
+		};
 	}
 
 	static getInitialProps = async () => {
@@ -18,6 +21,7 @@ class Pelaporan extends Component {
 
 	render() {
 		const { pelaporan } = this.props;
+		console.log(this.state.user);
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Pelaporan</div>

+ 36 - 65
pages/app/pelaporan/search.js

@@ -3,39 +3,18 @@ import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Button, Table, Pagination, PaginationItem, PaginationLink } from "reactstrap";
 import Link from "next/link";
-
+import { getPT } from "@/actions/PT";
 // React Slider
 import Slider from "rc-slider";
 import "rc-slider/assets/index.css";
 // React Select
 import Select from "react-select";
 // DateTimePicker
-import Datetime from "react-datetime";
 import "react-datetime/css/react-datetime.css";
 
-import https from "https";
-
-import CardTool from "@/components/Common/CardTool";
-
-import dummyData from "../PT-ID.json";
-
 var pembina = [];
 
 class Search extends Component {
-	static async getInitialProps(ctx) {
-		pembina = [];
-		const httpsAgent = new https.Agent({
-			rejectUnauthorized: false,
-		});
-
-		const jsonPembina = [{ id: "ABEAE958-4F20-40EF-B145-B8014EC98D8F", nama: "Badan Intelijen Negara", singkatan: "BIN" }];
-		var numrows = jsonPembina.length;
-
-		for (var i = 0; i < numrows; i++) {
-			pembina.push({ value: jsonPembina[i].id, label: jsonPembina[i].nama, className: "State-" + jsonPembina[i].singkatan });
-		}
-	}
-
 	state = {
 		selectedOptionMulti: [],
 		data: [],
@@ -66,68 +45,60 @@ class Search extends Component {
 	};
 
 	fetchData = async () => {
-		var qPembina = "";
-		if (this.state.selectedOptionMulti.value !== undefined) {
-			qPembina = "&pembina=" + this.state.selectedOptionMulti.value;
-		}
-
-		const searchValue = "q=" + document.getElementById("searchInput").value;
-
-		const httpsAgent = new https.Agent({
-			rejectUnauthorized: false,
-		});
-		const jsonData = dummyData;
-
+		const searchValue = document.getElementById("searchInput").value;
+		const jsonData = await getPT({ search: searchValue });
 		this.setState({ data: jsonData });
-		console.log("jsonData : ", jsonData);
 	};
 
 	handleApplyClick = () => {
 		console.log("selectedOptionMulti : ", this.state.selectedOptionMulti);
 		this.fetchData();
-		if (this.state.data.length > 0) {
+		if (this.state.data.length) {
 			this.renderTableData();
 		}
 	};
 
 	handleSearchClick = () => {
 		this.fetchData();
-		if (this.state.data.length > 0) {
+		if (this.state.data.length) {
 			this.renderTableData();
 		}
 	};
 
 	renderTableData() {
-		return this.state.data.map((pt, index) => {
-			return (
-				<tr>
-					<td>
-						<label>{index + 1}</label>
-					</td>
-					<td>
-						<div className="media align-items-center">
-							<a className="mr-3" href="">
-								<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
-							</a>
-							<div className="media-body d-flex">
-								<div>
-									<h4 className="m-0">{pt.nama}</h4>
-									<small className="text-muted">
-										{pt.sk_pendirian} - {pt.website} - {pt.email}
-									</small>
-									<p>{pt.alamat.jalan}</p>
-								</div>
-								<div className="ml-auto">
-									<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
-										Buat Laporan
-									</Button>
+		return (
+			this.state.data &&
+			this.state.data.map((pt, index) => {
+				return (
+					<tr>
+						<td>
+							<label>{index + 1}</label>
+						</td>
+						<td>
+							<div className="media align-items-center">
+								<a className="mr-3" href="">
+									<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
+								</a>
+								<div className="media-body d-flex">
+									<div>
+										<h4 className="m-0">{pt.nama}</h4>
+										<small className="text-muted">
+											{pt.sk_pendirian} - {pt.website} - {pt.email}
+										</small>
+										<p>{pt.alamat.jalan}</p>
+									</div>
+									<div className="ml-auto">
+										<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
+											Buat Laporan
+										</Button>
+									</div>
 								</div>
 							</div>
-						</div>
-					</td>
-				</tr>
-			);
-		});
+						</td>
+					</tr>
+				);
+			})
+		);
 		//}
 	}
 

+ 39 - 52
pages/app/pemantauan/index.js

@@ -3,6 +3,7 @@ import Router from "next/router";
 import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col, Button, Table, Pagination, PaginationItem, PaginationLink } from "reactstrap";
 // React Slider
+import { getPT } from "@/actions/PT";
 import Slider from "rc-slider";
 import "rc-slider/assets/index.css";
 // React Select
@@ -57,70 +58,60 @@ class Search extends Component {
 	};
 
 	fetchData = async () => {
-		var qPembina = "";
-		console.log("this.state.selectedOptionMulti.value : ", this.state.selectedOptionMulti.value);
-		if (this.state.selectedOptionMulti.value !== undefined) {
-			qPembina = "&pembina=" + this.state.selectedOptionMulti.value;
-		}
-
-		const searchValue = "q=" + document.getElementById("searchInput").value;
-
-		const httpsAgent = new https.Agent({
-			rejectUnauthorized: false,
-		});
-
-		const jsonData = dummyData;
-
+		const searchValue = document.getElementById("searchInput").value;
+		const jsonData = await getPT({ search: searchValue });
 		this.setState({ data: jsonData });
 	};
 
 	handleApplyClick = () => {
 		console.log("selectedOptionMulti : ", this.state.selectedOptionMulti);
 		this.fetchData();
-		if (this.state.data.length > 0) {
+		if (this.state.data && this.state.data.length) {
 			this.renderTableData();
 		}
 	};
 
 	handleSearchClick = () => {
 		this.fetchData();
-		if (this.state.data.length > 0) {
+		if (this.state.data && this.state.data.length) {
 			this.renderTableData();
 		}
 	};
 
 	renderTableData() {
-
-		return this.state.data.map((pt, index) => {
-			return (
-				<tr>
-					<td>
-						<label>{index + 1}</label>
-					</td>
-					<td>
-						<div className="media align-items-center">
-							<a className="mr-3" href="">
-								<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
-							</a>
-							<div className="media-body d-flex">
-								<div>
-									<h4 className="m-0">{pt.nama}</h4>
-									<small className="text-muted">
-										{pt.sk_pendirian} - {pt.website} - {pt.email}
-									</small>
-									<p>{pt.alamat.jalan}</p>
-								</div>
-								<div className="ml-auto">
-									<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
-										View
-									</Button>
+		return (
+			this.state.data &&
+			this.state.data.map((pt, index) => {
+				return (
+					<tr>
+						<td>
+							<label>{index + 1}</label>
+						</td>
+						<td>
+							<div className="media align-items-center">
+								<a className="mr-3" href="">
+									<img className="img-fluid rounded thumb64" src="/static/img/dummy-search.png" alt="Dummy" />
+								</a>
+								<div className="media-body d-flex">
+									<div>
+										<h4 className="m-0">{pt.nama}</h4>
+										<small className="text-muted">
+											{pt.sk_pendirian} - {pt.website} - {pt.email}
+										</small>
+										<p>{pt.alamat.jalan}</p>
+									</div>
+									<div className="ml-auto">
+										<Button color="info" size="sm" onClick={(e) => this.handleClick(e, pt.id)}>
+											View
+										</Button>
+									</div>
 								</div>
 							</div>
-						</div>
-					</td>
-				</tr>
-			);
-		});
+						</td>
+					</tr>
+				);
+			})
+		);
 		//}
 	}
 
@@ -144,15 +135,12 @@ class Search extends Component {
 								<button className="btn btn-secondary" type="button" onClick={(e) => this.handleSearchClick()}>
 									Search
 								</button>
-								<div className="ml-auto">
-								</div>
+								<div className="ml-auto"></div>
 							</div>
 						</div>
 						{/* START card */}
 						<div className="card card-default">
-							<div className="card-header">
-								Search Results
-							</div>
+							<div className="card-header">Search Results</div>
 							{/* START table-responsive */}
 							<Table striped bordered hover>
 								<thead>
@@ -165,8 +153,7 @@ class Search extends Component {
 							</Table>
 							{/* END table-responsive */}
 							<div className="card-footer">
-								<div className="d-flex">
-								</div>
+								<div className="d-flex"></div>
 							</div>
 						</div>
 						{/* END card */}

+ 15 - 4
pages/app/pemantauan/timeline.js

@@ -5,19 +5,32 @@ import DetailPT from "@/components/Main/DetailPT";
 import { getLog } from "@/actions/log";
 import { Row, Col } from "reactstrap";
 import Timeline from "@/components/Main/Timeline";
+import { getPT } from "@/actions/PT";
 
 class Pemantauan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			pt: {},
+		};
 	}
 
 	static async getInitialProps({ query }) {
 		const log = await getLog({ ptId: query.ptId });
-		return { log };
+		return { log, query };
 	}
 
+	componentDidMount = async () => {
+		const { query } = this.props;
+		const pt = await getPT({ id: query.ptId });
+		this.setState({ pt });
+	};
+
 	render() {
 		const { log } = this.props;
+		const { pt } = this.state;
+		console.log(pt);
+
 		return (
 			<ContentWrapper unwrap>
 				<Header />
@@ -26,9 +39,7 @@ class Pemantauan extends Component {
 						<Col xl="9">
 							<Timeline data={log} />
 						</Col>
-						<Col xl="3">
-							<DetailPT />
-						</Col>
+						<Col xl="3">{/* <DetailPT data={pt.data[0]} /> */}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>

+ 17 - 17
pages/app/pt/jawaban-banding/detail.js

@@ -7,32 +7,27 @@ import DetailSanksi from "@/components/Main/DetailSanksi";
 import DetailJawaban from "@/components/PT/JawabanBanding/DetailJawaban";
 import Link from "next/link";
 import { Row, Col, Card, CardBody, Button } from "reactstrap";
+import { connect } from "react-redux";
+import { withRouter } from "next/router";
 
 class JawabanBanding extends Component {
 	constructor(props) {
 		super(props);
 		this.state = {
 			modal: false,
+			sanksi: {},
 		};
 	}
 
-	static async getInitialProps({ query }) {
-		const { noSanksi } = query;
-		const sanksi = await getSanksi({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { query, sanksi };
-	}
-
-	toggleModal = (value = true) => {
-		if (!value) {
-			this.setState({ modal: false });
-		} else {
-			this.setState({ modal: !this.state.modal });
-		}
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const { noSanksi } = this.props.router.query;
+		const sanksi = await getSanksi({ noSanksi, ptId: user.data.peran[0].organisasi.id });
+		this.setState({ sanksi });
 	};
 
 	render() {
-		const { sanksi } = this.props;
-
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper unwrap>
 				<Header />
@@ -51,8 +46,12 @@ class JawabanBanding extends Component {
 								<CardBody>
 									<Row>
 										<Col lg={12}>
-											<DetailSanksi data={sanksi.data[0]} />
-											<DetailJawaban data={sanksi.data[0]} />
+											{sanksi && sanksi.data && (
+												<>
+													<DetailSanksi data={sanksi.data[0]} />
+													<DetailJawaban data={sanksi.data[0]} />
+												</>
+											)}
 										</Col>
 									</Row>
 								</CardBody>
@@ -68,4 +67,5 @@ class JawabanBanding extends Component {
 	}
 }
 
-export default JawabanBanding;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(withRouter(JawabanBanding));

+ 13 - 7
pages/app/pt/jawaban-banding/index.js

@@ -3,28 +3,34 @@ import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col } from "reactstrap";
 import { getSanksi } from "@/actions/sanksi";
 import TableSanksi from "@/components/PT/TableSanksi";
-
+import { connect } from "react-redux";
 class JawabanKeberatan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			sanksi: {},
+		};
 	}
 
-	static getInitialProps = async () => {
-		const sanksi = await getSanksi({ banding: true, jawaban: true, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { sanksi };
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const org_id = user.data.peran[0].organisasi.id;
+		const sanksi = await getSanksi({ banding: true, jawaban: true, ptId: org_id });
+		this.setState({ sanksi });
 	};
 
 	render() {
-		const { sanksi } = this.props;
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Jawaban Atas Permohonan Banding</div>
 				<Row>
-					<Col lg={12}>{sanksi.data.length > 0 ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-banding/detail" linkName="Detail" /> : ""}</Col>
+					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-banding/detail" linkName="Detail" /> : ""}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-export default JawabanKeberatan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(JawabanKeberatan);

+ 30 - 25
pages/app/pt/jawaban-keberatan/detail.js

@@ -9,20 +9,23 @@ import ModalPermohonan from "@/components/PT/JawabanKeberatan/ModalPermohonan";
 import Riwayat from "@/components/PT/JawabanKeberatan/Riwayat";
 import Link from "next/link";
 import { Row, Col, Card, CardBody, Button } from "reactstrap";
-
+import { connect } from "react-redux";
+import { withRouter } from "next/router";
 class JawabanKeberatan extends Component {
 	constructor(props) {
 		super(props);
 		this.state = {
 			modal: false,
+			sanksi: {},
 		};
 	}
 
-	static async getInitialProps({ query }) {
-		const { noSanksi } = query;
-		const sanksi = await getSanksi({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { query, sanksi };
-	}
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const { noSanksi } = this.props.router.query;
+		const sanksi = await getSanksi({ noSanksi, ptId: user.data.peran[0].organisasi.id });
+		this.setState({ sanksi });
+	};
 
 	toggleModal = (value = true) => {
 		if (!value) {
@@ -33,11 +36,10 @@ class JawabanKeberatan extends Component {
 	};
 
 	render() {
-		const { sanksi } = this.props;
-
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper unwrap>
-				<ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.query} />
+				<ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.router.query} />
 				<Header />
 				<div className="p-3">
 					<div className="content-heading">
@@ -54,20 +56,24 @@ class JawabanKeberatan extends Component {
 								<CardBody>
 									<Row>
 										<Col lg={12}>
-											<DetailSanksi data={sanksi.data[0]} />
-											<DetailJawaban data={sanksi.data[0]} />
-											{new Date(sanksi.data[0].sanksi.close_banding).getTime() > Date.now() ? (
+											{sanksi && sanksi.data && (
 												<>
-													<p>
-														Setelah membaca jawaban permohonan keberatan atas pengenaan sanksi, jika Perguruan Tinggi bermaksud mengajukan permohonan banding kepada atasan pemberi sanksi maka dapat menekan tombol
-														di bawah ini paling lambat {moment(sanksi.data[0].sanksi.close_banding).format("DD MMMM YYYY")}
-													</p>
-													<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data[0].sanksi.banding || false}>
-														Ajukan Banding
-													</Button>
+													<DetailSanksi data={sanksi.data[0]} />
+													<DetailJawaban data={sanksi.data[0]} />
+													{new Date(sanksi.data[0].sanksi.close_banding).getTime() > Date.now() ? (
+														<>
+															<p>
+																Setelah membaca jawaban permohonan keberatan atas pengenaan sanksi, jika Perguruan Tinggi bermaksud mengajukan permohonan banding kepada atasan pemberi sanksi maka dapat
+																menekan tombol di bawah ini paling lambat {moment(sanksi.data[0].sanksi.close_banding).format("DD MMMM YYYY")}
+															</p>
+															<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data[0].sanksi.banding || false}>
+																Ajukan Banding
+															</Button>
+														</>
+													) : (
+														<p>Pengajuan ditutup</p>
+													)}
 												</>
-											) : (
-												<p>Pengajuan ditutup</p>
 											)}
 										</Col>
 									</Row>
@@ -79,9 +85,7 @@ class JawabanKeberatan extends Component {
 						</Col>
 					</Row>
 					<Row>
-						<Col>
-							<Riwayat data={sanksi.data[0]} />
-						</Col>
+						<Col>{sanksi && sanksi.data && <Riwayat data={sanksi.data[0]} />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -89,4 +93,5 @@ class JawabanKeberatan extends Component {
 	}
 }
 
-export default JawabanKeberatan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(withRouter(JawabanKeberatan));

+ 13 - 7
pages/app/pt/jawaban-keberatan/index.js

@@ -3,29 +3,35 @@ import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col } from "reactstrap";
 import { getSanksi } from "@/actions/sanksi";
 import TableSanksi from "@/components/PT/TableSanksi";
+import { connect } from "react-redux";
 
 class JawabanKeberatan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			sanksi: {},
+		};
 	}
 
-	static getInitialProps = async () => {
-		const sanksi = await getSanksi({ keberatan: true, jawaban: true, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { sanksi };
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const org_id = user.data.peran[0].organisasi.id;
+		const sanksi = await getSanksi({ keberatan: true, jawaban: true, ptId: org_id });
+		this.setState({ sanksi });
 	};
 
 	render() {
-		const { sanksi } = this.props;
-		console.log(sanksi);
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Jawaban Atas Permohonan Keberatan</div>
 				<Row>
-					<Col lg={12}>{sanksi.data.length > 0 ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-keberatan/detail" linkName="Detail" /> : ""} </Col>
+					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/jawaban-keberatan/detail" linkName="Detail" /> : ""} </Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-export default JawabanKeberatan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(JawabanKeberatan);

+ 29 - 23
pages/app/pt/keberatan/detail.js

@@ -9,17 +9,20 @@ import ModalPermohonan from "@/components/PT/Keberatan/ModalPermohonan";
 import Link from "next/link";
 import moment from "moment";
 import { Row, Col, Card, CardBody, Button } from "reactstrap";
-
+import { connect } from "react-redux";
+import { withRouter } from "next/router";
 class Keberatan extends Component {
 	state = {
 		modal: false,
+		sanksi: {},
 	};
 
-	static async getInitialProps({ query }) {
-		const { noSanksi } = query;
-		const sanksi = await getSanksi({ noSanksi, ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { query, sanksi };
-	}
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const { noSanksi } = this.props.router.query;
+		const sanksi = await getSanksi({ noSanksi, ptId: user.data.peran[0].organisasi.id });
+		this.setState({ sanksi });
+	};
 
 	toggleModal = (value = true) => {
 		if (!value) {
@@ -30,11 +33,11 @@ class Keberatan extends Component {
 	};
 
 	render() {
-		const { sanksi } = this.props;
+		const { sanksi } = this.state;
 		console.log(sanksi);
 		return (
 			<ContentWrapper unwrap>
-				<ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.query} />
+				<ModalPermohonan toggleModal={this.toggleModal} modal={this.state.modal} query={this.props.router.query} />
 				<Header />
 				<div className="p-3">
 					<div className="content-heading">
@@ -51,19 +54,23 @@ class Keberatan extends Component {
 								<CardBody>
 									<Row>
 										<Col lg={12}>
-											<DetailSanksi data={sanksi.data[0]} />
-											{new Date(sanksi.data[0].sanksi.close_keberatan).getTime() > Date.now() ? (
+											{sanksi && sanksi.data && (
 												<>
-													<p>
-														Setelah membaca surat keputusan sanksi tersebut, jika Perguruan Tinggi bermaksud mengajukan permohonan keberatan maka dapat menekan tombol di bawah ini paling lambat{" "}
-														{moment(sanksi.data[0].sanksi.close_keberatan).format("DD MMMM YYYY")}
-													</p>
-													<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data[0].sanksi.keberatan || false}>
-														Ajukan Permohonan Keberatan
-													</Button>
+													<DetailSanksi data={sanksi.data[0]} />
+													{new Date(sanksi.data[0].sanksi.close_keberatan).getTime() > Date.now() ? (
+														<>
+															<p>
+																Setelah membaca surat keputusan sanksi tersebut, jika Perguruan Tinggi bermaksud mengajukan permohonan keberatan maka dapat menekan tombol di bawah ini paling lambat{" "}
+																{moment(sanksi.data[0].sanksi.close_keberatan).format("DD MMMM YYYY")}
+															</p>
+															<Button color="primary" onClick={this.toggleModal} disabled={sanksi.data[0].sanksi.keberatan || false}>
+																Ajukan Permohonan Keberatan
+															</Button>
+														</>
+													) : (
+														<p>Pengajuan ditutup</p>
+													)}
 												</>
-											) : (
-												<p>Pengajuan ditutup</p>
 											)}
 										</Col>
 									</Row>
@@ -75,9 +82,7 @@ class Keberatan extends Component {
 						</Col>
 					</Row>
 					<Row>
-						<Col>
-							<Riwayat data={sanksi.data[0]} />
-						</Col>
+						<Col>{sanksi && sanksi.data && <Riwayat data={sanksi.data[0]} />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -85,4 +90,5 @@ class Keberatan extends Component {
 	}
 }
 
-export default Keberatan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(withRouter(Keberatan));

+ 13 - 7
pages/app/pt/keberatan/index.js

@@ -3,28 +3,34 @@ import ContentWrapper from "@/components/Layout/ContentWrapper";
 import { Row, Col } from "reactstrap";
 import { getSanksi } from "@/actions/sanksi";
 import TableSanksi from "@/components/PT/TableSanksi";
-
+import { connect } from "react-redux";
 class Keberatan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			sanksi: {},
+		};
 	}
 
-	static getInitialProps = async () => {
-		const sanksi = await getSanksi({ ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { sanksi };
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const org_id = user.data.peran[0].organisasi.id;
+		const sanksi = await getSanksi({ ptId: org_id });
+		this.setState({ sanksi });
 	};
 
 	render() {
-		const { sanksi } = this.props;
+		const { sanksi } = this.state;
 		return (
 			<ContentWrapper>
 				<div className="content-heading">Permohonan Keberatan</div>
 				<Row>
-					<Col lg={12}>{sanksi.data.length > 0 ? <TableSanksi listData={sanksi.data} to="/app/pt/keberatan/detail" linkName="Detail" /> : ""}</Col>
+					<Col lg={12}>{sanksi.data && sanksi.data.length ? <TableSanksi listData={sanksi.data} to="/app/pt/keberatan/detail" linkName="Detail" /> : ""}</Col>
 				</Row>
 			</ContentWrapper>
 		);
 	}
 }
 
-export default Keberatan;
+const mapStateToProps = (state) => ({ user: state.user });
+export default connect(mapStateToProps)(Keberatan);

+ 18 - 13
pages/app/pt/pemantauan.js

@@ -6,31 +6,35 @@ import { getLog } from "@/actions/log";
 import { getPelaporan } from "@/actions/pelaporan";
 import { Row, Col } from "reactstrap";
 import Timeline from "@/components/PT/Timeline";
+import { getUser } from "@/actions/auth";
+import { getPT } from "@/actions/PT";
+import { connect } from "react-redux";
 
 class Pemantauan extends Component {
 	constructor(props) {
 		super(props);
+		this.state = {
+			log: [],
+			pelaporan: {},
+		};
 	}
 
-	static async getInitialProps({ query }) {
-		const log = await getLog({ ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		const pelaporan = await getPelaporan({ ptId: "0BCE4DB7-B207-445D-8D03-0C54B7688252" });
-		return { log, pelaporan };
-	}
+	componentDidMount = async () => {
+		const { user } = this.props;
+		const log = await getLog({ ptId: user.data.peran[0].organisasi.id });
+		const pelaporan = await getPelaporan({ ptId: user.data.peran[0].organisasi.id });
+		this.setState({ log, pelaporan });
+	};
 
 	render() {
-		const { log, pelaporan } = this.props;
+		const { log, pelaporan } = this.state;
 		return (
 			<ContentWrapper unwrap>
 				<Header />
 				<div className="p-3">
 					<Row>
-						<Col xl="9">
-							<Timeline data={log} dataPelaporan={pelaporan.data[0]} />
-						</Col>
-						<Col xl="3">
-							<DetailPT />
-						</Col>
+						<Col xl="9">{log && pelaporan.data && <Timeline data={log} dataPelaporan={pelaporan.data[0]} />}</Col>
+						<Col xl="3">{this.props.pt && <DetailPT data={this.props.pt[0]} />}</Col>
 					</Row>
 				</div>
 			</ContentWrapper>
@@ -38,4 +42,5 @@ class Pemantauan extends Component {
 	}
 }
 
-export default Pemantauan;
+const mapStateToProps = (state) => ({ user: state.user, pt: state.pt });
+export default connect(mapStateToProps)(Pemantauan);

+ 24 - 16
pages/login.js

@@ -1,5 +1,7 @@
 import { connect } from "react-redux";
-import { login, getUser } from "@/actions/auth";
+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";
@@ -8,6 +10,9 @@ 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 */
@@ -60,27 +65,26 @@ class Login extends Component {
 		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();
-				if (dataUser.data.peran[0].peran.id === 2) {
+				// 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" });
 				}
 			}
-
-			// let user = dataUser.filter((e) => e.username === username && e.password === password);
-			// if (user.length) {
-			// 	user = user[0];
-
-			// 	sessionStorage.setItem("user", JSON.stringify(user));
-			// 	if (JSON.parse(sessionStorage.getItem("user")).peran[0].peran.id === 2) {
-			// 		Router.push({ pathname: "/app/pt/pemantauan" });
-			// 	} else {
-			// 		Router.push({ pathname: "/app/pemantauan" });
-			// 	}
-			// }
-			// this.dispatch(login(username, password));
 		}
 		// e.preventDefault();
 	};
@@ -130,5 +134,9 @@ class Login extends Component {
 }
 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)(Login);
+export default connect(mapStateToProps, mapDispatchToProps)(Login);

+ 8 - 0
store/reducers/pt.reducer.js

@@ -0,0 +1,8 @@
+export const ptReducer = (state = { data: {} }, action) => {
+	switch (action.type) {
+		case "SET_PT":
+			return (state = action.payload);
+		default:
+			return state;
+	}
+};

+ 2 - 0
store/reducers/reducers.js

@@ -6,6 +6,7 @@ import isLoggedReducer from "./isLogged.reducer.js";
 import { pelaporanListReducer, pelaporanCreateReducer } from "./pelaporan.reducers.js";
 import { penjadwalanCreateReducer } from "./penjadwalan.reducers.js";
 import { userReducer } from "./user.reducer";
+import { ptReducer } from "./pt.reducer";
 
 export default combineReducers({
 	settings: settingsReducer,
@@ -15,4 +16,5 @@ export default combineReducers({
 	pelaporanCreate: pelaporanCreateReducer,
 	penjadwalanAdd: penjadwalanCreateReducer,
 	user: userReducer,
+	pt: ptReducer,
 });

+ 3 - 5
store/reducers/user.reducer.js

@@ -1,11 +1,9 @@
 import { LOGIN_SUCCESS, LOGIN_FAIL } from "../actions/user";
 
-export const userReducer = (state = {}, action) => {
+export const userReducer = (state = { data: {} }, action) => {
 	switch (action.type) {
-		case LOGIN_SUCCESS:
-			return { isLogin: true, data: action.payload };
-		case LOGIN_FAIL:
-			return { isLogin: false, data: {} };
+		case "SET_USER":
+			return { data: action.payload };
 		default:
 			return state;
 	}