diff --git a/frontend/src/pages/UploadPage.jsx b/frontend/src/pages/UploadPage.jsx index 0120147..628e61d 100644 --- a/frontend/src/pages/UploadPage.jsx +++ b/frontend/src/pages/UploadPage.jsx @@ -128,23 +128,30 @@ export default function UploadPage() { const hasNextcloud = !!localStorage.getItem('nc_username') const [uploadName, setUploadName] = useState('') + const [stage, setStage] = useState('uploading') // 'uploading' | 'processing' + const [elapsed, setElapsed] = useState(0) const doUpload = async (f) => { if (!f) return setUploadName(f.name) - setUploading(true); setError(''); setProgress(0) + setUploading(true); setError(''); setProgress(0); setStage('uploading'); setElapsed(0) + const start = Date.now() + const timer = setInterval(() => setElapsed(Math.round((Date.now() - start) / 1000)), 500) const formData = new FormData() formData.append('file', f) try { const res = await api.post('/documents/upload', formData, { onUploadProgress: (e) => { - if (e.progress != null) setProgress(Math.round(e.progress * 100)) - else if (e.total) setProgress(Math.round((e.loaded / e.total) * 100)) + const pct = e.progress != null + ? Math.round(e.progress * 100) + : e.total ? Math.round((e.loaded / e.total) * 100) : 0 + setProgress(pct) + if (pct >= 100) setStage('processing') }, }) navigate(`/documents/${res.data.id}`) } catch (err) { setError(err.response?.data?.detail || 'Upload failed') - } finally { setUploading(false) } + } finally { clearInterval(timer); setUploading(false) } } const handleFile = (f, fromNextcloud = false) => { @@ -222,12 +229,29 @@ export default function UploadPage() { {uploading && (
+ Large PDFs may take a few minutes — please keep this tab open. +