Create page transition from lobby to in-game

landing-page-layout
MiguelMLorente 2025-02-09 15:24:43 +01:00
parent 8a4593b542
commit 9fbfe40f7f
4 changed files with 26 additions and 3 deletions

View File

@ -7,6 +7,7 @@ export * from "./constants/TrackType";
export * from "./server-events/CreateLobbyError"; export * from "./server-events/CreateLobbyError";
export * from "./server-events/ServerError"; export * from "./server-events/ServerError";
export * from "./server-events/ServerEvent"; export * from "./server-events/ServerEvent";
export * from "./server-events/StartRoundEvent";
export * from "./server-events/UpdateLobbyEvent"; export * from "./server-events/UpdateLobbyEvent";
export * from "./client-events/ClientEvent"; export * from "./client-events/ClientEvent";
export * from "./client-events/CreateLobbyEvent"; export * from "./client-events/CreateLobbyEvent";

View File

@ -0,0 +1,14 @@
import { Socket } from "socket.io-client";
import { ServerEvent } from "./ServerEvent";
import { PieceId } from "../constants/Pieces";
export type StartRoundEvent = {
pieceIds: PieceId[];
};
export function attachHandlerToStartRoundEvent(
socket: Socket,
handler: (event: StartRoundEvent) => void,
): void {
socket.once(ServerEvent.START_ROUND, handler);
}

View File

@ -4,7 +4,10 @@ import LandingPage from "./pages/landing/LandingPage";
import GamePage from "./pages/game/GamePage"; import GamePage from "./pages/game/GamePage";
import "./App.scss"; import "./App.scss";
import LobbyPage from "./pages/lobby/LobbyPage"; import LobbyPage from "./pages/lobby/LobbyPage";
import { attachHandlerToUpdateLobbyEvent } from "interface"; import {
attachHandlerToStartRoundEvent,
attachHandlerToUpdateLobbyEvent,
} from "interface";
export interface AppProps { export interface AppProps {
socket: Socket; socket: Socket;
@ -24,6 +27,10 @@ const App = (props: AppProps) => {
setGameCode(event.gameCode); setGameCode(event.gameCode);
setRenderedPage("LOBBY"); setRenderedPage("LOBBY");
}); });
} else if (renderedPage === "LOBBY") {
attachHandlerToStartRoundEvent(socket, (event) => {
setRenderedPage("GAME");
});
} }
}, [renderedPage]); }, [renderedPage]);

View File

@ -1,7 +1,7 @@
import { useState } from "react"; import { useState } from "react";
import "./LobbyPage.scss"; import "./LobbyPage.scss";
import { Socket } from "socket.io-client"; import { Socket } from "socket.io-client";
import { attachHandlerToUpdateLobbyEvent } from "interface"; import { attachHandlerToUpdateLobbyEvent, ClientEvent } from "interface";
export interface LobbyPageProps { export interface LobbyPageProps {
initialPlayerNames: string[]; initialPlayerNames: string[];
@ -16,6 +16,7 @@ const LobbyPage = (props: LobbyPageProps) => {
attachHandlerToUpdateLobbyEvent(socket, (event) => { attachHandlerToUpdateLobbyEvent(socket, (event) => {
setPlayerNames(event.playerNames); setPlayerNames(event.playerNames);
}); });
const startGame = () => socket.emit(ClientEvent.START_GAME);
return ( return (
<div className="lobby-page"> <div className="lobby-page">
@ -27,7 +28,7 @@ const LobbyPage = (props: LobbyPageProps) => {
<article className="lobby-user-name">{name}</article> <article className="lobby-user-name">{name}</article>
))} ))}
<div className="start-game-button"> <div className="start-game-button">
<button>Start Game</button> <button onClick={startGame}>Start Game</button>
</div> </div>
<article className="game-code">Game code: {gameCode}</article> <article className="game-code">Game code: {gameCode}</article>
</div> </div>