"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[]) => { setIsProcessing(true); try { const processedItems = await processMediaFiles(files); for (const processedItem of processedItems) { addMediaItem(processedItem); toast.success(`Added ${processedItem.name} to project`); } } catch (error) { console.error("Error processing files:", error); toast.error("Failed to process files"); } finally { setIsProcessing(false); } }; const { isDragOver, dragProps } = useDragDrop({ onDrop: (files) => { processFiles(files); }, }); const handleFileSelect = () => { fileInputRef.current?.click(); }; const handleFileInputChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files.length > 0) { processFiles(e.target.files); // Reset the input so the same file can be selected again e.target.value = ""; } }; const handleRemoveItem = (e: React.MouseEvent, itemId: string) => { e.stopPropagation(); removeMediaItem(itemId); toast.success("Media removed from project"); }; const handleDragStart = (e: React.DragEvent, item: any) => { // Mark this as an internal app drag e.dataTransfer.setData( "application/x-media-item", JSON.stringify({ id: item.id, type: item.type, name: item.name, }) ); e.dataTransfer.effectAllowed = "copy"; }; const formatDuration = (duration: number) => { const minutes = Math.floor(duration / 60); const seconds = Math.floor(duration % 60); return `${minutes}:${seconds.toString().padStart(2, "0")}`; }; const getMediaIcon = (type: string) => { switch (type) { case "video": return