Use server response to consume dice as defined by the backend

pull/14/head
MiguelMLorente 2025-02-09 15:45:07 +01:00
parent 09bd13f772
commit 10949f30df
4 changed files with 40 additions and 16 deletions

View File

@ -1,4 +1,5 @@
import { Socket } from "socket.io-client"; import { Socket as ServerSocket } from "socket.io";
import { Socket as ClientSocket } from "socket.io-client";
import { ServerEvent } from "./ServerEvent"; import { ServerEvent } from "./ServerEvent";
import { PieceId } from "../constants/Pieces"; import { PieceId } from "../constants/Pieces";
@ -6,8 +7,15 @@ export type StartRoundEvent = {
pieceIds: PieceId[]; pieceIds: PieceId[];
}; };
export const emitStartRoundEvent = (
socket: ServerSocket,
payload: StartRoundEvent,
) => {
socket.emit(ServerEvent.START_ROUND, payload);
};
export function attachHandlerToStartRoundEvent( export function attachHandlerToStartRoundEvent(
socket: Socket, socket: ClientSocket,
handler: (event: StartRoundEvent) => void, handler: (event: StartRoundEvent) => void,
): void { ): void {
socket.once(ServerEvent.START_ROUND, handler); socket.once(ServerEvent.START_ROUND, handler);

View File

@ -1,4 +1,5 @@
import { Socket } from "socket.io-client"; import { Socket as ServerSocket } from "socket.io";
import { Socket as ClientSocket } from "socket.io-client";
import { ServerEvent } from "./ServerEvent"; import { ServerEvent } from "./ServerEvent";
export type UpdateLobbyEvent = { export type UpdateLobbyEvent = {
@ -6,8 +7,15 @@ export type UpdateLobbyEvent = {
gameCode: string; gameCode: string;
}; };
export const emitUpdateLobbyEvent = (
socket: ServerSocket,
payload: UpdateLobbyEvent,
) => {
socket.emit(ServerEvent.LOBBY_UPDATE, payload);
};
export function attachHandlerToUpdateLobbyEvent( export function attachHandlerToUpdateLobbyEvent(
socket: Socket, socket: ClientSocket,
handler: (event: UpdateLobbyEvent) => void, handler: (event: UpdateLobbyEvent) => void,
): void { ): void {
socket.once(ServerEvent.LOBBY_UPDATE, handler); socket.once(ServerEvent.LOBBY_UPDATE, handler);

View File

@ -6,6 +6,7 @@ import LobbyPage from "./pages/lobby/LobbyPage";
import { import {
attachHandlerToStartRoundEvent, attachHandlerToStartRoundEvent,
attachHandlerToUpdateLobbyEvent, attachHandlerToUpdateLobbyEvent,
PieceId,
} from "interface"; } from "interface";
export interface AppProps { export interface AppProps {
@ -16,8 +17,9 @@ const App = (props: AppProps) => {
const { socket } = props; const { socket } = props;
const [renderedPage, setRenderedPage] = useState("LANDING"); const [renderedPage, setRenderedPage] = useState("LANDING");
const [initialPlayerNames, setInitialPlayerNames] = useState([""]); const [initialPlayerNames, setInitialPlayerNames] = useState([] as string[]);
const [gameCode, setGameCode] = useState(""); const [gameCode, setGameCode] = useState("");
const [initialPieceIds, setInitialPieceIds] = useState([] as PieceId[]);
const setupNextPageTransition = useCallback(() => { const setupNextPageTransition = useCallback(() => {
if (renderedPage === "LANDING") { if (renderedPage === "LANDING") {
@ -28,6 +30,7 @@ const App = (props: AppProps) => {
}); });
} else if (renderedPage === "LOBBY") { } else if (renderedPage === "LOBBY") {
attachHandlerToStartRoundEvent(socket, (event) => { attachHandlerToStartRoundEvent(socket, (event) => {
setInitialPieceIds(event.pieceIds);
setRenderedPage("GAME"); setRenderedPage("GAME");
}); });
} }
@ -44,7 +47,9 @@ const App = (props: AppProps) => {
gameCode={gameCode} gameCode={gameCode}
/> />
)} )}
{renderedPage === "GAME" && <GamePage />} {renderedPage === "GAME" && (
<GamePage initialPieceIds={initialPieceIds} />
)}
</div> </div>
); );
}; };

View File

@ -6,16 +6,19 @@ import { buildBoard, PieceId } from "interface";
import { DieViewProps } from "./types/DieViewProps"; import { DieViewProps } from "./types/DieViewProps";
import { PlacePieceActionStack } from "./types/PlacePieceActionStack"; import { PlacePieceActionStack } from "./types/PlacePieceActionStack";
const GamePage = () => { export interface GamePageProps {
const getRandomPieceId = () => { initialPieceIds: PieceId[];
const randomId = Math.floor(Math.random() * Object.keys(PieceId).length); }
return Object.values(PieceId)[randomId];
};
const getRandomDiceSet: () => DieViewProps[] = () => const GamePage = (props: GamePageProps) => {
[1, 2, 3, 4].map(() => { const { initialPieceIds } = props;
const [pieceIds] = useState(initialPieceIds);
const getDiceSet: () => DieViewProps[] = () =>
pieceIds.map((pieceId) => {
return { return {
pieceId: getRandomPieceId(), pieceId: pieceId,
isSelected: false, isSelected: false,
isDisabled: false, isDisabled: false,
isSpecial: false, isSpecial: false,
@ -23,7 +26,7 @@ const GamePage = () => {
}; };
}); });
const [dice, setDice] = useState(getRandomDiceSet()); const [dice, setDice] = useState(getDiceSet());
const [specialDice, setSpecialDice] = useState( const [specialDice, setSpecialDice] = useState(
[ [
PieceId.P03, PieceId.P03,
@ -96,7 +99,7 @@ const GamePage = () => {
const commitBoard = () => { const commitBoard = () => {
if (dice.some((die) => !die.isDisabled)) return; if (dice.some((die) => !die.isDisabled)) return;
placePieceActionStack.commitActions(); placePieceActionStack.commitActions();
setDice(getRandomDiceSet()); setDice(getDiceSet());
setSpecialDieUsedInRound(false); setSpecialDieUsedInRound(false);
}; };