import axios from 'axios';
-import React, { useEffect } from 'react';
-import { BrowserRouter, Route, Routes } from 'react-router-dom';
+import React, { useEffect, useState } from 'react';
+import { Helmet } from 'react-helmet';
+import { useTranslation } from 'react-i18next';
+import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom';
+import Footer from './common/Footer';
+import Header from './common/Header';
+import AlttpSeed from './pages/AlttpSeed';
import Front from './pages/Front';
+import Map from './pages/Map';
+import Technique from './pages/Technique';
+import Techniques from './pages/Techniques';
+import Tournament from './pages/Tournament';
+import User from './pages/User';
+import AlttpBaseRomProvider from '../helpers/AlttpBaseRomContext';
+import UserContext from '../helpers/UserContext';
const App = () => {
+ const [user, setUser] = useState(null);
+
+ const { t } = useTranslation();
+
+ const checkAuth = async () => {
+ try {
+ const response = await axios.get('/api/user');
+ setUser(response.data);
+ } catch (e) {
+ setUser(null);
+ }
+ };
+
+ const doLogout = async () => {
+ await axios.post('/logout');
+ await checkAuth();
+ };
+
+ useEffect(() => {
+ let timer = null;
+ axios
+ .get('/sanctum/csrf-cookie')
+ .then(() => {
+ checkAuth();
+ timer = setInterval(checkAuth, 15 * 60 * 1000);
+ });
+ return () => {
+ if (timer) clearInterval(timer);
+ };
+ }, []);
+
useEffect(() => {
- axios.get('/sanctum/csrf-cookie');
+ window.Echo.channel('App.Control')
+ .listen('PleaseRefresh', () => {
+ location.reload();
+ });
+ return () => {
+ window.Echo.leave('App.Control');
+ };
}, []);
return <BrowserRouter>
- <Routes>
- <Route path="*" element={<Front />} />
- </Routes>
+ <AlttpBaseRomProvider>
+ <UserContext.Provider value={user}>
+ <Helmet>
+ <title>{t('general.appName')}</title>
+ <meta name="description" content={t('general.appDescription')} />
+ </Helmet>
+ <Header doLogout={doLogout} />
+ <Routes>
+ <Route path="h/:hash" element={<AlttpSeed />} />
+ <Route path="map" element={<Map />} />
+ <Route
+ path="modes"
+ element={<Techniques namespace="modes" type="mode" />}
+ />
+ <Route
+ path="modes/:name"
+ element={<Technique namespace="modes" type="mode" />}
+ />
+ <Route
+ path="rulesets"
+ element={<Techniques namespace="rulesets" type="ruleset" />}
+ />
+ <Route
+ path="rulesets/:name"
+ element={<Technique namespace="rulesets" type="ruleset" />}
+ />
+ <Route
+ path="tech"
+ element={<Techniques namespace="techniques" type="tech" />}
+ />
+ <Route
+ path="tech/:name"
+ element={<Technique namespace="techniques" type="tech" />}
+ />
+ <Route path="tournaments/:id" element={<Tournament />} />
+ <Route path="users/:id" element={<User />} />
+ <Route path="/" element={<Front />} />
+ <Route path="*" element={<Navigate to="/" />} />
+ </Routes>
+ <Footer />
+ </UserContext.Provider>
+ </AlttpBaseRomProvider>
</BrowserRouter>;
};