Newer
Older
import React from "react";
import { BrowserRouter, Switch, Route } from "react-router-dom";
import MemberList from "./MemberList";
import ProductList from "./ProductList";
import Dashboard from "./Dashboard";
import Purchase from "./purchase/Purchase";
import Topup from "./Topup";
import ShowTransaction from "./ShowTransaction";
import ShowOrder from "./order/ShowOrder";
import CreateOrder from "./order/CreateOrder";
import AuthContext from "./AuthContext";
import SignIn from "./SignIn";
import ResetRequest from "./ResetRequest";
import ResetPassword from "./ResetPassword";
return (
<div>
<BrowserRouter>
<Head onLogout={props.onLogout} />
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<Switch>
<Route path="/members/add">
<MemberAdder />
</Route>
<Route path="/members/purchase">
<Purchase member />
</Route>
<Route path="/members">
<MemberList />
</Route>
<Route path="/products">
<ProductList />
</Route>
<Route path="/transaction/:id">
<ShowTransaction />
</Route>
<Route path="/password">
<OwnPassword />
</Route>
<Route path="/purchase">
<Purchase />
</Route>
<Route path="/topup">
<Topup />
</Route>
<Route path="/order/create">
<CreateOrder />
</Route>
<Route path="/order/:id" component={ShowOrder} />
<Route path="/">
<Dashboard />
</Route>
</Switch>
</Container>
function UnlogedPanel(props) {
return (
<Container>
<Row className="justify-content-center">
<img src={logo} alt="Garbanzo Negro" />
</Row>
<BrowserRouter>
<Switch>
<Route path="/reset/:token" component={ResetPassword} />
<Route path="/nreset/:token">
<ResetPassword login />
</Route>
<Route path="/reset/" component={ResetRequest} />
<Route path="/">
<SignIn onLogin={props.onLogin} />
</Route>
</Switch>
</BrowserRouter>
</Container>
);
}
const base64Url = token.split(".")[1];
const base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
const jsonPayload = decodeURIComponent(
atob(base64)
.split("")
.map(function (c) {
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
})
.join("")
);
constructor(props) {
super(props);
this.state = {
num: null,
role: null,
token: null,
};
this.logout = this.logout.bind(this);
this.login = this.login.bind(this);
}
componentDidMount() {
const token = localStorage.getItem("token");
if (token) {
const num = localStorage.getItem("num");
const role = localStorage.getItem("role");
this.setState({ num, role, token });
if (getClaims(token)["exp"] !== undefined) {
this.timerID = setInterval(
() => this.renewToken(),
60000 // every minute
);
}
componentWillUnmount() {
if (this.timeID) {
clearInterval(this.timerID);
storeState(token, num, role) {
localStorage.setItem("token", token);
localStorage.setItem("num", num);
localStorage.setItem("role", role);
}
login(token, member) {
this.setState({
num: member.num,
role: member.role,
token: token,
});
this.storeState(token, member.num, member.role);
if (getClaims(token)["exp"] !== undefined) {
this.timerID = setInterval(
() => this.renewToken(),
60000 // every minute
);
logout() {
if (this.timeID) {
clearInterval(this.timerID);
this.setState({
num: null,
role: null,
token: null,
});
this.storeState("", "", "");
}
const claims = getClaims(this.state.token);
if (claims["exp"] === undefined) {
return true;
}
return claims["exp"] > Date.now() / 1000;
}
renewToken() {
fetch("/api/token", { headers: { "x-authentication": this.state.token } })
.then((response) => {
if (!response.ok) {
throw new Error(
response.status.toString() + " " + response.statusText
);
return response.json();
})
.then((data) => {
const token = data.token;
this.setState({ token });
localStorage.setItem("token", token);
})
.catch((error) => {
console.log("Error renewing token: " + error.message);
});
}
} else {
component = <Panel onLogout={this.logout} />;
return (
<AuthContext.Provider value={this.state}>
{component}
</AuthContext.Provider>
);
}