diff --git a/frontend/src/components/Card/Card.jsx b/frontend/src/components/Card/Card.jsx index 075e8fa..a858944 100644 --- a/frontend/src/components/Card/Card.jsx +++ b/frontend/src/components/Card/Card.jsx @@ -32,9 +32,11 @@ const StatContainer = ({ hoveredStats, onStatHover, onStatHoverLeave, + isPlayersTurn, + roundWinner, }) => { const handleClick = (event) => { - if (isCardInPlay) { + if (isCardInPlay && !isPlayersTurn && !roundWinner) { selectStat(event.target.dataset["stat"]); } }; @@ -79,6 +81,8 @@ export const Card = ({ selectStat, opponentCardShow, hints, + isPlayersTurn, + roundWinner, }) => { // Track hover state for each stat separately const [hoveredStats, setHoveredStats] = useState({ @@ -186,6 +190,8 @@ export const Card = ({ hoveredStats={hoveredStats} onStatHover={onStatHover} onStatHoverLeave={onStatHoverLeave} + isPlayersTurn={isPlayersTurn} + roundWinner={roundWinner} /> ))} diff --git a/frontend/src/components/CardContainer/CardContainer.jsx b/frontend/src/components/CardContainer/CardContainer.jsx index 5ece044..bb6fd46 100644 --- a/frontend/src/components/CardContainer/CardContainer.jsx +++ b/frontend/src/components/CardContainer/CardContainer.jsx @@ -29,6 +29,8 @@ export const CardContainer = ({ opponentCardShow, cardsInPlay, hints, + isPlayersTurn, + roundWinner, }) => { return (
@@ -47,6 +49,8 @@ export const CardContainer = ({ opponentCardShow={opponentCardShow} cardsInPlay={cardsInPlay} hints={hints} + isPlayersTurn={isPlayersTurn} + roundWinner={roundWinner} /> ))}
diff --git a/frontend/src/pages/PlayGamePage/PlayGamePage.jsx b/frontend/src/pages/PlayGamePage/PlayGamePage.jsx index fed370a..dbd2a60 100644 --- a/frontend/src/pages/PlayGamePage/PlayGamePage.jsx +++ b/frontend/src/pages/PlayGamePage/PlayGamePage.jsx @@ -42,265 +42,258 @@ import { postWinner } from "../../services/userStats"; import { RoundWinner } from "../../components/RoundWinner/RoundWinner"; export const PlayGamePage = () => { - const location = useLocation(); - const { startingPlayerHand, startingOpponentHand } = location.state || { - startingPlayerHand: [], - startingOpponentHand: [], - }; - const [playerHand, setPlayerHand] = useState(startingPlayerHand); - const [opponentHand, setOpponentHand] = useState(startingOpponentHand); - const [cardsInPlay, setCardsInPlay] = useState([]); - const [gameWinner, setGameWinner] = useState(""); - const [opponentCardShow, setOpponentCardShow] = useState(true); - const [isPlayersTurn, setIsPlayersTurn] = useState(true); - const [isLoading, setIsLoading] = useState(true); - const [loadingProgress, setLoadingProgress] = useState(0); - const [hintsOn, setHintsOn] = useState(true); - const [roundWinner, setRoundWinner] = useState(); + const location = useLocation(); + const { startingPlayerHand, startingOpponentHand } = location.state || { + startingPlayerHand: [], + startingOpponentHand: [], + }; + const [playerHand, setPlayerHand] = useState(startingPlayerHand); + const [opponentHand, setOpponentHand] = useState(startingOpponentHand); + const [cardsInPlay, setCardsInPlay] = useState([]); + const [gameWinner, setGameWinner] = useState(""); + const [opponentCardShow, setOpponentCardShow] = useState(true); + const [isPlayersTurn, setIsPlayersTurn] = useState(true); + const [isLoading, setIsLoading] = useState(true); + const [loadingProgress, setLoadingProgress] = useState(0); + const [hintsOn, setHintsOn] = useState(true); + const [roundWinner, setRoundWinner] = useState(); - const ORIGINAL_STATS_NAMES = { - year: "Discovery published in", - edible: "edible", - ph_range: "Soil pH range", - light: "Light Level", - soil_nutriments: "Nutrients required", - atmospheric_humidity: "Humidity Level", - }; + const ORIGINAL_STATS_NAMES = { + year: "Discovery published in", + edible: "edible", + ph_range: "Soil pH range", + light: "Light Level", + soil_nutriments: "Nutrients required", + atmospheric_humidity: "Humidity Level", + }; - const toggleHints = () => { - setHintsOn(!hintsOn); - }; + const toggleHints = () => { + setHintsOn(!hintsOn); + }; - // Preload all images when the component mounts - useEffect(() => { - const loadAllImages = async () => { - setIsLoading(true); + // Preload all images when the component mounts + useEffect(() => { + const loadAllImages = async () => { + setIsLoading(true); - // Combine all cards - const allCards = [...playerHand, ...opponentHand]; + // Combine all cards + const allCards = [...playerHand, ...opponentHand]; - // Preload all images - await preloadPlantImages(allCards, (loaded, total) => { - setLoadingProgress(Math.floor((loaded / total) * 100)); - }); + // Preload all images + await preloadPlantImages(allCards, (loaded, total) => { + setLoadingProgress(Math.floor((loaded / total) * 100)); + }); - setIsLoading(false); - }; + setIsLoading(false); + }; - loadAllImages(); - }, []); + loadAllImages(); + }, []); - // Pre-cache the next cards to be played - useEffect(() => { - const preloadNextCards = async () => { - if ( - playerHand.length > 0 && - opponentHand.length > 0 && - !isLoading - ) { - // Preload the next cards in each deck - await preloadPlantImages([playerHand[0], opponentHand[0]]); - } - }; + // Pre-cache the next cards to be played + useEffect(() => { + const preloadNextCards = async () => { + if (playerHand.length > 0 && opponentHand.length > 0 && !isLoading) { + // Preload the next cards in each deck + await preloadPlantImages([playerHand[0], opponentHand[0]]); + } + }; - preloadNextCards(); - }, [playerHand, opponentHand, isLoading]); + preloadNextCards(); + }, [playerHand, opponentHand, isLoading]); - const selectStat = ( - stat, - card1 = cardsInPlay[0], - card2 = cardsInPlay[1], - playerHandSize = playerHand.length, - opponentHandSize = opponentHand.length - ) => { - setOpponentCardShow(true); + const selectStat = ( + stat, + card1 = cardsInPlay[0], + card2 = cardsInPlay[1], + playerHandSize = playerHand.length, + opponentHandSize = opponentHand.length, + ) => { + setOpponentCardShow(true); - const token = localStorage.getItem("token"); - setTimeout(() => { - postPlantForComparison(card1.id, card2.id, stat, token).then( - (response) => { - if (response.winner === "player") { - playerOneWinsComparison( - [card1, card2], - opponentHandSize - ); + const token = localStorage.getItem("token"); + setTimeout(() => { + postPlantForComparison(card1.id, card2.id, stat, token).then( + (response) => { + if (response.winner === "player") { + playerOneWinsComparison([card1, card2], opponentHandSize); - setRoundWinner([ - "Player wins hand!", - "Stat compared:", - ORIGINAL_STATS_NAMES[response.compared_stat], - ]); - } else if (response.winner === "opponent") { - playerTwoWinsComparison([card1, card2], playerHandSize); - setRoundWinner([ - "Opponent wins hand!", - "Stat compared:", - ORIGINAL_STATS_NAMES[response.compared_stat], - ]); - } else if (response.winner === "draw") { - drawOutcome([card1, card2]); - setRoundWinner([ - "Draw", - "Stat compared:", - ORIGINAL_STATS_NAMES[response.compared_stat], - ]); - } - // set a new token - localStorage.setItem("token", response.token); - } - ); - }, 1000); - }; + setRoundWinner([ + "Player wins hand!", + "Stat compared:", + ORIGINAL_STATS_NAMES[response.compared_stat], + ]); + } else if (response.winner === "opponent") { + playerTwoWinsComparison([card1, card2], playerHandSize); + setRoundWinner([ + "Opponent wins hand!", + "Stat compared:", + ORIGINAL_STATS_NAMES[response.compared_stat], + ]); + } else if (response.winner === "draw") { + drawOutcome([card1, card2]); + setRoundWinner([ + "Draw", + "Stat compared:", + ORIGINAL_STATS_NAMES[response.compared_stat], + ]); + } + // set a new token + localStorage.setItem("token", response.token); + }, + ); + }, 1000); + }; - const onClickNextRoundHandle = () => { - if (isPlayersTurn) { - setOpponentCardShow(false); - } - setIsPlayersTurn((prev) => !prev); - setRoundWinner(); - setCardsInPlay([]); - }; + const onClickNextRoundHandle = () => { + if (isPlayersTurn) { + setOpponentCardShow(false); + } + setIsPlayersTurn((prev) => !prev); + setRoundWinner(); + setCardsInPlay([]); + }; - const pickTopCards = async () => { - if (playerHand.length === 0 || opponentHand.length === 0) return; + const pickTopCards = async () => { + if (playerHand.length === 0 || opponentHand.length === 0) return; + setRoundWinner(); + const latestCardsInPlay = [playerHand[0], opponentHand[0]]; + const playerHandSize = playerHand.length - 1; + const opponentHandSize = opponentHand.length - 1; - const latestCardsInPlay = [playerHand[0], opponentHand[0]]; - const playerHandSize = playerHand.length - 1; - const opponentHandSize = opponentHand.length - 1; + // Ensure these cards' images are loaded before displaying them + await preloadPlantImages(latestCardsInPlay); - // Ensure these cards' images are loaded before displaying them - await preloadPlantImages(latestCardsInPlay); + setCardsInPlay(latestCardsInPlay); + setPlayerHand((prev) => prev.slice(1)); + setOpponentHand((prev) => prev.slice(1)); - setCardsInPlay(latestCardsInPlay); - setPlayerHand((prev) => prev.slice(1)); - setOpponentHand((prev) => prev.slice(1)); + if (!isPlayersTurn) { + selectStat( + null, + latestCardsInPlay[0], + latestCardsInPlay[1], + playerHandSize, + opponentHandSize, + ); + } + }; - if (!isPlayersTurn) { - selectStat( - null, - latestCardsInPlay[0], - latestCardsInPlay[1], - playerHandSize, - opponentHandSize - ); - } - }; + const playerOneWinsComparison = (cards, opponentHandSize) => { + const token = localStorage.getItem("token"); + if (opponentHandSize === 0) { + setGameWinner("Player"); + postWinner(token, "player"); + } - const playerOneWinsComparison = (cards, opponentHandSize) => { - const token = localStorage.getItem("token"); - if (opponentHandSize === 0) { - setGameWinner("Player"); - postWinner(token, "player"); - } + setPlayerHand((prev) => { + const updatedCards = cards.map((card) => ({ + ...card, + owner: "player", + })); - setPlayerHand((prev) => { - const updatedCards = cards.map((card) => ({ - ...card, - owner: "player", - })); + return [...prev, ...updatedCards]; + }); + }; - return [...prev, ...updatedCards]; - }); - }; + const playerTwoWinsComparison = (cards, playerHandSize) => { + const token = localStorage.getItem("token"); - const playerTwoWinsComparison = (cards, playerHandSize) => { - const token = localStorage.getItem("token"); + if (playerHandSize === 0) { + setGameWinner("Opponent"); + postWinner(token, "opponent"); + } - if (playerHandSize === 0) { - setGameWinner("Opponent"); - postWinner(token, "opponent"); - } + setOpponentHand((prev) => { + const updatedCards = cards.map((card) => ({ + ...card, + owner: "opponent", + })); - setOpponentHand((prev) => { - const updatedCards = cards.map((card) => ({ - ...card, - owner: "opponent", - })); + return [...prev, ...updatedCards]; + }); + }; - return [...prev, ...updatedCards]; - }); - }; + const drawOutcome = (cards) => { + setPlayerHand((prev) => [...prev, cards[0]]); + setOpponentHand((prev) => [...prev, cards[1]]); + }; - const drawOutcome = (cards) => { - setPlayerHand((prev) => [...prev, cards[0]]); - setOpponentHand((prev) => [...prev, cards[1]]); - }; + if (isLoading) { + return ( +
+

Preparing Game...

+
+
+
+

{loadingProgress}% complete

+
+ ); + } - if (isLoading) { - return ( -
-

Preparing Game...

-
-
-
-

{loadingProgress}% complete

-
- ); - } + return gameWinner ? ( + <> +

{gameWinner} wins!

+ + New Game? + + + + ) : ( + <> +
+ {roundWinner && } + {((playerHand.length === 5 && opponentHand.length === 5) || + roundWinner) && ( + + )} +
+
+
+ +
- return gameWinner ? ( - <> -

{gameWinner} wins!

- - New Game? - - - - ) : ( - <> -
- {roundWinner && } - {((playerHand.length === 5 && opponentHand.length === 5) || - roundWinner) && ( - - )} + {(cardsInPlay.length > 0 || gameWinner) &&

Cards in Play

} + {(cardsInPlay.length > 0 || gameWinner) && ( + + )} +
+ {playerHand && playerHand.length > 0 && ( +
+

Player Hand

+
-
-
- -
- - {(cardsInPlay.length > 0 || gameWinner) && ( -

Cards in Play

- )} - {(cardsInPlay.length > 0 || gameWinner) && ( - - )} -
- {playerHand && playerHand.length > 0 && ( -
-

Player Hand

- -
- )} - {opponentHand && opponentHand.length > 0 && ( -
-

Opponent Hand

- -
- )} -
+ )} + {opponentHand && opponentHand.length > 0 && ( +
+

Opponent Hand

+
- - ); + )} +
+
+ + ); };