Spaces:
Sleeping
Sleeping
import React, { useState, useRef, useEffect } from 'react'; | |
import './Demo.css'; | |
function Demo() { | |
const [demoText, setDemoText] = useState(''); | |
const [isLoading, setIsLoading] = useState(false); | |
const [demoResult, setDemoResult] = useState(null); | |
const [audioUrl, setAudioUrl] = useState(null); | |
const audioRef = useRef(null); | |
useEffect(() => { | |
// When audio URL changes, log it for debugging | |
if (audioUrl) { | |
console.log("Audio URL set to:", audioUrl); | |
} | |
}, [audioUrl]); | |
// Function to handle audio errors | |
const handleAudioError = (e) => { | |
console.error("Audio error:", e); | |
// Use a fallback audio URL if the original one fails | |
console.log("Switching to fallback audio source"); | |
setAudioUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3'); | |
}; | |
const handleSubmit = async (e) => { | |
e.preventDefault(); | |
if (!demoText.trim()) return; | |
setIsLoading(true); | |
setAudioUrl(null); | |
try { | |
// This is a placeholder for actual API call | |
setTimeout(() => { | |
setAudioUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3'); | |
setIsLoading(false); | |
}, 1500); | |
} catch (error) { | |
console.error('Error in demo:', error); | |
} finally { | |
setIsLoading(false); | |
} | |
}; | |
const handleGenerateDemo = () => { | |
setIsLoading(true); | |
setAudioUrl(null); | |
// Simulate loading | |
setTimeout(() => { | |
// Use the backend endpoint to access the audio file | |
setAudioUrl('http://localhost:8000/audio/Default/final_podcast.mp3'); | |
setIsLoading(false); | |
}, 1500); | |
}; | |
return ( | |
<div className="demo-container"> | |
<div className="audio-circle-container"> | |
<div className="audio-circle"> | |
{isLoading ? ( | |
<div className="demo-loading-circle"> | |
<div className="demo-spinner"></div> | |
<p>Creating your demo podcast...</p> | |
</div> | |
) : audioUrl ? ( | |
<div className="audio-player-container"> | |
<audio | |
ref={audioRef} | |
src={audioUrl} | |
controls | |
className="audio-player" | |
onError={handleAudioError} | |
preload="auto" | |
/> | |
<div className="audio-controls"> | |
<button | |
onClick={() => audioRef.current?.play()} | |
className="audio-control-btn" | |
> | |
Play | |
</button> | |
<button | |
onClick={() => audioRef.current?.pause()} | |
className="audio-control-btn" | |
> | |
Pause | |
</button> | |
</div> | |
</div> | |
) : ( | |
<div className="empty-circle-message" onClick={handleGenerateDemo}> | |
<p>Click here to generate a demo podcast</p> | |
</div> | |
)} | |
</div> | |
</div> | |
</div> | |
); | |
} | |
export default Demo; |