import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import api from '../api/axios'; function Picker() { const { isAuthenticated } = useAuth(); const navigate = useNavigate(); const [activeSession, setActiveSession] = useState(null); const [allGames, setAllGames] = useState([]); const [selectedGame, setSelectedGame] = useState(null); const [loading, setLoading] = useState(true); const [picking, setPicking] = useState(false); const [error, setError] = useState(''); // Filters const [playerCount, setPlayerCount] = useState(''); const [drawingFilter, setDrawingFilter] = useState('both'); const [lengthFilter, setLengthFilter] = useState(''); const [familyFriendlyFilter, setFamilyFriendlyFilter] = useState(''); // Manual game selection const [showManualSelect, setShowManualSelect] = useState(false); const [manualGameId, setManualGameId] = useState(''); useEffect(() => { if (!isAuthenticated) { navigate('/login'); return; } loadData(); }, [isAuthenticated, navigate]); const loadData = async () => { try { // Load active session or create one try { const sessionResponse = await api.get('/sessions/active'); setActiveSession(sessionResponse.data); } catch (err) { // No active session, create one const newSession = await api.post('/sessions', {}); setActiveSession(newSession.data); } // Load all games for manual selection const gamesResponse = await api.get('/games'); setAllGames(gamesResponse.data); } catch (err) { setError('Failed to load session data'); } finally { setLoading(false); } }; const handlePickGame = async () => { if (!activeSession) return; setPicking(true); setError(''); try { const response = await api.post('/pick', { sessionId: activeSession.id, playerCount: playerCount ? parseInt(playerCount) : undefined, drawing: drawingFilter !== 'both' ? drawingFilter : undefined, length: lengthFilter || undefined, familyFriendly: familyFriendlyFilter ? familyFriendlyFilter === 'yes' : undefined }); setSelectedGame(response.data.game); } catch (err) { setError(err.response?.data?.error || 'Failed to pick a game'); setSelectedGame(null); } finally { setPicking(false); } }; const handleAcceptGame = async () => { if (!selectedGame || !activeSession) return; try { await api.post(`/sessions/${activeSession.id}/games`, { game_id: selectedGame.id, manually_added: false }); // Reload data await loadData(); setSelectedGame(null); setError(''); } catch (err) { setError('Failed to add game to session'); } }; const handleAddManualGame = async () => { if (!manualGameId || !activeSession) return; try { await api.post(`/sessions/${activeSession.id}/games`, { game_id: parseInt(manualGameId), manually_added: true }); // Reload data await loadData(); setManualGameId(''); setShowManualSelect(false); setError(''); } catch (err) { setError('Failed to add game to session'); } }; if (loading) { return (
Loading...
); } if (!activeSession) { return (
Failed to load or create session. Please try again.
); } return (

Game Picker

{/* Filters Panel */}

Filters

setPlayerCount(e.target.value)} className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" placeholder="Any" />
{/* Results Panel */}
{error && (
{error}
)} {selectedGame && (

{selectedGame.title}

{selectedGame.pack_name}

Players: {selectedGame.min_players}-{selectedGame.max_players}
Length: {selectedGame.length_minutes ? `${selectedGame.length_minutes} min` : 'Unknown'}
Type: {selectedGame.game_type || 'N/A'}
Family Friendly: {selectedGame.family_friendly ? 'Yes' : 'No'}
Play Count: {selectedGame.play_count}
Popularity: {selectedGame.popularity_score > 0 ? '+' : ''} {selectedGame.popularity_score}
)} {showManualSelect && (

Manual Game Selection

)} {/* Session info and games */}
); } function SessionInfo({ sessionId }) { const [games, setGames] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { loadGames(); }, [sessionId]); const loadGames = async () => { try { const response = await api.get(`/sessions/${sessionId}/games`); setGames(response.data); } catch (err) { console.error('Failed to load session games'); } finally { setLoading(false); } }; return (

Games Played This Session ({games.length})

{loading ? (

Loading...

) : games.length === 0 ? (

No games played yet. Pick a game to get started!

) : (
{games.map((game, index) => (
{index + 1}. {game.title} ({game.pack_name}) {game.manually_added === 1 && ( Manual )}
{new Date(game.played_at).toLocaleTimeString()}
))}
)}
); } export default Picker;