import { useState, useEffect } from 'react' import { useParams, Link } from 'react-router-dom' import { motion } from 'framer-motion' import { useThemeStyles } from '../themes/ThemeProvider' import type { ReplayData, GameEvent } from '../types' export default function Replay() { const { sessionId } = useParams<{ sessionId: string }>() const { config, styles } = useThemeStyles() const [replayData, setReplayData] = useState(null) const [currentEventIndex, setCurrentEventIndex] = useState(0) const [isPlaying, setIsPlaying] = useState(false) const [speed, setSpeed] = useState(1) const [loading, setLoading] = useState(true) // Fetch replay data useEffect(() => { const fetchReplay = async () => { try { const apiUrl = import.meta.env.VITE_API_URL || 'http://localhost:8000' const response = await fetch(`${apiUrl}/api/replay/code/${sessionId}`) if (response.ok) { const data = await response.json() setReplayData(data) } } catch (error) { console.error('Failed to fetch replay:', error) } finally { setLoading(false) } } fetchReplay() }, [sessionId]) // Playback logic useEffect(() => { if (!isPlaying || !replayData) return const interval = setInterval(() => { setCurrentEventIndex((prev) => { if (prev >= replayData.events.length - 1) { setIsPlaying(false) return prev } return prev + 1 }) }, 1000 / speed) return () => clearInterval(interval) }, [isPlaying, speed, replayData]) const currentEvents = replayData?.events.slice(0, currentEventIndex + 1) || [] const currentScores = currentEvents.reduce( (acc, event) => { if (event.was_correct && event.points_earned) { acc[event.team] += event.points_earned } else if (!event.was_correct && event.was_steal && event.points_earned) { acc[event.team] -= Math.abs(event.points_earned) } return acc }, { A: 0, B: 0 } ) if (loading) { return (

Cargando replay...

) } if (!replayData) { return (

No se encontró el replay

Volver al inicio
) } return (
{/* Header */}
← Volver

Replay: {replayData.session.room_code}

{new Date(replayData.session.created_at).toLocaleDateString()}
{/* Scores */}
Equipo A
{currentScores.A}
Equipo B
{currentScores.B}
{/* Playback Controls */}
Velocidad: {[1, 2, 4].map((s) => ( ))}
{/* Timeline */}
setCurrentEventIndex(Number(e.target.value))} className="w-full" />
Evento {currentEventIndex + 1} de {replayData.events.length}
{/* Events List */}
{replayData.events.map((event, index) => (
{event.team} {event.player_name}
{event.was_correct ? ( ✓ +{event.points_earned} ) : ( ✗ {event.was_steal ? `-${Math.abs(event.points_earned || 0)}` : ''} )}
{event.answer_given && (
Respuesta: "{event.answer_given}"
)}
))}
{/* Final Scores */}
Resultado Final
{replayData.session.team_a_score} - {replayData.session.team_b_score}
) }