cdn-frontend/src/components/App.js

83 lines
1.9 KiB
JavaScript

import React, { useEffect } from "react";
import { HashRouter, Route, Switch, Redirect } from "react-router-dom";
import ToastContainer from "./Toast/ToastContainer";
// components
import Layout from "./Layout/Layout";
// pages
import Error from "../pages/error";
import Login from "../pages/login";
// context
import { useUserState } from "../context/UserContext";
import { useTranslation } from "react-i18next";
export default function App() {
var { authenticated, messageCode } = useUserState();
const { t } = useTranslation();
useEffect(() => {
if (!messageCode) return;
alert(t(messageCode));
}, [messageCode, t]);
return (
<HashRouter basename={process.env.PUBLIC_URL || ""}>
<Switch>
<Route exact path="/" render={() => <Redirect to="/app/dashboard" />} />
<Route
exact
path="/app"
render={() => <Redirect to="/app/dashboard" />}
/>
<PrivateRoute path="/app" component={Layout} />
<PublicRoute path="/login" component={Login} />
<Route component={Error} />
</Switch>
<ToastContainer />
</HashRouter>
);
function PrivateRoute({ component, ...rest }) {
return (
<Route
{...rest}
render={(props) =>
authenticated ? (
React.createElement(component, props)
) : (
<Redirect
to={{
pathname: "/login",
state: {
from: props.location
}
}}
/>
)
}
/>
);
}
function PublicRoute({ component, ...rest }) {
return (
<Route
{...rest}
render={(props) =>
authenticated ? (
<Redirect
to={{
pathname: "/"
}}
/>
) : (
React.createElement(component, props)
)
}
/>
);
}
}