aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp/src/app/App.tsx
blob: b68eddb6db83c2276b996beb79d66ed3eb4dd296 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { hot } from "react-hot-loader/root";

import AppBar from "./views/common/AppBar";
import LoadingPage from "./views/common/LoadingPage";
import Home from "./views/home";
import Login from "./views/login";
import Settings from "./views/settings";
import About from "./views/about";
import User from "./views/user";
import TimelinePage from "./views/timeline";
import AlertHost from "./views/common/alert/AlertHost";

import { dataStorage } from "./services/common";
import { userService, useRawUser } from "./services/user";

const NoMatch: React.FC = () => {
  return (
    <>
      <AppBar />
      <div style={{ height: 56 }} />
      <div>Ah-oh, 404!</div>
    </>
  );
};

const LazyAdmin = React.lazy(
  () => import(/* webpackChunkName: "admin" */ "./views/admin/Admin")
);

const App: React.FC = () => {
  const [loading, setLoading] = React.useState<boolean>(true);

  const user = useRawUser();

  React.useEffect(() => {
    void userService.checkLoginState();
    void dataStorage.ready().then(() => setLoading(false));
  }, []);

  if (user === undefined || loading) {
    return <LoadingPage />;
  } else {
    return (
      <React.Suspense fallback={<LoadingPage />}>
        <Router>
          <AppBar />
          <Switch>
            <Route exact path="/">
              <Home />
            </Route>
            <Route exact path="/login">
              <Login />
            </Route>
            <Route path="/settings">
              <Settings />
            </Route>
            <Route path="/about">
              <About />
            </Route>
            <Route path="/timelines/:name">
              <TimelinePage />
            </Route>
            <Route path="/users/:username">
              <User />
            </Route>
            {user && user.administrator && (
              <Route path="/admin">
                <LazyAdmin user={user} />
              </Route>
            )}
            <Route>
              <NoMatch />
            </Route>
          </Switch>
          <AlertHost />
        </Router>
      </React.Suspense>
    );
  }
};

export default hot(App);