"use client"; import { Button } from "../ui/button"; import { AspectRatio } from "../ui/aspect-ratio"; import { DragOverlay } from "../ui/drag-overlay"; import { useMediaStore } from "@/stores/media-store"; import { processMediaFiles } from "@/lib/media-processing"; import { Plus, Image, Video, Music, Trash2, Upload } from "lucide-react"; import { useDragDrop } from "@/hooks/use-drag-drop"; import { useRef, useState } from "react"; import { toast } from "sonner"; export function MediaPanel() { const { mediaItems, addMediaItem, removeMediaItem } = useMediaStore(); const fileInputRef = useRef(null); const [isProcessing, setIsProcessing] = useState(false); const processFiles = async (files: FileList | File[]) => { if (!files?.length) return; setIsProcessing(true); try { const items = await processMediaFiles(files); items.forEach(item => { addMediaItem(item); }); } catch (error) { console.error("File processing failed:", error); toast.error("Failed to process files"); } finally { setIsProcessing(false); } }; const { isDragOver, dragProps } = useDragDrop({ onDrop: processFiles, }); const handleFileSelect = () => fileInputRef.current?.click(); const handleFileChange = (e: React.ChangeEvent) => { if (e.target.files) processFiles(e.target.files); e.target.value = ""; }; const handleRemove = (e: React.MouseEvent, id: string) => { e.stopPropagation(); removeMediaItem(id); }; const formatDuration = (duration: number) => { const min = Math.floor(duration / 60); const sec = Math.floor(duration % 60); return `${min}:${sec.toString().padStart(2, "0")}`; }; const startDrag = (e: React.DragEvent, item: any) => { e.dataTransfer.setData("application/x-media-item", JSON.stringify({ id: item.id, type: item.type, name: item.name, })); e.dataTransfer.effectAllowed = "copy"; }; const renderPreview = (item: any) => { const baseDragProps = { draggable: true, onDragStart: (e: React.DragEvent) => startDrag(e, item), }; if (item.type === "image") { return ( {item.name} ); } if (item.type === "video") { if (item.thumbnailUrl) { return (
{item.name}
{item.duration && (
{formatDuration(item.duration)}
)}
); } return (
); } if (item.type === "audio") { return (
Audio {item.duration && ( {formatDuration(item.duration)} )}
); } return (
Unknown
); }; return ( <>
{mediaItems.length === 0 ? (

No media in project

Drag files here or use the button above

) : (
{mediaItems.map((item) => (
))}
)}
); }