import { useEffect, useRef, useState } from 'react'; import { sourceIconSvg } from '../utils'; function formatTime(secs) { if (!isFinite(secs) || isNaN(secs)) return '--:--'; const m = Math.floor(secs / 60); const s = Math.floor(secs % 60); return `${m}:${String(s).padStart(2, '0')}`; } export default function AudioBar({ entry, src, archiveId, onClose }) { const audioRef = useRef(null); const [isPlaying, setIsPlaying] = useState(false); const [currentTime, setCurrentTime] = useState(0); const [duration, setDuration] = useState(NaN); const [volume, setVolume] = useState(1.0); // Auto-play whenever src changes useEffect(() => { if (!audioRef.current || !src) return; audioRef.current.load(); audioRef.current.play().then(() => { setIsPlaying(true); }).catch(() => { // Autoplay blocked — silently remain paused setIsPlaying(false); }); setCurrentTime(0); setDuration(NaN); }, [src]); // Sync volume to audio element useEffect(() => { if (audioRef.current) { audioRef.current.volume = volume; } }, [volume]); function handlePlayPause() { const audio = audioRef.current; if (!audio) return; if (isPlaying) { audio.pause(); } else { audio.play().catch(() => {}); } } function handleSeek(e) { const audio = audioRef.current; if (!audio || !isFinite(duration)) return; const t = Number(e.target.value); audio.currentTime = t; setCurrentTime(t); } function handleVolumeChange(e) { setVolume(Number(e.target.value)); } const title = entry?.title || entry?.entry_uid || 'Unknown'; const kind = entry?.source_kind || 'other'; return ( <> {/* Hidden audio element */}