Skip to content

Commit 5379fb9

Browse files
committed
fix(client): Restore GameRoom useEffect and re-apply move logic
This commit fixes a major regression introduced in the previous commit where the `useEffect` hook in `GameRoom.jsx` was accidentally deleted. This caused the component to fail to connect to the room state, resulting in player profiles not being displayed. The fix involves: 1. **Restoring `useEffect`:** The original `useEffect` hook, which contains all the critical logic for setting up `onStateChange` and other message listeners, has been restored. 2. **Re-applying Move Logic:** The state and handlers for interactive checker movement (`selectedPoint`, `handlePointClick`, etc.) have been correctly re-inserted into the component without interfering with the `useEffect` hook. This resolves the issue of player profiles showing as '...waiting...' and ensures that both the game state synchronization and the interactive move functionality work correctly.
1 parent fab7228 commit 5379fb9

1 file changed

Lines changed: 88 additions & 2 deletions

File tree

client/src/screens/GameRoom/GameRoom.jsx

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,92 @@ const GameRoom = ({ roomId, onQuit, currentUser }) => {
7373
setDebugMessage('Mock mode active: using local state');
7474
return undefined;
7575
}
76-
// ... (rest of useEffect)
76+
77+
setDebugMessage('1. GameRoom mounted. Getting room instance...');
78+
const roomInstance = colyseusService.getGameRoom();
79+
console.log('GameRoom: roomInstance =', roomInstance);
80+
console.log('GameRoom: roomInstance.roomId =', roomInstance?.roomId);
81+
console.log('GameRoom: expected roomId =', roomId);
82+
83+
if (roomInstance && roomInstance.roomId === roomId) {
84+
setDebugMessage('2. Got room instance. Setting room state.');
85+
86+
// Регистрируем обработчики ДО установки room в state
87+
setDebugMessage('3. Attaching event listeners...');
88+
roomInstance.onStateChange((newState) => {
89+
console.log("New game state received:", newState);
90+
if (newState) {
91+
// Colyseus Schema объекты имеют свойства, к которым можно обращаться напрямую
92+
const transformedState = {
93+
board: newState.board || new Map(),
94+
bar: newState.bar || new Map(),
95+
off: newState.off || new Map(),
96+
currentPlayer: newState.currentPlayer || '',
97+
dice: newState.dice ? Array.from(newState.dice) : [],
98+
winner: newState.winner || '',
99+
possibleMoves: newState.possibleMoves ? Array.from(newState.possibleMoves) : [],
100+
players: newState.players
101+
? new Map(Array.from(newState.players.entries()))
102+
: new Map(),
103+
playerProfiles: newState.playerProfiles
104+
? new Map(Array.from(newState.playerProfiles.entries()))
105+
: new Map(),
106+
};
107+
console.log("Transformed state:", transformedState);
108+
setGameState(transformedState);
109+
110+
// Определяем цвет текущего игрока
111+
if (newState.players && roomInstance.sessionId) {
112+
const myColor = newState.players.get(roomInstance.sessionId);
113+
if (myColor) {
114+
console.log("Setting player color:", myColor);
115+
setPlayerColor(myColor);
116+
}
117+
}
118+
} else {
119+
console.log("Invalid state received:", newState);
120+
}
121+
});
122+
123+
roomInstance.onMessage("error", (message) => {
124+
setDebugMessage(`ERROR: Server sent an error: ${JSON.stringify(message)}`);
125+
console.error("Server error:", message)
126+
});
127+
128+
roomInstance.onMessage("state_update", (stateData) => {
129+
console.log("Manual state update received:", stateData);
130+
// Преобразуем массивы entries обратно в Map
131+
const transformedState = {
132+
board: new Map(stateData.board || []),
133+
bar: new Map(stateData.bar || []),
134+
off: new Map(stateData.off || []),
135+
currentPlayer: stateData.currentPlayer || '',
136+
dice: stateData.dice || [],
137+
winner: stateData.winner || '',
138+
possibleMoves: stateData.possibleMoves || [],
139+
players: new Map(stateData.players || []),
140+
playerProfiles: new Map(stateData.playerProfiles || []),
141+
};
142+
setGameState(transformedState);
143+
setDebugMessage('Manual state update applied');
144+
});
145+
146+
setRoom(roomInstance);
147+
} else {
148+
setDebugMessage(`ERROR: Could not find room instance! Expected ${roomId}, found ${roomInstance ? roomInstance.roomId : 'null'}`);
149+
onQuit();
150+
}
151+
152+
// Cleanup: закрываем соединение только если это не первый StrictMode remount
153+
return () => {
154+
if (isInitialMount.current) {
155+
isInitialMount.current = false;
156+
console.log('GameRoom: StrictMode cleanup, not leaving room');
157+
} else {
158+
console.log('GameRoom: Real unmount, leaving room');
159+
colyseusService.leaveGameRoom();
160+
}
161+
};
77162
}, [roomId, onQuit, isMockMode]);
78163

79164
const handlePointClick = (pointId) => {
@@ -130,6 +215,7 @@ const GameRoom = ({ roomId, onQuit, currentUser }) => {
130215
}
131216
};
132217

218+
133219
const pointRenderOrder = {
134220
left: [13, 14, 15, 16, 17, 18, 12, 11, 10, 9, 8, 7],
135221
right: [19, 20, 21, 22, 23, 24, 6, 5, 4, 3, 2, 1],
@@ -285,4 +371,4 @@ GameRoom.defaultProps = {
285371
currentUser: null,
286372
};
287373

288-
export default GameRoom;
374+
export default GameRoom;

0 commit comments

Comments
 (0)