front: basic routing
- create some components - update a bit of npm packages
This commit is contained in:
parent
992a1f3a23
commit
03b983aafd
4385
webapp/package-lock.json
generated
4385
webapp/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -3,13 +3,15 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@testing-library/jest-dom": "^5.17.0",
|
"@testing-library/jest-dom": "^6.1.3",
|
||||||
"@testing-library/react": "^13.4.0",
|
"@testing-library/react": "^14.0.0",
|
||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^14.5.1",
|
||||||
|
"fsevents": "^2.3.3",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-scripts": "5.0.1",
|
"react-router-dom": "^6.16.0",
|
||||||
"web-vitals": "^2.1.4"
|
"react-scripts": "^5.0.1",
|
||||||
|
"web-vitals": "^3.5.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
|
@ -2,15 +2,8 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.App-logo {
|
.Container {
|
||||||
height: 40vmin;
|
text-align: center;
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion: no-preference) {
|
|
||||||
.App-logo {
|
|
||||||
animation: App-logo-spin infinite 20s linear;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.App-header {
|
.App-header {
|
||||||
@ -28,11 +21,3 @@
|
|||||||
color: #61dafb;
|
color: #61dafb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes App-logo-spin {
|
|
||||||
from {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,29 +1,27 @@
|
|||||||
import './App.css';
|
import './App.css';
|
||||||
import Leaderboard from "./Leaderboard";
|
import Leaderboard from "./Leaderboard";
|
||||||
import React, { useState, useEffect } from 'react';
|
import React from 'react';
|
||||||
|
import {
|
||||||
|
BrowserRouter,
|
||||||
|
Routes, //replaces "Switch" used till v5
|
||||||
|
Route,
|
||||||
|
} from "react-router-dom";
|
||||||
|
import Header from "./Header"
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
const [data, setData] = useState(null);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetch('/api/leaderboard')
|
|
||||||
.then((response) => response.json())
|
|
||||||
.then((data) => {
|
|
||||||
setData(data);
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.log(err.message);
|
|
||||||
});
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className="App">
|
||||||
<header className="App-header">
|
<BrowserRouter>
|
||||||
<h1>Leaderboard</h1>
|
<Header/>
|
||||||
{
|
|
||||||
data ? <Leaderboard hashmap={data} /> : <span>Loading...</span>
|
<div className="Container">
|
||||||
}
|
<Routes>
|
||||||
</header>
|
<Route path="/leaderboard" element={<Leaderboard/>} />
|
||||||
|
</Routes>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</BrowserRouter>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
15
webapp/src/Header.js
Normal file
15
webapp/src/Header.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import { Link } from "react-router-dom";
|
||||||
|
|
||||||
|
export default function Header() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<h1>CordaCheckers</h1>
|
||||||
|
<nav>
|
||||||
|
<Link to="/leaderboard">Leaderboard</Link> {"| "}
|
||||||
|
<Link to="/gameproposal">Game Proposal</Link> {"| "}
|
||||||
|
<Link to="/game">Games</Link> {"| "}
|
||||||
|
<Link to="about">About</Link>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
@ -1,5 +1,4 @@
|
|||||||
import React from "react";
|
import React, { useState, useEffect } from 'react';
|
||||||
|
|
||||||
//const Leaderboard = ({hashmap}) => {
|
//const Leaderboard = ({hashmap}) => {
|
||||||
|
|
||||||
// var listItems = Object.keys(hashmap).map(playerName => {
|
// var listItems = Object.keys(hashmap).map(playerName => {
|
||||||
@ -12,20 +11,38 @@ import React from "react";
|
|||||||
|
|
||||||
// return <ul>{listItems}</ul>;
|
// return <ul>{listItems}</ul>;
|
||||||
|
|
||||||
const Leaderboard = ({ hashmap }) => {
|
const Leaderboard = () => {
|
||||||
|
|
||||||
const tableRows = Object.keys(hashmap).map(playerName => {
|
const [data, setData] = useState(null);
|
||||||
var rank = hashmap[playerName];
|
|
||||||
|
|
||||||
return <tr key={playerName}>
|
useEffect(() => {
|
||||||
<td>{playerName}</td>
|
fetch('/api/leaderboard')
|
||||||
<td>{rank.gamesPlayed}</td>
|
.then((response) => response.json())
|
||||||
<td>{rank.gamesWon}</td>
|
.then((data) => {
|
||||||
<td>{rank.gamesDraw}</td>
|
setData(data);
|
||||||
</tr>
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err.message);
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
if (data == null)
|
||||||
|
return <span>Loading...</span>
|
||||||
|
|
||||||
|
const tableRows = Object.keys(data).map(playerName => {
|
||||||
|
var rank = data[playerName];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<tr key={playerName}>
|
||||||
|
<td>{playerName}</td>
|
||||||
|
<td>{rank.gamesPlayed}</td>
|
||||||
|
<td>{rank.gamesWon}</td>
|
||||||
|
<td>{rank.gamesDraw}</td>
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
return <div>
|
return (
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -39,7 +56,7 @@ const Leaderboard = ({ hashmap }) => {
|
|||||||
{ tableRows }
|
{ tableRows }
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user