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
- - - - - - - - - - - {tableRows} - -
PlayedWonDraw
-
+ return ( +
+ + + + + + + + + + + {tableRows} + +
PlayedWonDraw
+
+ ) }; \ 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); } }