From f3ba75f46523f916ea5c6e1de0556a1c8b45ef1e Mon Sep 17 00:00:00 2001 From: muhammadali-imran Date: Sun, 4 Oct 2026 15:37:18 +0500 Subject: [PATCH 1/8] fixed --- frontend/src/pages/admin/AdminDemoVideo.jsx | 8 +++++++- frontend/src/pages/admin/AdminVideos.jsx | 14 +++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/admin/AdminDemoVideo.jsx b/frontend/src/pages/admin/AdminDemoVideo.jsx index 699ae0a..597bd0d 100644 --- a/frontend/src/pages/admin/AdminDemoVideo.jsx +++ b/frontend/src/pages/admin/AdminDemoVideo.jsx @@ -11,6 +11,7 @@ export default function AdminDemoVideo() { const [current, setCurrent] = useState(null) const [file, setFile] = useState(null) const [previewUrl, setPreviewUrl] = useState('') + const [previewFailed, setPreviewFailed] = useState(false) const [title, setTitle] = useState('') const [durationSec, setDurationSec] = useState(0) const [loading, setLoading] = useState(true) @@ -37,6 +38,7 @@ export default function AdminDemoVideo() { if (!selected) { setFile(null) setPreviewUrl('') + setPreviewFailed(false) return } if (!selected.type.startsWith('video/')) { @@ -46,6 +48,7 @@ export default function AdminDemoVideo() { return } setFile(selected) + setPreviewFailed(false) setPreviewUrl(URL.createObjectURL(selected)) setTitle(titleFromFile(selected.name)) setDurationSec((await inspectVideoFile(selected)).durationSec) @@ -61,6 +64,7 @@ export default function AdminDemoVideo() { setCurrent(saved) setFile(null) setPreviewUrl('') + setPreviewFailed(false) setMessage({ tone: 'success', text: 'Demo video uploaded and live on the public demo page.' }) } catch (error) { setMessage({ tone: 'error', text: error.message || 'The demo video could not be uploaded.' }) @@ -102,7 +106,9 @@ export default function AdminDemoVideo() {
{previewUrl - ?
diff --git a/frontend/src/pages/admin/AdminVideos.jsx b/frontend/src/pages/admin/AdminVideos.jsx index c47b9e5..f5addd2 100644 --- a/frontend/src/pages/admin/AdminVideos.jsx +++ b/frontend/src/pages/admin/AdminVideos.jsx @@ -76,6 +76,7 @@ function UploadPanel() { const { categories, addVideo } = useLibrary() const [file, setFile] = useState(null) const [previewUrl, setPreviewUrl] = useState('') + const [previewFailed, setPreviewFailed] = useState(false) const [meta, setMeta] = useState({ durationSec: 0, poster: '' }) const [form, setForm] = useState({ title: '', categoryId: '', status: 'published' }) const [busy, setBusy] = useState(false) @@ -86,13 +87,14 @@ function UploadPanel() { const chosen = event.target.files?.[0] if (previewUrl) URL.revokeObjectURL(previewUrl) setMessage(null) - if (!chosen) { setFile(null); setPreviewUrl(''); return } + if (!chosen) { setFile(null); setPreviewUrl(''); setPreviewFailed(false); return } if (!chosen.type.startsWith('video/')) { - setFile(null); setPreviewUrl('') + setFile(null); setPreviewUrl(''); setPreviewFailed(false) setMessage({ tone: 'error', text: 'Choose a video file (MP4, WebM or MOV).' }) return } setFile(chosen) + setPreviewFailed(false) setPreviewUrl(URL.createObjectURL(chosen)) setForm((current) => ({ ...current, title: current.title || titleFromFile(chosen.name) })) setMeta(await inspectVideoFile(chosen)) @@ -107,7 +109,7 @@ function UploadPanel() { await addVideo({ file, ...form, ...meta }) setMessage({ tone: 'success', text: `“${form.title.trim()}” uploaded${form.status === 'published' && form.categoryId ? ' and live for contributors.' : '. Assign a category and publish it to make it visible.'}` }) URL.revokeObjectURL(previewUrl) - setFile(null); setPreviewUrl(''); setForm({ title: '', categoryId: '', status: 'published' }) + setFile(null); setPreviewUrl(''); setPreviewFailed(false); setForm({ title: '', categoryId: '', status: 'published' }) } catch (error) { setMessage({ tone: 'error', text: error?.message || 'The upload failed. Check that your browser has storage space and try again.' }) } finally { setBusy(false) } @@ -118,7 +120,9 @@ function UploadPanel() {
{previewUrl - ?
@@ -171,7 +175,7 @@ function VideoRow({ video, videos, categories, selected, onToggleSelect }) { - {mode === 'preview' && (video.videoUrl ?