From 00c365de84def4576c8e2aa8fce11c6c8ff716f2 Mon Sep 17 00:00:00 2001 From: MiguelMLorente Date: Sun, 9 Feb 2025 14:38:08 +0100 Subject: [PATCH] Add transition to lobby page --- interface/server-events/UpdateLobbyEvent.ts | 6 ++--- web/src/App.tsx | 29 ++++++++++++++++++--- web/src/pages/lobby/LobbyPage.scss | 10 ++++++- web/src/pages/lobby/LobbyPage.tsx | 23 +++++++++++++--- 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/interface/server-events/UpdateLobbyEvent.ts b/interface/server-events/UpdateLobbyEvent.ts index 90f696a..2f0881d 100644 --- a/interface/server-events/UpdateLobbyEvent.ts +++ b/interface/server-events/UpdateLobbyEvent.ts @@ -3,12 +3,12 @@ import { ServerEvent } from "./ServerEvent"; export type UpdateLobbyEvent = { playerNames: Array; + gameCode: string; }; export function attachHandlerToUpdateLobbyEvent( socket: Socket, handler: (event: UpdateLobbyEvent) => void, -): () => void { - socket.on(ServerEvent.LOBBY_UPDATE, handler); - return () => socket.off(ServerEvent.LOBBY_UPDATE, handler); +): void { + socket.once(ServerEvent.LOBBY_UPDATE, handler); } diff --git a/web/src/App.tsx b/web/src/App.tsx index ac08d68..7b878b6 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,20 +1,43 @@ -import React from "react"; +import React, { useCallback, useState } from "react"; import { Socket } from "socket.io-client"; import LandingPage from "./pages/landing/LandingPage"; import GamePage from "./pages/game/GamePage"; import LobbyPage from "./pages/lobby/LobbyPage"; +import { attachHandlerToUpdateLobbyEvent } from "interface"; export interface AppProps { socket: Socket; } const App = (props: AppProps) => { - const renderedPage: string = "LOBBY"; + const { socket } = props; + const [renderedPage, setRenderedPage] = useState("LANDING"); + + const [initialPlayerNames, setInitialPlayerNames] = useState([""]); + const [gameCode, setGameCode] = useState(""); + + const setupNextPageTransition = useCallback(() => { + if (renderedPage === "LANDING") { + attachHandlerToUpdateLobbyEvent(socket, (event) => { + setInitialPlayerNames(event.playerNames); + setGameCode(event.gameCode); + setRenderedPage("LOBBY"); + }); + } + }, [renderedPage]); + + setupNextPageTransition(); return (
{renderedPage === "LANDING" && } - {renderedPage === "LOBBY" && } + {renderedPage === "LOBBY" && ( + + )} {renderedPage === "GAME" && }
); diff --git a/web/src/pages/lobby/LobbyPage.scss b/web/src/pages/lobby/LobbyPage.scss index 226320d..5a935f7 100644 --- a/web/src/pages/lobby/LobbyPage.scss +++ b/web/src/pages/lobby/LobbyPage.scss @@ -35,8 +35,16 @@ border-radius: 10px; } + .game-code { + margin: 0 auto 10px; + padding: 10px; + width: 60%; + border: 2px solid blue; + border-radius: 10px; + } + .start-game-button { - margin-top: 30px; + margin: 30px 0; } } } diff --git a/web/src/pages/lobby/LobbyPage.tsx b/web/src/pages/lobby/LobbyPage.tsx index 231027a..e92f168 100644 --- a/web/src/pages/lobby/LobbyPage.tsx +++ b/web/src/pages/lobby/LobbyPage.tsx @@ -1,7 +1,21 @@ +import { useState } from "react"; import "./LobbyPage.scss"; +import { Socket } from "socket.io-client"; +import { attachHandlerToUpdateLobbyEvent } from "interface"; -const LobbyPage = () => { - const userNames = ["Laura", "Miguel", "David"]; +export interface LobbyPageProps { + initialPlayerNames: string[]; + gameCode: string; + socket: Socket; +} + +const LobbyPage = (props: LobbyPageProps) => { + const { initialPlayerNames, gameCode, socket } = props; + const [playerNames, setPlayerNames] = useState(initialPlayerNames); + + attachHandlerToUpdateLobbyEvent(socket, (event) => { + setPlayerNames(event.playerNames); + }); return (
@@ -9,12 +23,13 @@ const LobbyPage = () => {

Trains And Roads

- {userNames.map((name) => ( -
{name}
+ {playerNames.map((name) => ( +
{name}
))}
+
Game code: {gameCode}
);