]> git.localhorst.tv Git - alttp.git/blob - resources/js/components/app/index.js
add simple doors tracker
[alttp.git] / resources / js / components / app / index.js
1 import axios from 'axios';
2 import React, { useEffect, useState } from 'react';
3 import { Helmet } from 'react-helmet';
4 import { useTranslation } from 'react-i18next';
5 import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';
6
7 import FullLayout from './FullLayout';
8 import AlttpSeed from '../pages/AlttpSeed';
9 import DoorsTracker from '../pages/DoorsTracker';
10 import Front from '../pages/Front';
11 import Map from '../pages/Map';
12 import Schedule from '../pages/Schedule';
13 import Technique from '../pages/Technique';
14 import Techniques from '../pages/Techniques';
15 import Tournament from '../pages/Tournament';
16 import User from '../pages/User';
17 import AlttpBaseRomProvider from '../../helpers/AlttpBaseRomContext';
18 import UserContext from '../../helpers/UserContext';
19 import i18n from '../../i18n';
20
21 const App = () => {
22         const [user, setUser] = useState(null);
23
24         const { t } = useTranslation();
25
26         const checkAuth = async () => {
27                 try {
28                         const response = await axios.get('/api/user');
29                         setUser(response.data);
30                 } catch (e) {
31                         setUser(null);
32                 }
33         };
34
35         const doLogout = async () => {
36                 await axios.post('/logout');
37                 await checkAuth();
38         };
39
40         useEffect(() => {
41                 let timer = null;
42                 axios
43                         .get('/sanctum/csrf-cookie')
44                         .then(() => {
45                                 checkAuth();
46                                 timer = setInterval(checkAuth, 15 * 60 * 1000);
47                         });
48                 return () => {
49                         if (timer) clearInterval(timer);
50                 };
51         }, []);
52
53         useEffect(() => {
54                 window.Echo.channel('App.Control')
55                         .listen('PleaseRefresh', () => {
56                                 location.reload();
57                         });
58                 return () => {
59                         window.Echo.leave('App.Control');
60                 };
61         }, []);
62
63         return <BrowserRouter>
64                 <AlttpBaseRomProvider>
65                         <UserContext.Provider value={user}>
66                                 <Helmet>
67                                         <html lang={i18n.language} />
68                                         <title>{t('general.appName')}</title>
69                                         <meta name="description" content={t('general.appDescription')} />
70                                 </Helmet>
71                                 <Routes>
72                                         <Route element={<FullLayout doLogout={doLogout} />}>
73                                                 <Route
74                                                         path="dungeons"
75                                                         element={<Techniques namespace="dungeons" type="dungeon" />}
76                                                 />
77                                                 <Route
78                                                         path="dungeons/:name"
79                                                         element={<Technique namespace="dungeons" type="dungeon" />}
80                                                 />
81                                                 <Route path="h/:hash" element={<AlttpSeed />} />
82                                                 <Route
83                                                         path="locations"
84                                                         element={<Techniques namespace="locations" type="location" />}
85                                                 />
86                                                 <Route
87                                                         path="locations/:name"
88                                                         element={<Technique namespace="locations" type="location" />}
89                                                 />
90                                                 <Route path="map" element={<Map />} />
91                                                 <Route
92                                                         path="modes"
93                                                         element={<Techniques namespace="modes" type="mode" />}
94                                                 />
95                                                 <Route
96                                                         path="modes/:name"
97                                                         element={<Technique namespace="modes" type="mode" />}
98                                                 />
99                                                 <Route
100                                                         path="rulesets"
101                                                         element={<Techniques namespace="rulesets" type="ruleset" />}
102                                                         />
103                                                 <Route
104                                                         path="rulesets/:name"
105                                                         element={<Technique namespace="rulesets" type="ruleset" />}
106                                                 />
107                                                 <Route path="schedule" element={<Schedule />} />
108                                                 <Route
109                                                         path="tech"
110                                                         element={<Techniques namespace="techniques" type="tech" />}
111                                                 />
112                                                 <Route
113                                                         path="tech/:name"
114                                                         element={<Technique namespace="techniques" type="tech" />}
115                                                 />
116                                                 <Route path="tournaments/:id" element={<Tournament />} />
117                                                 <Route path="users/:id" element={<User />} />
118                                                 <Route path="/" element={<Front />} />
119                                                 <Route path="*" element={<Navigate to="/" />} />
120                                         </Route>
121                                         <Route
122                                                 path="doors-tracker"
123                                                 element={<DoorsTracker />}
124                                         />
125                                 </Routes>
126                         </UserContext.Provider>
127                 </AlttpBaseRomProvider>
128         </BrowserRouter>;
129 };
130
131 export default App;