diff --git a/01_SCENT-PROFILE_Resized.mp4 b/01_SCENT-PROFILE_Resized.mp4
new file mode 100644
index 0000000..fb5a155
Binary files /dev/null and b/01_SCENT-PROFILE_Resized.mp4 differ
diff --git a/apps/admin/src/components/MediaLibraryModal.tsx b/apps/admin/src/components/MediaLibraryModal.tsx
index c21feab..cac56f9 100644
--- a/apps/admin/src/components/MediaLibraryModal.tsx
+++ b/apps/admin/src/components/MediaLibraryModal.tsx
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react';
import { API_BASE } from '@homaroma/types';
-import { X, Upload, Loader2, Image as ImageIcon } from 'lucide-react';
+import { X, Upload, Loader2, Image as ImageIcon, Video } from 'lucide-react';
interface MediaLibraryModalProps {
isOpen: boolean;
@@ -12,6 +12,7 @@ interface MediaItem {
id?: string;
url: string;
filename?: string;
+ mimeType?: string;
}
export default function MediaLibraryModal({ isOpen, onClose, onSelect }: MediaLibraryModalProps) {
@@ -57,19 +58,28 @@ export default function MediaLibraryModal({ isOpen, onClose, onSelect }: MediaLi
const data = await res.json();
await fetchMedia(); // Refresh list
if (data.url) {
- // Auto-select uploaded image (optional, or let user pick from list)
onSelect(data.url);
onClose();
}
+ } else {
+ const err = await res.json();
+ alert(`Upload failed: ${err.error || 'Unknown error'}`);
}
} catch (error) {
console.error('Failed to upload', error);
+ alert('Failed to upload media file.');
} finally {
setUploading(false);
e.target.value = ''; // Reset input
}
};
+ const isVideoFile = (item: MediaItem) => {
+ if (item.mimeType?.startsWith('video/')) return true;
+ const fn = (item.filename || item.url).toLowerCase();
+ return fn.endsWith('.mp4') || fn.endsWith('.webm') || fn.endsWith('.mov') || fn.endsWith('.ogg');
+ };
+
if (!isOpen) return null;
return (
@@ -82,7 +92,7 @@ export default function MediaLibraryModal({ isOpen, onClose, onSelect }: MediaLi
Select or upload images for your content.
+Select or upload images and videos (.mp4, .webm) for your content.