import React, { useState, useRef, useCallback } from 'react'; import { Paper, Box, Typography, Button, List, ListItem, IconButton } from '@mui/material'; import { Square as StopIcon, Play as PlayIcon, Download as DownloadIcon } from 'lucide-react'; import api from '../api'; import { generatedFragmentsWindowStyles } from '../theme'; export default function GeneratedFragmentsWindow({ fragments, onDownload }) { const [playingFragment, setPlayingFragment] = useState(null); const audioRefs = useRef({}); const handlePlayPause = (fragment) => { const audio = audioRefs.current[fragment.id]; if (!audio) return; if (playingFragment === fragment.id) { audio.pause(); setPlayingFragment(null); } else { if (playingFragment && audioRefs.current[playingFragment]) { audioRefs.current[playingFragment].pause(); } audio.play(); setPlayingFragment(fragment.id); } }; const setAudioRef = useCallback((fragmentId, audioElement) => { if (audioElement) { audioRefs.current[fragmentId] = audioElement; } }, []); return ( Generated Fragments {fragments.length} {fragments.length === 0 ? ( No fragments generated yet ) : ( {fragments.slice().reverse().map((fragment) => ( {fragment.batchTotal > 1 && ( [{fragment.batchIndex}/{fragment.batchTotal}] )} {fragment.prompt} {fragment.duration}s {fragment.cfgScale !== undefined && ` • CFG ${fragment.cfgScale}`} {fragment.seed !== undefined && ` • Seed ${fragment.seed}`} {' • '}{fragment.timestamp} handlePlayPause(fragment)} color={playingFragment === fragment.id ? "primary" : "default"} sx={generatedFragmentsWindowStyles.playPauseButton(playingFragment === fragment.id)} > {playingFragment === fragment.id ? : } ))} )} ); }