From 5bf8cfbe0b3953ea91d6f7aaf6e60a659ce13c2f Mon Sep 17 00:00:00 2001 From: Mikayla Dobson <93477693+innocuous-symmetry@users.noreply.github.com> Date: Thu, 21 Jul 2022 16:30:04 -0500 Subject: [PATCH] radio button state works as intended. some cleanup --- src/components/Gameboard/Gameboard.tsx | 7 +- src/components/Gameboard/Nobles.tsx | 4 - src/components/Player/Player.tsx | 1 + src/util/GameConstructor.tsx | 127 +++++++++++++++++++++---- 4 files changed, 110 insertions(+), 29 deletions(-) diff --git a/src/components/Gameboard/Gameboard.tsx b/src/components/Gameboard/Gameboard.tsx index 13cd681..d8db50e 100644 --- a/src/components/Gameboard/Gameboard.tsx +++ b/src/components/Gameboard/Gameboard.tsx @@ -21,7 +21,7 @@ export default function Gameboard() { if (!players.length) { setView(
-

Sorry! It appears we've lost track of your game data.

+ Sorry! It appears we've lost track of your game data.

Please head back to the home page to start a fresh game.

); @@ -53,7 +53,6 @@ export default function Gameboard() { } gameboard.deck = newDeck; - // setState({ ...gameboard, deck: newDeck }); } const setNobles = () => { @@ -65,11 +64,7 @@ export default function Gameboard() { const randNoble = newNobles.splice(rand,1)[0]; shuffledNobles.push(randNoble); } - - console.log(newNobles); - console.log(shuffledNobles); - // setState({ ...gameboard, nobles: shuffledNobles }); gameboard.nobles = shuffledNobles; } diff --git a/src/components/Gameboard/Nobles.tsx b/src/components/Gameboard/Nobles.tsx index 44408a1..1037bca 100644 --- a/src/components/Gameboard/Nobles.tsx +++ b/src/components/Gameboard/Nobles.tsx @@ -5,10 +5,6 @@ import "./Nobles.css" export default function Nobles() { const { gameboard } = useContext(Context); - - useEffect(() => { - console.log(gameboard); - }, [gameboard]) return (
diff --git a/src/components/Player/Player.tsx b/src/components/Player/Player.tsx index 4ee4da5..4968e92 100644 --- a/src/components/Player/Player.tsx +++ b/src/components/Player/Player.tsx @@ -39,6 +39,7 @@ export default function Player({ data }: PlayerProps) {

Name: {data.name}

Score: {data.points}

+

Is {data.starter || "not"} round starter

diff --git a/src/util/GameConstructor.tsx b/src/util/GameConstructor.tsx index 75a0b87..1512e8f 100644 --- a/src/util/GameConstructor.tsx +++ b/src/util/GameConstructor.tsx @@ -1,27 +1,53 @@ -import { useContext, useState } from "react" +import { useContext, useEffect, useState } from "react" import { useNavigate } from "react-router-dom" import { Context } from "../context/Context"; import { CardData, NobleData, PlayerData } from "./types"; +interface InputState { + playerOne: PlayerInput + playerTwo: PlayerInput + playerThree: PlayerInput + playerFour: PlayerInput +} + +interface PlayerInput { + name: string, + starter: boolean +} + export default function GameConstructor() { const AppContext = useContext(Context); const navigate = useNavigate(); - const [input, setInput] = useState({ - playerOne: '', - playerTwo: '', - playerThree: '', - playerFour: '', + const [starter, setStarter] = useState(-1); + + const [input, setInput] = useState({ + playerOne: { + name: '', + starter: false + }, + playerTwo: { + name: '', + starter: false + }, + playerThree: { + name: '', + starter: false + }, + playerFour: { + name: '', + starter: false + }, }) const newGame = () => { - if (!input.playerOne || !input.playerTwo) return; - if (input.playerFour && !input.playerThree) return; + if (!input.playerOne.name || !input.playerTwo.name) return; + if (input.playerFour.name && !input.playerThree.name) return; - const newPlayers = Object.values(input).map((name: string): PlayerData => { + const newPlayers = Object.values(input).map((val: {name: string, starter: boolean}): PlayerData => { return { - name: name, - starter: false, + name: val.name, + starter: val.starter, points: 0, nobles: new Array, cards: new Array, @@ -41,30 +67,93 @@ export default function GameConstructor() { } AppContext.players = newPlayers; - - console.log(AppContext) navigate('/game'); } + const handleRadio = (x: number) => { + const playerKeys = ["playerOne", "playerTwo", "playerThree", "playerFour"] + const inputKey = playerKeys[x-1]; + setStarter(x-1); + + setInput((prev) => { + let newState = prev; + for (let key of Object.keys(prev)) { + // @ts-ignore + newState[key].starter = (key === inputKey); + } + + return newState; + }) + } + return (

Configure a new game:

- setInput({ ...input, playerOne: e.target.value})}> + setInput({ ...input, playerOne: {...input.playerOne, name: e.target.value}})}> + + handleRadio(1)} + checked={starter === 0}> + +
+ +
- setInput({ ...input, playerTwo: e.target.value})}> + setInput({ ...input, playerTwo: {...input.playerTwo, name: e.target.value}})}> + + handleRadio(2)} + checked={starter === 1}> +
- setInput({ ...input, playerThree: e.target.value})}> - - setInput({ ...input, playerFour: e.target.value})}> + setInput({ ...input, playerThree: {...input.playerThree, name: e.target.value}})}> + + handleRadio(3)} + checked={starter === 2}> +
- +
+ + setInput({ ...input, playerFour: {...input.playerFour, name: e.target.value}})}> + + handleRadio(4)} + checked={starter === 3}> + +
+ +
) } \ No newline at end of file