69 lines
1.4 KiB
TypeScript
69 lines
1.4 KiB
TypeScript
import React from "react";
|
|
import "./App.css";
|
|
import Main from "./components/Main";
|
|
import { Redirect, Route, RouteProps, Switch } from "react-router-dom";
|
|
import SignIn from "./components/SignIn";
|
|
import SignUp from "./components/SignUp";
|
|
import { getJsonWebToken, isLoggedIn } from "./jwt/jwt";
|
|
|
|
function PrivateRoute({ children, ...rest }: RouteProps) {
|
|
return (
|
|
<Route
|
|
{...rest}
|
|
render={({ location }) =>
|
|
isLoggedIn() ? (
|
|
children
|
|
) : (
|
|
<Redirect
|
|
to={{
|
|
pathname: "/login",
|
|
state: { from: location },
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function NotLoggedInOnlyRoute({ children, ...rest }: RouteProps) {
|
|
return (
|
|
<Route
|
|
{...rest}
|
|
render={() =>
|
|
!isLoggedIn() ? (
|
|
children
|
|
) : (
|
|
<Redirect
|
|
to={{
|
|
pathname: "/",
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function App(): React.ReactElement {
|
|
const jwt = getJsonWebToken();
|
|
|
|
return (
|
|
<Switch>
|
|
<NotLoggedInOnlyRoute path={"/login"}>
|
|
<SignIn />
|
|
</NotLoggedInOnlyRoute>
|
|
<NotLoggedInOnlyRoute path={"/signup"}>
|
|
<SignUp />
|
|
</NotLoggedInOnlyRoute>
|
|
<PrivateRoute>
|
|
{jwt && (
|
|
<Main userRole={jwt.role} loggedInUserRowId={jwt.person_row_id} />
|
|
)}
|
|
</PrivateRoute>
|
|
</Switch>
|
|
);
|
|
}
|
|
|
|
export default App;
|