diff --git a/frontend/src/components/video/ExportWidget.tsx b/frontend/src/components/video/ExportWidget.tsx index 35aef1c..ff2b64b 100644 --- a/frontend/src/components/video/ExportWidget.tsx +++ b/frontend/src/components/video/ExportWidget.tsx @@ -5,15 +5,32 @@ type props = { dataSend: React.MouseEventHandler; handleDownload: React.MouseEventHandler; downloadable: boolean; - progress: number + progress: number; + uploading: boolean; } -const ExportWidget = ({dataSend, handleDownload, downloadable, progress}: props) => { +const Spinner = () => ( + + + + +); + +const ExportWidget = ({dataSend, handleDownload, downloadable, progress, uploading}: props) => { return (
- Export + onClick={dataSend} + disabled={uploading} + className={uploading ? "opacity-60 cursor-not-allowed flex items-center justify-center gap-2" : ""} + > + {uploading && } + {uploading ? "Uploading..." : "Export"}
@@ -33,4 +50,4 @@ const ExportWidget = ({dataSend, handleDownload, downloadable, progress}: props) ) } -export default ExportWidget; \ No newline at end of file +export default ExportWidget; diff --git a/frontend/src/pages/ClipEdit.tsx b/frontend/src/pages/ClipEdit.tsx index 3ce8c99..be878ca 100644 --- a/frontend/src/pages/ClipEdit.tsx +++ b/frontend/src/pages/ClipEdit.tsx @@ -34,6 +34,7 @@ const ClipEdit = () => { }); const [progress, setProgress] = useState(0); const [downloadable, setDownloadable] = useState(false); + const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); useEffect(() => { @@ -59,7 +60,10 @@ const ClipEdit = () => { }; const sendData = async () => { - if (!localFile) return; + if (!localFile || uploading) return; + + setUploading(true); + setError(null); let jobId: string; try { @@ -67,6 +71,7 @@ const ClipEdit = () => { setUploadedId(jobId); } catch (err: unknown) { setError(`Failed to start compression: ${err instanceof Error ? err.message : 'Unknown error'}`); + setUploading(false); return; } @@ -81,14 +86,17 @@ const ClipEdit = () => { if (job.state === 'FAILED') { setError(`Compression failed: ${job.errorOutput ?? 'Unknown error'}`); clearInterval(intervalId); + setUploading(false); } else if (job.isComplete) { clearInterval(intervalId); setDownloadable(true); + setUploading(false); } }) .catch((err: Error) => { setError(`Failed to fetch progress: ${err.message}`); clearInterval(intervalId); + setUploading(false); }); }; @@ -166,6 +174,7 @@ const ClipEdit = () => { handleDownload={handleDownload} downloadable={downloadable} progress={progress} + uploading={uploading} />