import React, { useEffect, useState } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { useRoom } from '../hooks/useRoom'; import { questionsApi } from '../services/api'; import QRCode from 'qrcode'; import QRModal from '../components/QRModal'; import NameInputModal from '../components/NameInputModal'; const RoomPage = () => { const { roomCode } = useParams(); const navigate = useNavigate(); const { user, loginAnonymous, loading: authLoading } = useAuth(); const { room, participants, loading, error, joinRoom, startGame, updateQuestionPack, } = useRoom(roomCode); const [qrCode, setQrCode] = useState(''); const [joined, setJoined] = useState(false); const [isQRModalOpen, setIsQRModalOpen] = useState(false); const [isNameModalOpen, setIsNameModalOpen] = useState(false); const [questionPacks, setQuestionPacks] = useState([]); const [selectedPackId, setSelectedPackId] = useState(''); const [loadingPacks, setLoadingPacks] = useState(false); const [updatingPack, setUpdatingPack] = useState(false); useEffect(() => { const generateQR = async () => { try { // Используем абсолютный URL с протоколом для работы из любого приложения const origin = window.location.origin || `${window.location.protocol}//${window.location.host}`; const url = `${origin}/join-room?code=${roomCode}`; const qr = await QRCode.toDataURL(url, { errorCorrectionLevel: 'M', type: 'image/png', quality: 0.92, margin: 1, }); setQrCode(qr); } catch (err) { console.error('QR generation error:', err); } }; if (roomCode) { generateQR(); } }, [roomCode]); // Проверка авторизации и показ модального окна для ввода имени useEffect(() => { if (!authLoading && !user && room && !loading) { setIsNameModalOpen(true); } else if (user) { setIsNameModalOpen(false); } }, [authLoading, user, room, loading]); // Обработка ввода имени и авторизация const handleNameSubmit = async (name) => { try { await loginAnonymous(name); setIsNameModalOpen(false); } catch (error) { console.error('Login error:', error); alert('Ошибка при авторизации. Попробуйте еще раз.'); } }; useEffect(() => { const handleJoin = async () => { if (room && user && !joined) { const isParticipant = participants.some((p) => p.userId === user.id); if (!isParticipant) { try { await joinRoom(room.id, user.id, user.name || 'Гость', 'PLAYER'); setJoined(true); } catch (error) { console.error('Join error:', error); } } else { setJoined(true); } } }; handleJoin(); }, [room, user, participants, joined, joinRoom]); useEffect(() => { const fetchPacks = async () => { if (user) { try { setLoadingPacks(true); const response = await questionsApi.getPacks(user.id); setQuestionPacks(response.data); } catch (error) { console.error('Error fetching question packs:', error); } finally { setLoadingPacks(false); } } }; if (room && user && room.hostId === user.id) { fetchPacks(); } }, [room, user]); useEffect(() => { if (room && room.questionPackId) { setSelectedPackId(room.questionPackId); } else { setSelectedPackId(''); } }, [room]); const handleStartGame = () => { startGame(); navigate(`/game/${roomCode}`); }; const handleUpdateQuestionPack = async () => { if (!selectedPackId) { alert('Выберите пак вопросов'); return; } try { setUpdatingPack(true); await updateQuestionPack(selectedPackId); alert('Пак вопросов успешно добавлен'); } catch (error) { console.error('Error updating question pack:', error); alert('Ошибка при обновлении пака вопросов'); } finally { setUpdatingPack(false); } }; if (loading) { return
Загрузка комнаты...
; } if (error) { return (

Ошибка

{error}

); } if (!room) { return (

Комната не найдена

); } const isHost = user && room.hostId === user.id; return (

Комната: {room.code}

Статус: {room.status === 'WAITING' ? 'Ожидание игроков' : room.status}

Игроков: {participants.length}/{room.maxPlayers}

Участники:

    {participants.map((participant) => (
  • {participant.name} {participant.role === 'HOST' && '(Ведущий)'} {participant.role === 'SPECTATOR' && '(Зритель)'}
  • ))}

Пак вопросов:

{room.questionPack ? (

{room.questionPack.name} ( {room.questionPack.questionCount || 0} вопросов)

{isHost && (

Можете изменить пак вопросов в любой момент

)}
) : (

Пак вопросов не выбран. Вы можете начать игру без пака и добавить его позже.

)} {isHost && (
)}
{isHost && (room.status === 'WAITING' || (room.status === 'PLAYING' && (!room.questionPack || room.questionPack.questionCount === 0 || room.currentQuestionIndex === 0))) && ( )}
setIsQRModalOpen(false)} qrCode={qrCode} roomCode={roomCode} />
); }; export default RoomPage;