import { useState, useEffect } from "react"; import { socket } from "./socket"; import { ConnectionState } from "./components/ConnectionState"; import { ConnectionManager } from "./components/ConnectionManager"; import { JoinSession } from "./components/JoinSession"; import { Events } from "./components/Events"; import { Game } from "./types/gameTypes"; import Action from "./components/Action"; export default function App() { const [isConnected, setIsConnected] = useState(socket.connected); const [messageEvents, setMessageEvents] = useState([]); const [session, setSession] = useState(""); const [clientsInRoom, setClientsInRoom] = useState(0); const [gameData, setGameData] = useState(null); const [messageDispaly, setMessageDisplay] = useState(""); const showStartGameButton = session !== "" && clientsInRoom >= 2; const remainingInCardStack = gameData?.cardStack?.cards?.length || 0; const remainingInDiscardPile = gameData?.discardPile?.length || 0; const topCardInDiscardPile = gameData?.discardPile?.[remainingInDiscardPile - 1]; const playersData = extractMyData(gameData); function startGame() { socket.emit("new-game", { sessionId: session }); } function clickCard(cardPosition: number) { console.log("Clicked card", cardPosition); socket.emit("click-card", cardPosition); } function drawFromCardStack() { console.log("Draw card"); socket.emit("draw-from-card-stack", { sessionId: session }); } function clickDiscardPile() { console.log("Clicked discard pile"); socket.emit("click-discard-pile", { sessionId: session }); } function extractMyData(gameData: Game | null) { if (!gameData) return undefined; return gameData.players.find((player) => player.socketId === socket.id); } function setTempMessage(message: string) { setMessageDisplay(message); setTimeout(() => { setMessageDisplay(""); }, 3000); } useEffect(() => { if (gameData?.phase === "game-over") { setTempMessage("Game Over"); } else if (gameData?.phase === "game-started") { setTempMessage("Game Started"); } else if (gameData?.phase === "waiting-for-players") { setTempMessage("Waiting for players"); } }, [gameData]); useEffect(() => { function onConnect() { setIsConnected(true); } function onDisconnect() { setIsConnected(false); } function onClientsInRoomUpdate(clients: number) { setClientsInRoom(clients); } function onMessageEvent(value: string) { setMessageEvents((previous) => [...previous, value]); } function onGameUpdate(gameData: Game) { console.log("New game data", gameData); setGameData(gameData); } socket.on("connect", onConnect); socket.on("disconnect", onDisconnect); socket.on("message", onMessageEvent); socket.on("clients-in-session", onClientsInRoomUpdate); socket.on("game-update", onGameUpdate); return () => { socket.off("connect", onConnect); socket.off("disconnect", onDisconnect); socket.off("message", onMessageEvent); socket.off("clients-in-session", onClientsInRoomUpdate); socket.off("game-update", onGameUpdate); }; }, []); return (
{showStartGameButton && } {gameData && gameData.players.map((playerData, index) => (

Player ID: {playerData.id}

Player Name: {playerData.name}

{Array(Math.ceil(playerData.cards.length / 4)) .fill(null) .map((_, rowIndex) => ( {Array(4) .fill(null) .map((_, colIndex) => { const card = playerData.cards[rowIndex * 4 + colIndex]; return ( ); })} ))}
Column 1 Column 2 Column 3 Column 4
{card && ( clickCard(rowIndex * 4 + colIndex) } > {card.value} )}
))}
{gameData?.cardStack && remainingInCardStack > 0 && (
Draw {remainingInCardStack} in Card Set
)} {gameData?.discardPile && remainingInDiscardPile > 0 && (
{topCardInDiscardPile?.value} {remainingInDiscardPile} Discard Pile
)} {playersData?.cardCache && (

Card Cache: {playersData.cardCache.value}

)} {messageDispaly && messageDispaly !== "" &&

{messageDispaly}

}
); }