🎮 Fix question selection, add score editing, media host-only playback

- Fix: select questions by questionIndex instead of points (fixes same-points categories)
- Fix: persist questionIndex in MongoDB schema for game state recovery
- Fix: update scores in UI on wrong answer
- Add: host can manually adjust team scores
- Add: audio/video plays only on host device
- Add: replay button for host after media ends
- Fix: answer media modal shown only to host
This commit is contained in:
Cosmo
2026-03-22 10:21:51 +00:00
parent c5e1344610
commit ddad7f2126
9 changed files with 166 additions and 50 deletions

View File

@@ -52,14 +52,28 @@ function QuestionModal({ question, timer, onSubmitAnswer, answeringTeamName, isH
<div className="flex items-center justify-center mb-4">
<div className="text-5xl md:text-7xl animate-pulse-slow">🎵</div>
</div>
<audio ref={audioRef} controls autoPlay src={getMediaUrl(question.question)}
className="w-full mb-4" onEnded={handleMediaEnded}>
Ваш браузер не поддерживает аудио элемент.
</audio>
{isHost ? (
<>
<audio ref={audioRef} controls autoPlay src={getMediaUrl(question.question)}
className="w-full mb-4" onEnded={handleMediaEnded}>
Ваш браузер не поддерживает аудио элемент.
</audio>
{mediaEnded && (
<button onClick={() => { if (audioRef.current) { audioRef.current.currentTime = 0; audioRef.current.play(); setMediaEnded(false); } }}
className="w-full bg-gradient-to-r from-indigo-600/60 to-purple-600/60 hover:from-indigo-500/80 hover:to-purple-500/80 text-white font-bold py-2.5 rounded-xl text-sm md:text-base transition-all border border-indigo-400/30 mb-4">
🔄 Проиграть заново
</button>
)}
</>
) : (
<p className="text-indigo-300 text-base md:text-xl text-center mb-4">
🔊 Ведущий проигрывает аудио...
</p>
)}
{question.questionText && (
<p className="text-white text-base md:text-2xl text-center mt-4">{question.questionText}</p>
)}
{!mediaEnded && (
{isHost && !mediaEnded && (
<p className="text-amber-300/80 text-sm md:text-base text-center mt-2">
Таймер начнется после прослушивания
</p>
@@ -69,14 +83,28 @@ function QuestionModal({ question, timer, onSubmitAnswer, answeringTeamName, isH
case 'video':
return (
<div className={wrapperClass}>
<video ref={videoRef} controls autoPlay src={getMediaUrl(question.question)}
className="max-w-full max-h-64 md:max-h-96 mx-auto rounded-xl mb-4 shadow-lg" onEnded={handleMediaEnded}>
Ваш браузер не поддерживает видео элемент.
</video>
{isHost ? (
<>
<video ref={videoRef} controls autoPlay src={getMediaUrl(question.question)}
className="max-w-full max-h-64 md:max-h-96 mx-auto rounded-xl mb-4 shadow-lg" onEnded={handleMediaEnded}>
Ваш браузер не поддерживает видео элемент.
</video>
{mediaEnded && (
<button onClick={() => { if (videoRef.current) { videoRef.current.currentTime = 0; videoRef.current.play(); setMediaEnded(false); } }}
className="w-full bg-gradient-to-r from-indigo-600/60 to-purple-600/60 hover:from-indigo-500/80 hover:to-purple-500/80 text-white font-bold py-2.5 rounded-xl text-sm md:text-base transition-all border border-indigo-400/30 mb-4">
🔄 Проиграть заново
</button>
)}
</>
) : (
<p className="text-indigo-300 text-base md:text-xl text-center mb-4">
🔊 Ведущий проигрывает видео...
</p>
)}
{question.questionText && (
<p className="text-white text-base md:text-2xl text-center mt-4">{question.questionText}</p>
)}
{!mediaEnded && (
{isHost && !mediaEnded && (
<p className="text-amber-300/80 text-sm md:text-base text-center mt-2">
Таймер начнется после просмотра
</p>