2023-08-13 15:31:47 +02:00
|
|
|
import './App.css';
|
2023-10-14 10:01:20 +02:00
|
|
|
import React, { useState, useEffect, useCallback } from 'react';
|
2023-10-11 13:16:27 +02:00
|
|
|
import {
|
|
|
|
BrowserRouter,
|
2023-10-14 10:43:44 +02:00
|
|
|
Routes,
|
2023-10-11 13:16:27 +02:00
|
|
|
Route,
|
|
|
|
} from "react-router-dom";
|
2023-10-14 10:01:20 +02:00
|
|
|
|
2023-10-11 13:16:27 +02:00
|
|
|
import Header from "./Header"
|
2023-10-14 10:01:20 +02:00
|
|
|
import Leaderboard from "./Leaderboard";
|
|
|
|
import GameProposal from "./GameProposal";
|
|
|
|
|
|
|
|
function App() {
|
|
|
|
const [games, setGames] = useState(null);
|
|
|
|
const [polling, setPolling] = useState(false);
|
|
|
|
|
2023-10-14 10:43:44 +02:00
|
|
|
const pollGames = useCallback(() => {
|
|
|
|
if (polling)
|
2023-10-14 10:01:20 +02:00
|
|
|
return;
|
|
|
|
|
|
|
|
setPolling(true);
|
|
|
|
fetch('/api/gamestate')
|
|
|
|
.then(response => response.json())
|
|
|
|
.then(data => {
|
|
|
|
setGames(data);
|
|
|
|
setPolling(false);
|
|
|
|
})
|
|
|
|
.catch(err => console.log(err.message));
|
|
|
|
}, [polling]);
|
2023-08-13 15:31:47 +02:00
|
|
|
|
2023-10-14 10:01:20 +02:00
|
|
|
useEffect(() => {
|
2023-10-14 10:43:44 +02:00
|
|
|
const timer = setInterval(pollGames(), 35 * 1000); // <<-- poll new gamestates every 35 sec
|
2023-10-14 10:01:20 +02:00
|
|
|
return clearInterval(timer);
|
|
|
|
}, [pollGames])
|
2023-08-13 15:31:47 +02:00
|
|
|
|
2023-10-14 10:43:44 +02:00
|
|
|
return <div className="App">
|
|
|
|
<BrowserRouter>
|
|
|
|
<Header/>
|
|
|
|
<div className="Container">
|
|
|
|
<Routes>
|
|
|
|
<Route path="/leaderboard" element={<Leaderboard/>} />
|
|
|
|
<Route path="/gameproposal" element={<GameProposal games={games}/>} />
|
|
|
|
</Routes>
|
|
|
|
</div>
|
|
|
|
</BrowserRouter>
|
2023-08-13 15:31:47 +02:00
|
|
|
</div>
|
|
|
|
}
|
|
|
|
|
|
|
|
export default App;
|