diff --git a/backend/src/main/java/djmil/cordacheckers/api/GameStateController.java b/backend/src/main/java/djmil/cordacheckers/api/GameStateController.java
index a128272..4b2432b 100644
--- a/backend/src/main/java/djmil/cordacheckers/api/GameStateController.java
+++ b/backend/src/main/java/djmil/cordacheckers/api/GameStateController.java
@@ -16,7 +16,7 @@ import djmil.cordacheckers.user.User;
@RestController
-@RequestMapping("api/gamestate")
+@RequestMapping("api/games")
public class GameStateController {
@Autowired
diff --git a/webapp/src/App.css b/webapp/src/App.css
index 4931613..88346b6 100644
--- a/webapp/src/App.css
+++ b/webapp/src/App.css
@@ -1,3 +1,8 @@
-.App {
- text-align: center;
+[data-darkreader-scheme="dark"] .Header a {
+ color: darkslategrey;
}
+
+[data-darkreader-scheme="dark"] .Header .active {
+ color: white;
+ box-shadow: 0 1.5px 0 0 currentcolor;
+}
\ No newline at end of file
diff --git a/webapp/src/App.js b/webapp/src/App.js
index 80f2778..a96c5c1 100644
--- a/webapp/src/App.js
+++ b/webapp/src/App.js
@@ -1,46 +1,41 @@
import './App.css';
import React from 'react';
-import { BrowserRouter, Routes, Route } from "react-router-dom";
+import { BrowserRouter, Routes, Route } from 'react-router-dom';
-import Header from "./container/Header"
-import Leaderboard from "./container/Leaderboard"
-import Game from "./components/Game"
+import Header from './container/Header';
import About from "./components/About"
+import Games from './container/Games';
+import Leaderboard from './container/Leaderboard';
-import usePollingReducer from './reducer/polling';
import useUserReducer from './reducer/user';
+import usePollingReducer from './reducer/polling';
import useLeaderboardReducer from './reducer/leaderboard';
+import useGamesReducer from './reducer/games';
-import useLeaderboardApi from './api/leaderboard';
import useUserApi from './api/user';
+import useLeaderboardApi from './api/leaderboard';
+import useGamesApi from './api/games';
function App() {
- const pollingReducer = usePollingReducer();
const userReducer = useUserReducer();
+ const pollingReducer = usePollingReducer();
const leaderboardReducer = useLeaderboardReducer();
-
- const leaderboardApi = useLeaderboardApi(leaderboardReducer);
- const userApi = useUserApi(userReducer);
-
- const leaderboard = leaderboardApi.get(pollingReducer);
- const user = userApi.get();
+ const gamesReducer = useGamesReducer();
+
+ const user = useUserApi(userReducer).get();
+ const leaderboard = useLeaderboardApi(leaderboardReducer).poll(pollingReducer);
+ /*const gamesApi = */ useGamesApi(gamesReducer).list(pollingReducer);
return (
-
-
-
-
- {/* https://stackoverflow.com/questions/40541994/multiple-path-names-for-a-same-component-in-react-router */}
- } />
- } />
- } />
- } />
- } />
- } />
- } />
-
-
-
+
+
+
+ } />
+ } />
+ } />
+ } />
+
+
)
}
diff --git a/webapp/src/api/games.js b/webapp/src/api/games.js
new file mode 100644
index 0000000..aefbdbb
--- /dev/null
+++ b/webapp/src/api/games.js
@@ -0,0 +1,31 @@
+import usePolling from "../util/Polling"
+
+const uri = '/api/games';
+
+export default function useGamesApi(gamesReducer) {
+ const [games, dispatchGames] = gamesReducer;
+
+ const useList = (pollingReducer) => {
+ const [polling, dispatchPolling] = pollingReducer;
+
+ const mode = (polling.enabled === true)
+ ? { interval_sec: 30 } // update games list half a minue
+ : { interval_stop: true } // user has fliped OfflineToggel
+
+ const [list, isFetching] = usePolling(uri, mode);
+
+ if (polling.games !== isFetching) {
+ dispatchPolling({ type: 'next', games: isFetching });
+ }
+
+ if (games.list !== list) {
+ dispatchGames({ type: 'next', list });
+ }
+
+ return games;
+ }
+
+ return {
+ list: useList
+ }
+}
\ No newline at end of file
diff --git a/webapp/src/api/leaderboard.js b/webapp/src/api/leaderboard.js
index 1b7ca18..f5d01f9 100644
--- a/webapp/src/api/leaderboard.js
+++ b/webapp/src/api/leaderboard.js
@@ -5,7 +5,7 @@ const uri = '/api/leaderboard';
export default function useLeaderboardApi(leaderboardReducer) {
const [leaderboard, dispatchLeaderboaed] = leaderboardReducer;
- const useGet = (pollingReducer) => {
+ const usePoll = (pollingReducer) => {
const [polling, dispatchPolling] = pollingReducer;
const mode = (polling.enabled === true)
@@ -26,6 +26,6 @@ export default function useLeaderboardApi(leaderboardReducer) {
}
return {
- get: useGet
+ poll: usePoll
}
}
\ No newline at end of file
diff --git a/webapp/src/components/Game/GameBoard/Board.css b/webapp/src/components/Checkers.css
similarity index 64%
rename from webapp/src/components/Game/GameBoard/Board.css
rename to webapp/src/components/Checkers.css
index 6e9cc05..069b28e 100644
--- a/webapp/src/components/Game/GameBoard/Board.css
+++ b/webapp/src/components/Checkers.css
@@ -1,4 +1,15 @@
-.board {
+.Stone {
+ cursor: default; /* disable 'I beam' cursor change */
+}
+
+.Player {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+}
+
+.Board {
display: flex;
flex-direction: column;
justify-content: center;
@@ -6,7 +17,7 @@
/* scale: 15%; */
}
-.tile {
+.Tile {
border: 1px solid #e4e4e4;
float: left;
font-size: 200%;
@@ -20,14 +31,14 @@
text-align: center;
}
-.tile.black {
+.Tile.black {
background: lightgray;
}
-.tile.white:hover {
+.Tile.white:hover {
background-color:azure;
}
-.stone {
+.Tile .Stone {
font-size: 120%;
}
\ No newline at end of file
diff --git a/webapp/src/components/Checkers.jsx b/webapp/src/components/Checkers.jsx
new file mode 100644
index 0000000..7f7f220
--- /dev/null
+++ b/webapp/src/components/Checkers.jsx
@@ -0,0 +1,130 @@
+import './Checkers.css'
+import React from 'react'
+
+export const Color = {
+ white: "WHITE",
+ black: "BLACK",
+
+ opposite: (color) => {
+ if (color === Color.white)
+ return Color.black;
+ if (color === Color.black)
+ return Color.white;
+
+ return color;
+ }
+};
+
+/*
+ * Stone
+ */
+export function Stone({ color }) {
+ switch (color) {
+ case Color.white:
+ return WhiteStone();
+
+ case Color.black:
+ return BlackStone();
+
+ default:
+ console.warn("Unknown color: ", color)
+ }
+}
+
+export function WhiteStone() {
+ return ⛀
+}
+
+export function BlackStone() {
+ return ⛂
+}
+
+/*
+ * Player
+ */
+export function Player({ color, name }) {
+ return (
+
+
+ {name}
+
+ )
+}
+
+/*
+ * Board
+ */
+export function Board() {
+
+ return
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+function WhiteTile({ id, stone }) {
+
+ return (
+ handleClick(id)}
+ >
+ {stone}
+
+ );
+}
+
+function BlackTile() {
+ return
+}
+
+function handleClick(i) {
+ console.log("click", i)
+}
\ No newline at end of file
diff --git a/webapp/src/components/Game.css b/webapp/src/components/Game.css
deleted file mode 100644
index e15501b..0000000
--- a/webapp/src/components/Game.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.game {
- width: 100%;
- float: left;
-}
-
-.game .left-side {
- float: left;
- width: 45%;
- /* max-width: 400px; */
-
- /* height: 100px; */
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
-
-.game .right-side {
- float: left;
- width: 55%;
-
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
\ No newline at end of file
diff --git a/webapp/src/components/Game.jsx b/webapp/src/components/Game.jsx
deleted file mode 100644
index e4d49c1..0000000
--- a/webapp/src/components/Game.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import './Game.css';
-import React from 'react';
-import GameView from './Game/GameView'
-import GameSelector from './Game/GameSelector'
-import GameAction from './Game/GameAction'
-import GameBoard from './Game/GameBoard'
-import NewGame from './Game/NewGame'
-import GameMessage from './Game/GameMessage'
-import Message2Opponent from './Game/Message2Opponent'
-
-export default function Game() {
-
- return (
-
- )
-
-}
diff --git a/webapp/src/components/Game/GameAction.css b/webapp/src/components/Game/GameAction.css
deleted file mode 100644
index 69f5a28..0000000
--- a/webapp/src/components/Game/GameAction.css
+++ /dev/null
@@ -1,55 +0,0 @@
-.action-panel {
- margin-bottom: 10px;
- /* background-color: lightgrey; */
- width: 100%;
- /* padding-top: 8px;
- padding-bottom: 8px; */
- color: black;
- padding-left: -10px;
- /* */
-
- margin-left: 10px;
- border: 0.5px dotted lightslategray;
-}
-
-.game-action {
- width:fit-content;
- padding: 8px;
- padding-left: 15px;
- padding-right: 15px;
- border-radius: 5px;
- border: 0.5px solid darkgrey;
- margin: 2px;
-}
-
-.game-action.create:hover, /* OR */
-.game-action.busy
-{
- background-color:#00b0ff60;
-}
-
-.game-action.create.enabled:active {
- background-color:#00b0ffa0;
-}
-
-.game-action.cancel:hover,
-.game-action.reject:hover {
- background-color:#ff000030
-}
-
-.game-action.cancel:active,
-.game-action.reject:active {
- background-color:#ff000080
-}
-
-.game-action.accept:hover {
- background-color: #00af0030;
-}
-
-.game-action.accept:active {
- background-color:#00af0080;
-}
-
-.game-action.disabled {
- color: gray;
-}
diff --git a/webapp/src/components/Game/GameAction.jsx b/webapp/src/components/Game/GameAction.jsx
deleted file mode 100644
index 8cdbcf9..0000000
--- a/webapp/src/components/Game/GameAction.jsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import './GameAction.css';
-import React from 'react';
-import { useLocation, matchPath } from "react-router";
-
-import Create from './GameAction/Create';
-
-import Reject from './GameAction/Reject';
-import Cancel from './GameAction/Cancel';
-import Accept from './GameAction/Accept';
-
-import DrawReq from './GameAction/DrawReq';
-import DrawAcq from './GameAction/DrawAcq';
-import Surrender from './GameAction/Surrender';
-
-import Backward from './GameAction/Backward';
-import Forward from './GameAction/Forward';
-
-// import { AppContext } from '../../context/app'
-
-export default function GameAction() {
- // const [ctx, dispatchCtx] = React.useContext(AppContext)
-
- const { pathname } = useLocation();
- const isNewGamePath = matchPath("/game/new", pathname);
- const isProposalPath = matchPath("/game/proposal/*", pathname);
- const isActivelPath = matchPath("/game/active/*", pathname);
- const isArchivePath = matchPath("/game/archive/*", pathname);
-
- return (
-
- {isNewGamePath &&
}
-
- {isProposalPath &&
}
- {isProposalPath &&
}
- {isProposalPath &&
}
-
- {isActivelPath &&
}
- {isActivelPath &&
}
- {isActivelPath &&
}
-
- {isArchivePath &&
}
- {isArchivePath &&
}
-
- )
-}
\ No newline at end of file
diff --git a/webapp/src/components/Game/GameAction/Backward.jsx b/webapp/src/components/Game/GameAction/Backward.jsx
deleted file mode 100644
index 2cebb00..0000000
--- a/webapp/src/components/Game/GameAction/Backward.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-
-export default function Backward() {
-
- return
-}
diff --git a/webapp/src/components/Game/GameAction/DrawAcq.jsx b/webapp/src/components/Game/GameAction/DrawAcq.jsx
deleted file mode 100644
index 5d1a5af..0000000
--- a/webapp/src/components/Game/GameAction/DrawAcq.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-
-export default function DrawAcq() {
-
- return
-}
diff --git a/webapp/src/components/Game/GameAction/DrawReq.jsx b/webapp/src/components/Game/GameAction/DrawReq.jsx
deleted file mode 100644
index 33f147e..0000000
--- a/webapp/src/components/Game/GameAction/DrawReq.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-
-export default function DrawReq() {
-
- return
-}
diff --git a/webapp/src/components/Game/GameAction/Forward.jsx b/webapp/src/components/Game/GameAction/Forward.jsx
deleted file mode 100644
index a9f5380..0000000
--- a/webapp/src/components/Game/GameAction/Forward.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-
-export default function Forward() {
-
- return
-}
diff --git a/webapp/src/components/Game/GameAction/Surrender.jsx b/webapp/src/components/Game/GameAction/Surrender.jsx
deleted file mode 100644
index fb53cb4..0000000
--- a/webapp/src/components/Game/GameAction/Surrender.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from 'react';
-
-export default function Surrender() {
-
- return
-}
diff --git a/webapp/src/components/Game/GameBoard.css b/webapp/src/components/Game/GameBoard.css
deleted file mode 100644
index 8a8d0f5..0000000
--- a/webapp/src/components/Game/GameBoard.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.game-board .board {
- padding: 5px;
-}
\ No newline at end of file
diff --git a/webapp/src/components/Game/GameBoard.jsx b/webapp/src/components/Game/GameBoard.jsx
deleted file mode 100644
index 9af7ef8..0000000
--- a/webapp/src/components/Game/GameBoard.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import './GameBoard.css'
-import React from 'react'
-import Board from './GameBoard/Board'
-import { WHITE, BLACK } from './Stone'
-import { Player } from './Player'
-
-import { AppContext } from '../../context/app'
-
-export default function GameBoard() {
-
- const [ctx] = React.useContext(AppContext)
-
- return (
-
- )
-}
diff --git a/webapp/src/components/Game/GameBoard/Board.jsx b/webapp/src/components/Game/GameBoard/Board.jsx
deleted file mode 100644
index 3d1644a..0000000
--- a/webapp/src/components/Game/GameBoard/Board.jsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import './Board.css';
-import React from 'react';
-
-import { WhiteStone, BlackStone } from '../Stone'
-
-export default function Board() {
-
- return
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-function WhiteTile({ id, stone }) {
-
- return (
- handleClick(id)}
- >
- {stone}
-
- );
-}
-
-function BlackTile() {
- return
-}
-
-function handleClick(i) {
- console.log("click", i)
-}
diff --git a/webapp/src/components/Game/GameSelector/Selectable.jsx b/webapp/src/components/Game/GameSelector/Selectable.jsx
index 7e7a53e..838ed3e 100644
--- a/webapp/src/components/Game/GameSelector/Selectable.jsx
+++ b/webapp/src/components/Game/GameSelector/Selectable.jsx
@@ -1,7 +1,7 @@
import './Selectable.css'
import React from 'react';
import { oppositeColor } from '../Stone';
-import { Player } from '../Player';
+import { Player } from '../../Player';
export default function Selectable({ game, onClick }) {
diff --git a/webapp/src/components/Game/NewGame.jsx b/webapp/src/components/Game/NewGame.jsx
index 4a13705..4a42b71 100644
--- a/webapp/src/components/Game/NewGame.jsx
+++ b/webapp/src/components/Game/NewGame.jsx
@@ -3,7 +3,7 @@ import React from 'react';
import { AppData } from '../../context/data'
import { AppContext } from '../../context/app'
import { useLocation, matchPath } from "react-router";
-import { SelectPlayer } from './Player';
+import { SelectPlayer } from '../Player';
import { WhiteStone, BlackStone } from './Stone';
diff --git a/webapp/src/components/Game/Player.css b/webapp/src/components/Game/Player.css
deleted file mode 100644
index 549182a..0000000
--- a/webapp/src/components/Game/Player.css
+++ /dev/null
@@ -1,15 +0,0 @@
-.player {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
-}
-
-.player select {
- border-radius: 5px;
- border: 0.5px solid darkgrey;
-}
-
-.player select:hover {
- background: lightgray;
-}
\ No newline at end of file
diff --git a/webapp/src/components/Game/Player.jsx b/webapp/src/components/Game/Player.jsx
deleted file mode 100644
index ab55ad5..0000000
--- a/webapp/src/components/Game/Player.jsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import './Player.css'
-import React from 'react'
-import { Stone } from './Stone'
-
-export function Player({ color, name }) {
-
- return (
-
-
- {name}
-
- )
-}
-
-export function SelectPlayer({ name, setName, nameOptions }) {
- const handleSelectChange = (event) => {
- setName(event.target.value)
- }
-
- return (
-
-
-
- )
-}
diff --git a/webapp/src/components/Game/Stone.css b/webapp/src/components/Game/Stone.css
deleted file mode 100644
index debebf0..0000000
--- a/webapp/src/components/Game/Stone.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.stone {
- cursor: default; /* disable 'I beam' cursor change */
-}
\ No newline at end of file
diff --git a/webapp/src/components/Game/Stone.jsx b/webapp/src/components/Game/Stone.jsx
deleted file mode 100644
index 60995fc..0000000
--- a/webapp/src/components/Game/Stone.jsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import './Stone.css'
-import React from 'react'
-
-export function Stone({ color }) {
- switch (color) {
- case WHITE():
- return WhiteStone()
-
- case BLACK():
- return BlackStone()
-
- default:
- console.warn("Unknown color: ", color)
- }
-}
-
-export function WhiteStone() {
- return ⛀
-}
-
-export function BlackStone() {
- return ⛂
-}
-
-export function oppositeColor(color) {
- if (color === WHITE())
- return BLACK()
-
- if (color === BLACK())
- return WHITE()
-
- return color
-}
-
-export function WHITE() {
- return "WHITE"
-}
-
-export function BLACK() {
- return "BLACK"
-}
diff --git a/webapp/src/container/Games.css b/webapp/src/container/Games.css
new file mode 100644
index 0000000..54be4a0
--- /dev/null
+++ b/webapp/src/container/Games.css
@@ -0,0 +1,125 @@
+.Games {
+ width: 100%;
+ float: left;
+}
+
+.Games .left-side {
+ float: left;
+ width: 45%;
+ /* max-width: 400px; */
+
+ /* height: 100px; */
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.Games .right-side {
+ float: left;
+ width: 55%;
+
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+
+
+.ViewSelector {
+ text-align: center;
+ margin-bottom: 10px;
+ background-color: lightgrey;
+ width: 100%;
+ padding-top: 8px;
+ padding-bottom: 8px;
+ color: black;
+}
+
+.ViewSelector a {
+ color: black;
+ text-decoration: none;
+ transition: .25s ease;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+
+.ViewSelector .active {
+ color: white;
+ border-radius: 2px;
+ background-color: cadetblue;
+ opacity: 80%;
+ padding-top: 8px;
+ padding-bottom: 8px;
+}
+
+.ViewSelector a:hover:not(.active) {
+ color: cadetblue;
+ box-shadow: 0 1.5px 0 0 currentColor;
+}
+
+
+
+.ViewProvider {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+
+.ActionPanel {
+ text-align: center;
+ margin-bottom: 10px;
+ height: 34.5px;
+
+ /* background-color: lightgrey; */
+ width: 100%;
+ /* padding-top: 8px;
+ padding-bottom: 8px; */
+ color: black;
+ padding-left: -10px;
+ /* */
+
+ margin-left: 10px;
+ border: 0.5px dotted lightslategray;
+}
+
+.ActionPanel button {
+ width:fit-content;
+ padding: 6px;
+ padding-left: 15px;
+ padding-right: 15px;
+ border-radius: 5px;
+ border: 0.5px solid darkgrey;
+ margin: 2px;
+}
+
+.ActionPanel .Create:hover, /* OR */
+.game-action.busy
+{
+ background-color:#00b0ff60;
+}
+
+.ActionPanel .Create.enabled:active {
+ background-color:#00b0ffa0;
+}
+
+.ActionPanel .Cancel:hover,
+.ActionPanel .Reject:hover {
+ background-color:#ff000030
+}
+
+.ActionPanel .Cancel:active,
+.ActionPanel .Reject:active {
+ background-color:#ff000080
+}
+
+.ActionPanel .Accept:hover {
+ background-color: #00af0030;
+}
+
+.ActionPanel .Accept:active {
+ background-color:#00af0080;
+}
\ No newline at end of file
diff --git a/webapp/src/container/Games.jsx b/webapp/src/container/Games.jsx
new file mode 100644
index 0000000..c045551
--- /dev/null
+++ b/webapp/src/container/Games.jsx
@@ -0,0 +1,77 @@
+import './Games.css';
+import React from "react"
+import { NavLink, Routes, Route } from "react-router-dom";
+
+import NewGame from './games/view/NewGame';
+import GameProposals from './games/view/GameProposals';
+import ActiveGames from './games/view/ActiveGames';
+import GamesArchive from './games/view/GamesArchive';
+
+import Create from './games/action/Create';
+import Reject from './games/action/Reject';
+import Cancel from './games/action/Cancel';
+import Accept from './games/action/Accept';
+import DrawReq from './games/action/DrawReq';
+import DrawAcq from './games/action/DrawAcq';
+import Surrender from './games/action/Surrender';
+import Backward from './games/action/Backward';
+import Forward from './games/action/Forward';
+
+import GameBoard from './games/GameBoard';
+
+export default function Games({ gamesReducer, user }) {
+
+ return (
+
+ )
+};
+
+function ViewSelector() {
+ return (
+
+ )
+}
+
+function ViewProvider() {
+ return (
+
+
+ } />
+ } />
+ } />
+ } />
+
+
+ )
+}
+
+function ActionPanel() {
+ return (
+
+
+ } />
+ , , ]} />
+ , , ]} />
+ , ]} />
+
+
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/container/Header.css b/webapp/src/container/Header.css
index 651fa5e..0f4286a 100644
--- a/webapp/src/container/Header.css
+++ b/webapp/src/container/Header.css
@@ -17,7 +17,7 @@
}
.Header a {
- color: lightgray;
+ color: black;
text-decoration: none;
transition: .25s ease;
width: fit-content;
@@ -38,14 +38,5 @@
.Header a:hover:not(.active) {
color: cadetblue;
- box-shadow: 0 1.5px 0 0 currentcolor;
-}
-
-[data-darkreader-scheme="dark"] .Header a {
- color: darkslategrey;
-}
-
-[data-darkreader-scheme="dark"] .Header .active {
- color: white;
box-shadow: 0 1.5px 0 0 currentcolor;
}
\ No newline at end of file
diff --git a/webapp/src/container/Header.jsx b/webapp/src/container/Header.jsx
index dc4d2a0..553e540 100644
--- a/webapp/src/container/Header.jsx
+++ b/webapp/src/container/Header.jsx
@@ -23,8 +23,8 @@ export default function Header({ pollingReducer }) {
About
-
-
+
+
diff --git a/webapp/src/container/Leaderboard.jsx b/webapp/src/container/Leaderboard.jsx
index 54457c7..6224487 100644
--- a/webapp/src/container/Leaderboard.jsx
+++ b/webapp/src/container/Leaderboard.jsx
@@ -22,19 +22,21 @@ export default function Leaderboard({ leaderboard, user }) {
});
- return
-
-
-
- |
- Played |
- Won |
- Draw |
-
-
-
- {tableRows}
-
-
-
+ return (
+
+
+
+
+ |
+ Played |
+ Won |
+ Draw |
+
+
+
+ {tableRows}
+
+
+
+ )
};
\ No newline at end of file
diff --git a/webapp/src/container/games/GameBoard.css b/webapp/src/container/games/GameBoard.css
new file mode 100644
index 0000000..9bc2ca5
--- /dev/null
+++ b/webapp/src/container/games/GameBoard.css
@@ -0,0 +1,3 @@
+.GameBoard .Board {
+ padding: 5px;
+}
\ No newline at end of file
diff --git a/webapp/src/container/games/GameBoard.jsx b/webapp/src/container/games/GameBoard.jsx
new file mode 100644
index 0000000..b5b93fe
--- /dev/null
+++ b/webapp/src/container/games/GameBoard.jsx
@@ -0,0 +1,20 @@
+import './GameBoard.css'
+import React from 'react'
+
+import { Color, Player, Board } from '../../components/Checkers';
+
+//import { AppContext } from '../../context/app'
+
+export default function GameBoard() {
+
+
+ //const [ctx] = React.useContext(AppContext)
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/components/Game/GameAction/Accept.jsx b/webapp/src/container/games/action/Accept.jsx
similarity index 50%
rename from webapp/src/components/Game/GameAction/Accept.jsx
rename to webapp/src/container/games/action/Accept.jsx
index 17c7249..5fba232 100644
--- a/webapp/src/components/Game/GameAction/Accept.jsx
+++ b/webapp/src/container/games/action/Accept.jsx
@@ -2,5 +2,5 @@ import React from 'react';
export default function Accept() {
- return
+ return
}
diff --git a/webapp/src/container/games/action/Backward.jsx b/webapp/src/container/games/action/Backward.jsx
new file mode 100644
index 0000000..4ac5747
--- /dev/null
+++ b/webapp/src/container/games/action/Backward.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function Backward() {
+
+ return
+}
diff --git a/webapp/src/components/Game/GameAction/Cancel.jsx b/webapp/src/container/games/action/Cancel.jsx
similarity index 50%
rename from webapp/src/components/Game/GameAction/Cancel.jsx
rename to webapp/src/container/games/action/Cancel.jsx
index 9470172..3d6642e 100644
--- a/webapp/src/components/Game/GameAction/Cancel.jsx
+++ b/webapp/src/container/games/action/Cancel.jsx
@@ -2,5 +2,5 @@ import React from 'react';
export default function Cancel() {
- return
+ return
}
diff --git a/webapp/src/container/games/action/Create.jsx b/webapp/src/container/games/action/Create.jsx
new file mode 100644
index 0000000..2cee6c6
--- /dev/null
+++ b/webapp/src/container/games/action/Create.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function Create() {
+
+ return
+}
diff --git a/webapp/src/container/games/action/DrawAcq.jsx b/webapp/src/container/games/action/DrawAcq.jsx
new file mode 100644
index 0000000..26b9a99
--- /dev/null
+++ b/webapp/src/container/games/action/DrawAcq.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function DrawAcq() {
+
+ return
+}
diff --git a/webapp/src/container/games/action/DrawReq.jsx b/webapp/src/container/games/action/DrawReq.jsx
new file mode 100644
index 0000000..11cac07
--- /dev/null
+++ b/webapp/src/container/games/action/DrawReq.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function DrawReq() {
+
+ return
+}
diff --git a/webapp/src/container/games/action/Forward.jsx b/webapp/src/container/games/action/Forward.jsx
new file mode 100644
index 0000000..0365bfa
--- /dev/null
+++ b/webapp/src/container/games/action/Forward.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function Forward() {
+
+ return
+}
diff --git a/webapp/src/components/Game/GameAction/Reject.jsx b/webapp/src/container/games/action/Reject.jsx
similarity index 50%
rename from webapp/src/components/Game/GameAction/Reject.jsx
rename to webapp/src/container/games/action/Reject.jsx
index 9797197..4cc20ba 100644
--- a/webapp/src/components/Game/GameAction/Reject.jsx
+++ b/webapp/src/container/games/action/Reject.jsx
@@ -2,5 +2,5 @@ import React from 'react';
export default function Reject() {
- return
+ return
}
diff --git a/webapp/src/container/games/action/Surrender.jsx b/webapp/src/container/games/action/Surrender.jsx
new file mode 100644
index 0000000..3a9303d
--- /dev/null
+++ b/webapp/src/container/games/action/Surrender.jsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function Surrender() {
+
+ return
+}
diff --git a/webapp/src/container/games/view/ActiveGames.jsx b/webapp/src/container/games/view/ActiveGames.jsx
new file mode 100644
index 0000000..c91ff68
--- /dev/null
+++ b/webapp/src/container/games/view/ActiveGames.jsx
@@ -0,0 +1,7 @@
+import React from 'react';
+
+export default function ActiveGames() {
+ return (
+ View: ActiveGame
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/container/games/view/GameProposals.jsx b/webapp/src/container/games/view/GameProposals.jsx
new file mode 100644
index 0000000..f487eb1
--- /dev/null
+++ b/webapp/src/container/games/view/GameProposals.jsx
@@ -0,0 +1,7 @@
+import React from 'react';
+
+export default function GameProposals() {
+ return (
+ View: GameProposals
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/container/games/view/GamesArchive.jsx b/webapp/src/container/games/view/GamesArchive.jsx
new file mode 100644
index 0000000..302ae09
--- /dev/null
+++ b/webapp/src/container/games/view/GamesArchive.jsx
@@ -0,0 +1,7 @@
+import React from 'react';
+
+export default function GamesArchive() {
+ return (
+ View: GameArchive
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/container/games/view/NewGame.css b/webapp/src/container/games/view/NewGame.css
new file mode 100644
index 0000000..8b828cf
--- /dev/null
+++ b/webapp/src/container/games/view/NewGame.css
@@ -0,0 +1,8 @@
+.SelectPlayer {
+ border-radius: 5px;
+ border: 0.5px solid darkgrey;
+}
+
+.SelectPlayer select:hover {
+ background: lightgray;
+}
\ No newline at end of file
diff --git a/webapp/src/container/games/view/NewGame.jsx b/webapp/src/container/games/view/NewGame.jsx
new file mode 100644
index 0000000..ba41be0
--- /dev/null
+++ b/webapp/src/container/games/view/NewGame.jsx
@@ -0,0 +1,25 @@
+import React from 'react';
+
+export default function NewGame() {
+ return (
+ View: NewGame
+ )
+}
+
+
+// Move to components as DropSelector
+function SelectPlayer({ name, setName, nameOptions }) {
+ const handleSelectChange = (event) => {
+ setName(event.target.value)
+ }
+
+ return (
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/webapp/src/reducer/games.js b/webapp/src/reducer/games.js
new file mode 100644
index 0000000..ebe8eac
--- /dev/null
+++ b/webapp/src/reducer/games.js
@@ -0,0 +1,21 @@
+import { useReducer } from 'react';
+import { nextState } from '../util/StateHelper';
+
+export const gamesInitialState = {
+ list: null,
+};
+
+export function gamesReducer(state, action) {
+ switch (action.type) {
+
+ case 'next':
+ return nextState(state, action);
+
+ default:
+ throw Error('GameReducer: unknown action.type', action.type);
+ }
+}
+
+export default function useGamesReducer() {
+ return useReducer(gamesReducer, gamesInitialState);
+}
\ No newline at end of file
diff --git a/webapp/src/reducer/user.js b/webapp/src/reducer/user.js
index 4128100..09b8f86 100644
--- a/webapp/src/reducer/user.js
+++ b/webapp/src/reducer/user.js
@@ -17,7 +17,7 @@ export function userReducer(state, action) {
return nextState(state, action);
default:
- throw Error('Unknown action.type', action.type);
+ throw Error('UserReducer: unknown action.type', action.type);
}
}