"use client"; import React, { useEffect, useState, useCallback } from "react"; import { Search, Image as ImageIcon, FileText, Film, File as FileIcon, Loader2 } from "lucide-react"; import Modal from "./Modal"; import { cmsApi, Asset } from "@/lib/api"; interface AssetPickerModalProps { isOpen: boolean; onClose: () => void; courseId?: string; onSelect: (asset: Asset) => void; filterType?: "image" | "file" | "video" | "all"; } export default function AssetPickerModal({ isOpen, onClose, courseId, onSelect, filterType = "all" }: AssetPickerModalProps) { const [assets, setAssets] = useState([]); const [isLoading, setIsLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(""); const [viewMode, setViewMode] = useState<"course" | "global">(courseId ? "course" : "global"); const loadAssets = useCallback(async () => { if (!isOpen) return; setIsLoading(true); try { const filters: any = {}; if (viewMode === "course" && courseId) { filters.course_id = courseId; } if (searchTerm) { filters.search = searchTerm; } const data = await cmsApi.getAssets(filters); let filtered = data; if (filterType === "image") { filtered = data.filter(a => a.mimetype.startsWith("image/")); } else if (filterType === "file") { filtered = data.filter(a => !a.mimetype.startsWith("image/") && !a.mimetype.startsWith("video/")); } else if (filterType === "video") { filtered = data.filter(a => a.mimetype.startsWith("video/")); } setAssets(filtered); } catch (error) { console.error("Failed to load assets for picker:", error); } finally { setIsLoading(false); } }, [courseId, isOpen, filterType, viewMode, searchTerm]); useEffect(() => { const timer = setTimeout(() => { loadAssets(); }, 300); return () => clearTimeout(timer); }, [loadAssets]); const getIcon = (mimetype: string) => { if (mimetype.startsWith('image/')) return ; if (mimetype.startsWith('video/')) return ; if (mimetype.includes('pdf')) return ; return ; }; return (
{courseId && ( )}
setSearchTerm(e.target.value)} className="w-full bg-white/5 border border-white/10 rounded-xl pl-10 pr-4 py-2.5 text-sm font-medium text-gray-200 placeholder:text-gray-500 focus:outline-none focus:border-blue-500/50 transition-colors" />
{isLoading ? (
Synchronizing...
) : assets.length === 0 ? (
Empty Collection
{searchTerm ? "No results found" : "No assets uploaded yet"}
) : ( assets.map((asset) => ( )) )}
{assets.length} Assets Found
); }