diff --git a/apps/web/src/components/editor/media-panel.tsx b/apps/web/src/components/editor/media-panel.tsx index 0d6a1f1..72d2c50 100644 --- a/apps/web/src/components/editor/media-panel.tsx +++ b/apps/web/src/components/editor/media-panel.tsx @@ -7,7 +7,7 @@ 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 { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; // MediaPanel lets users add, view, and drag media (images, videos, audio) into the project. @@ -17,6 +17,8 @@ export function MediaPanel() { const { mediaItems, addMediaItem, removeMediaItem } = useMediaStore(); const fileInputRef = useRef(null); const [isProcessing, setIsProcessing] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + const [mediaFilter, setMediaFilter] = useState("all") const processFiles = async (files: FileList | File[]) => { // If no files, do nothing @@ -78,6 +80,24 @@ export function MediaPanel() { e.dataTransfer.effectAllowed = "copy"; }; + const [filteredMediaItems, setFilteredMediaItems] = useState(mediaItems); + + useEffect(() => { + const filtered = mediaItems.filter((item) => { + if (mediaFilter && mediaFilter !== 'all' && item.type !== mediaFilter) { + return false; + } + + if (searchQuery && !item.name.toLowerCase().includes(searchQuery.toLowerCase())) { + return false; + } + + return true; + }); + + setFilteredMediaItems(filtered); + }, [mediaItems, mediaFilter, searchQuery]); + const renderPreview = (item: any) => { // Render a preview for each media type (image, video, audio, unknown) // Each preview is draggable to the timeline @@ -187,30 +207,52 @@ export function MediaPanel() {
{/* Button to add/upload media */} - +
+ {/* Search and filter controls */} + + setSearchQuery(e.target.value)} + /> + + {/* Add media button */} + +
{/* Show message if no media, otherwise show media grid */} - {mediaItems.length === 0 ? ( + {filteredMediaItems.length === 0 ? (
@@ -225,7 +267,7 @@ export function MediaPanel() { ) : (
{/* Render each media item as a draggable button */} - {mediaItems.map((item) => ( + {filteredMediaItems.map((item) => (