import { useState, useRef, useEffect } from 'react'
export function TimelineBar({
simulationResults,
currentTime,
onTimeChange,
isPlaying,
onPlayPause,
playbackSpeed,
onPlaybackSpeedChange,
}) {
const [showEventForm, setShowEventForm] = useState(false)
const [newEventTime, setNewEventTime] = useState('')
const [newEventLabel, setNewEventLabel] = useState('')
const [newEventType, setNewEventType] = useState('marker')
const timelineRef = useRef(null)
if (!simulationResults) {
return (
Run simulation to see timeline
)
}
const { states, events, summary } = simulationResults
const maxTime = summary.t_max
// Handle timeline scrub
const handleTimelineClick = (e) => {
if (!timelineRef.current) return
const rect = timelineRef.current.getBoundingClientRect()
const percent = (e.clientX - rect.left) / rect.width
const t = Math.max(0, Math.min(maxTime, percent * maxTime))
onTimeChange(t)
}
// Event colors
const eventColors = {
engine: '#ef4444',
guidance: '#f59e0b',
marker: '#8b5cf6',
jettison: '#06b6d4',
}
return (
{/* Playback controls */}
Speed:
t = {currentTime.toFixed(2)} s / {maxTime.toFixed(1)} s
{/* Timeline */}
{/* Event markers */}
{events.map(event => {
const percent = (event.t / maxTime) * 100
return (
{/* Label above */}
{event.label}
)
})}
{/* Playhead */}
{/* Event list below */}
{events.slice(0, 5).map(event => (
{event.t.toFixed(1)}s
{event.label}
))}
{events.length > 5 && (
+{events.length - 5} more events
)}
)
}