import { useState, useEffect } from 'react' import { useParams, useNavigate } from 'react-router-dom' import { marathonsApi, gamesApi } from '@/api' import type { Marathon, Game } from '@/types' import { Button, Input, Card, CardContent, CardHeader, CardTitle } from '@/components/ui' import { useAuthStore } from '@/store/auth' import { Plus, Trash2, Sparkles, Play, Loader2, Gamepad2 } from 'lucide-react' export function LobbyPage() { const { id } = useParams<{ id: string }>() const navigate = useNavigate() const user = useAuthStore((state) => state.user) const [marathon, setMarathon] = useState(null) const [games, setGames] = useState([]) const [isLoading, setIsLoading] = useState(true) // Add game form const [showAddGame, setShowAddGame] = useState(false) const [gameTitle, setGameTitle] = useState('') const [gameUrl, setGameUrl] = useState('') const [gameGenre, setGameGenre] = useState('') const [isAddingGame, setIsAddingGame] = useState(false) // Generate challenges const [isGenerating, setIsGenerating] = useState(false) const [generateMessage, setGenerateMessage] = useState(null) // Start marathon const [isStarting, setIsStarting] = useState(false) useEffect(() => { loadData() }, [id]) const loadData = async () => { if (!id) return try { const [marathonData, gamesData] = await Promise.all([ marathonsApi.get(parseInt(id)), gamesApi.list(parseInt(id)), ]) setMarathon(marathonData) setGames(gamesData) } catch (error) { console.error('Failed to load data:', error) navigate('/marathons') } finally { setIsLoading(false) } } const handleAddGame = async () => { if (!id || !gameTitle.trim() || !gameUrl.trim()) return setIsAddingGame(true) try { await gamesApi.create(parseInt(id), { title: gameTitle.trim(), download_url: gameUrl.trim(), genre: gameGenre.trim() || undefined, }) setGameTitle('') setGameUrl('') setGameGenre('') setShowAddGame(false) await loadData() } catch (error) { console.error('Failed to add game:', error) } finally { setIsAddingGame(false) } } const handleDeleteGame = async (gameId: number) => { if (!confirm('Удалить эту игру?')) return try { await gamesApi.delete(gameId) await loadData() } catch (error) { console.error('Failed to delete game:', error) } } const handleGenerateChallenges = async () => { if (!id) return setIsGenerating(true) setGenerateMessage(null) try { const result = await gamesApi.generateChallenges(parseInt(id)) setGenerateMessage(result.message) await loadData() } catch (error) { console.error('Failed to generate challenges:', error) setGenerateMessage('Не удалось сгенерировать задания') } finally { setIsGenerating(false) } } const handleStartMarathon = async () => { if (!id || !confirm('Начать марафон? После этого нельзя будет добавить новые игры.')) return setIsStarting(true) try { await marathonsApi.start(parseInt(id)) navigate(`/marathons/${id}/play`) } catch (err: unknown) { const error = err as { response?: { data?: { detail?: string } } } alert(error.response?.data?.detail || 'Не удалось запустить марафон') } finally { setIsStarting(false) } } if (isLoading || !marathon) { return (
) } const isOrganizer = user?.id === marathon.organizer.id const totalChallenges = games.reduce((sum, g) => sum + g.challenges_count, 0) return (

{marathon.title}

Настройка - Добавьте игры и сгенерируйте задания

{isOrganizer && ( )}
{/* Stats */}
{games.length}
Игр
{totalChallenges}
Заданий
{/* Generate challenges button */} {games.length > 0 && (

Генерация заданий

Используйте ИИ для генерации заданий для всех игр без заданий

{generateMessage && (

{generateMessage}

)}
)} {/* Games list */} Игры {/* Add game form */} {showAddGame && (
setGameTitle(e.target.value)} /> setGameUrl(e.target.value)} /> setGameGenre(e.target.value)} />
)} {/* Games */} {games.length === 0 ? (

Пока нет игр. Добавьте игры, чтобы начать!

) : (
{games.map((game) => (

{game.title}

{game.genre && {game.genre}} {game.challenges_count} заданий
))}
)}
) }