]> Untitled Git - lemmy-ui.git/blob - src/shared/components/app/app.tsx
be0319dbce5f9f7db92f24ed88873a60f8364143
[lemmy-ui.git] / src / shared / components / app / app.tsx
1 import { isAuthPath, setIsoData } from "@utils/app";
2 import { Component, RefObject, createRef, linkEvent } from "inferno";
3 import { Provider } from "inferno-i18next-dess";
4 import { Route, Switch } from "inferno-router";
5 import { IsoDataOptionalSite } from "../../interfaces";
6 import { routes } from "../../routes";
7 import { FirstLoadService, I18NextService } from "../../services";
8 import AuthGuard from "../common/auth-guard";
9 import ErrorGuard from "../common/error-guard";
10 import { ErrorPage } from "./error-page";
11 import { Footer } from "./footer";
12 import { Navbar } from "./navbar";
13 import "./styles.scss";
14 import { Theme } from "./theme";
15
16 export class App extends Component<any, any> {
17   private isoData: IsoDataOptionalSite = setIsoData(this.context);
18   private readonly mainContentRef: RefObject<HTMLElement>;
19   constructor(props: any, context: any) {
20     super(props, context);
21     this.mainContentRef = createRef();
22   }
23
24   handleJumpToContent(event) {
25     event.preventDefault();
26     this.mainContentRef.current?.focus();
27   }
28   render() {
29     const siteRes = this.isoData.site_res;
30     const siteView = siteRes?.site_view;
31
32     return (
33       <>
34         <Provider i18next={I18NextService.i18n}>
35           <div id="app" className="lemmy-site">
36             <button
37               type="button"
38               className="btn skip-link bg-light position-absolute start-0 z-3"
39               onClick={linkEvent(this, this.handleJumpToContent)}
40             >
41               {I18NextService.i18n.t("jump_to_content", "Jump to content")}
42             </button>
43             {siteView && (
44               <Theme defaultTheme={siteView.local_site.default_theme} />
45             )}
46             <Navbar siteRes={siteRes} />
47             <div className="mt-4 p-0 fl-1">
48               <Switch>
49                 {routes.map(
50                   ({ path, component: RouteComponent, fetchInitialData }) => (
51                     <Route
52                       key={path}
53                       path={path}
54                       exact
55                       component={routeProps => {
56                         if (!fetchInitialData) {
57                           FirstLoadService.falsify();
58                         }
59
60                         return (
61                           <ErrorGuard>
62                             <div tabIndex={-1}>
63                               {RouteComponent &&
64                                 (isAuthPath(path ?? "") ? (
65                                   <AuthGuard>
66                                     <RouteComponent {...routeProps} />
67                                   </AuthGuard>
68                                 ) : (
69                                   <RouteComponent {...routeProps} />
70                                 ))}
71                             </div>
72                           </ErrorGuard>
73                         );
74                       }}
75                     />
76                   )
77                 )}
78                 <Route component={ErrorPage} />
79               </Switch>
80             </div>
81             <Footer site={siteRes} />
82           </div>
83         </Provider>
84       </>
85     );
86   }
87 }