import React, { useState } from 'react'; import { GameData, GameState, Player, Question } from '../types'; interface AdminDashboardProps { game: GameData; updateGame: (data: Partial) => void; } const AdminDashboard: React.FC = ({ game, updateGame }) => { const [activeTab, setActiveTab] = useState<'control' | 'lobby' | 'questions'>('control'); const approvePlayer = (id: string) => { const updated = game.players.map(p => p.id === id ? { ...p, status: 'APPROVED' } : p); updateGame({ players: updated as Player[] }); }; const startGame = () => { updateGame({ state: GameState.LOBBY }); }; const startCountdown = () => { updateGame({ state: GameState.COUNTDOWN, countdownValue: 3 }); let count = 3; const interval = setInterval(() => { count -= 1; if (count <= 0) { clearInterval(interval); updateGame({ state: GameState.QUESTION, countdownValue: 0, activeBuzzerQueue: [] }); } else { updateGame({ countdownValue: count }); } }, 1000); }; const adjudicate = (isCorrect: boolean) => { const firstBuzzer = game.activeBuzzerQueue[0]; if (!firstBuzzer) return; const currentQ = game.questions[game.currentQuestionIndex]; if (isCorrect) { const updatedPlayers = game.players.map(p => { if (p.id === firstBuzzer.playerId) { return { ...p, score: p.score + currentQ.points, correctAnswers: p.correctAnswers + 1 }; } return p; }); updateGame({ state: GameState.REVEAL, players: updatedPlayers as Player[] }); } else { const updatedQueue = game.activeBuzzerQueue.slice(1); const updatedPlayers = game.players.map(p => { if (p.id === firstBuzzer.playerId) { return { ...p, wrongAnswers: p.wrongAnswers + 1 }; } return p; }); updateGame({ activeBuzzerQueue: updatedQueue, players: updatedPlayers as Player[] }); } }; const nextQuestion = () => { const nextIdx = game.currentQuestionIndex + 1; if (nextIdx >= game.questions.length) { updateGame({ state: GameState.FINAL_STATS }); } else { updateGame({ state: GameState.SCOREBOARD, currentQuestionIndex: nextIdx }); } }; const currentQ = game.questions[game.currentQuestionIndex]; return (
{/* Sidebar */}
HOST PANEL
{/* Main Area */}
{activeTab === 'lobby' && (

Lobby Management

{game.players.map(p => (
{p.name}
Team: {p.teamId}
{p.status === 'PENDING' ? ( ) : ( ACTIVE )}
))}
{game.state === GameState.LOBBY && ( )}
)} {activeTab === 'control' && (

Question {game.currentQuestionIndex + 1}

{currentQ.text}

A: {currentQ.answer}

Points Value
{currentQ.points}
{/* Controls */}

Game Actions

Adjudication

{/* Buzzer Queue */}

Buzzer Queue

{game.activeBuzzerQueue.length === 0 &&
Waiting for buzzes...
} {game.activeBuzzerQueue.map((buzz, i) => { const p = game.players.find(pl => pl.id === buzz.playerId); return (
{i + 1} {p?.name || 'Unknown'}
{buzz.timestamp % 10000}ms
); })}
)}
); }; const NavBtn: React.FC<{ active: boolean; label: string; onClick: () => void }> = ({ active, label, onClick }) => ( ); const SoundBtn: React.FC<{ label: string; color: string }> = ({ label, color }) => ( ); export default AdminDashboard;