This commit is contained in:
Dmitry 2026-01-11 00:30:43 +03:00
parent 58caf2470e
commit 13ecd4ff57
3 changed files with 25 additions and 9 deletions

View file

@ -130,9 +130,10 @@
grid-auto-rows: minmax(auto, clamp(120px, 18vh, 200px)); grid-auto-rows: minmax(auto, clamp(120px, 18vh, 200px));
column-gap: clamp(6px, 1.2vw, 12px); column-gap: clamp(6px, 1.2vw, 12px);
row-gap: clamp(6px, 0.8vh, 12px); row-gap: clamp(6px, 0.8vh, 12px);
flex: 1; flex: 1 1 0;
min-height: 0; min-height: 0;
overflow-y: auto; overflow-y: auto;
align-content: start;
/* Scrollbar styling */ /* Scrollbar styling */
scrollbar-width: thin; scrollbar-width: thin;
scrollbar-color: rgba(255, 215, 0, 0.5) rgba(255, 255, 255, 0.1); scrollbar-color: rgba(255, 215, 0, 0.5) rgba(255, 255, 255, 0.1);
@ -153,7 +154,11 @@
@media (max-width: 768px) { @media (max-width: 768px) {
.answers-grid { .answers-grid {
grid-template-columns: 1fr; grid-template-columns: 1fr;
grid-auto-rows: minmax(auto, clamp(100px, 15vh, 140px)); grid-auto-rows: minmax(100px, clamp(100px, 15vh, 140px));
}
.question-container {
max-height: 100%;
} }
} }

View file

@ -133,11 +133,12 @@ export const useRoom = (roomCode, onGameStarted = null, password = null) => {
const response = await roomsApi.join(roomId, userId, name, role); const response = await roomsApi.join(roomId, userId, name, role);
// После успешного присоединения запрашиваем полное состояние через WebSocket // После успешного присоединения запрашиваем полное состояние через WebSocket
// Это гарантирует получение актуального состояния (список игроков, тема, voiceMode) // Это гарантирует получение актуального состояния от сервера (список игроков, тема, voiceMode)
if (response.data?.code) { // НЕ обновляем состояние локально - полагаемся только на серверные обновления для консистентности
if (roomCode) {
// Небольшая задержка, чтобы убедиться, что WebSocket подключен // Небольшая задержка, чтобы убедиться, что WebSocket подключен
setTimeout(() => { setTimeout(() => {
socketService.emit('requestFullState', { roomCode: response.data.code }); socketService.emit('requestFullState', { roomCode });
}, 100); }, 100);
} }
@ -146,7 +147,7 @@ export const useRoom = (roomCode, onGameStarted = null, password = null) => {
setError(err.message); setError(err.message);
throw err; throw err;
} }
}, []); }, [roomCode]);
const startGame = useCallback(() => { const startGame = useCallback(() => {
if (room && user) { if (room && user) {

View file

@ -141,11 +141,13 @@ const RoomPage = () => {
const isParticipant = participants.some((p) => p.userId === user.id); const isParticipant = participants.some((p) => p.userId === user.id);
if (!isParticipant) { if (!isParticipant) {
// Если зрители не разрешены, присоединяемся как PLAYER автоматически // Если зрители не разрешены, присоединяемся как PLAYER автоматически
// Присоединение разрешено независимо от статуса игры (WAITING, PLAYING, FINISHED)
if (!room.allowSpectators) { if (!room.allowSpectators) {
try { try {
setJoinError(null); setJoinError(null);
await joinRoom(room.id, user.id, user.name || 'Гость', 'PLAYER'); await joinRoom(room.id, user.id, user.name || 'Гость', 'PLAYER');
setJoined(true); setJoined(true);
// Если игра уже началась, перенаправление произойдет после обновления participants
} catch (error) { } catch (error) {
console.error('Join error:', error); console.error('Join error:', error);
const errorMessage = error.response?.data?.message || error.message || 'Ошибка при присоединении к комнате'; const errorMessage = error.response?.data?.message || error.message || 'Ошибка при присоединении к комнате';
@ -163,6 +165,7 @@ const RoomPage = () => {
}, [room, user, participants, joined, joinRoom, isRoleSelectionModalOpen]); }, [room, user, participants, joined, joinRoom, isRoleSelectionModalOpen]);
// Обработка выбора роли // Обработка выбора роли
// Присоединение разрешено независимо от статуса игры (WAITING, PLAYING, FINISHED)
const handleRoleSubmit = async (role) => { const handleRoleSubmit = async (role) => {
if (!room || !user) return; if (!room || !user) return;
@ -172,6 +175,7 @@ const RoomPage = () => {
await joinRoom(room.id, user.id, user.name || 'Гость', role); await joinRoom(room.id, user.id, user.name || 'Гость', role);
setSelectedRole(role); setSelectedRole(role);
setJoined(true); setJoined(true);
// Если игра уже началась, перенаправление произойдет после обновления participants
} catch (error) { } catch (error) {
console.error('Join error:', error); console.error('Join error:', error);
const errorMessage = error.response?.data?.message || error.message || 'Ошибка при присоединении к комнате'; const errorMessage = error.response?.data?.message || error.message || 'Ошибка при присоединении к комнате';
@ -206,11 +210,17 @@ const RoomPage = () => {
}, [room, user, participants]); }, [room, user, participants]);
// Автоматически перенаправляем на страницу игры, если игра уже началась // Автоматически перенаправляем на страницу игры, если игра уже началась
// Важно: перенаправляем только если игрок уже присоединился (joined === true)
// и он есть в списке участников, чтобы избежать перенаправления до добавления игрока
useEffect(() => { useEffect(() => {
if (room && room.status === 'PLAYING') { if (room && room.status === 'PLAYING' && joined && user) {
const isParticipant = participants.some((p) => p.userId === user.id);
// Перенаправляем только если игрок действительно присоединился
if (isParticipant) {
navigate(`/game/${roomCode}`); navigate(`/game/${roomCode}`);
} }
}, [room, roomCode, navigate]); }
}, [room, roomCode, navigate, joined, user, participants]);
// Применяем тему из gameStateUpdated/roomUpdate // Применяем тему из gameStateUpdated/roomUpdate
useEffect(() => { useEffect(() => {