import { useState, useEffect, useRef } from 'react' import { Upload, X, ImageIcon, Video, Loader2, Check, Search } from 'lucide-react' import { api } from '../api' export function MediaModal({ type, token, onSelect, onClose }) { const [items, setItems] = useState([]) const [allItems, setAllItems] = useState([]) const [loading, setLoading] = useState(true) const [uploading, setUploading] = useState(false) const [search, setSearch] = useState('') const fileRef = useRef(null) useEffect(() => { api.listMedia(token, type) .then(data => { const list = Array.isArray(data) ? data : (data.items ?? []) setAllItems(list); setItems(list); setLoading(false) }) .catch(() => setLoading(false)) }, []) useEffect(() => { if (!search.trim()) { setItems(allItems) } else { const q = search.toLowerCase() setItems(allItems.filter(it => it.filename?.toLowerCase().includes(q))) } }, [search, allItems]) const handleUpload = async file => { setUploading(true) try { const res = await api.uploadMedia(file, token) setAllItems(prev => [res, ...prev]) } catch {} setUploading(false) } const accept = type === 'image' ? 'image/*' : 'video/*' const isEmpty = !loading && items.length === 0 const isImage = type === 'image' return (
{ if (e.target === e.currentTarget) onClose() }} >
{/* Header */}

Медиатека

{isImage ? 'Изображения' : 'Видео'} · кликните для вставки

{/* Search bar */}
setSearch(e.target.value)} placeholder="Поиск по имени файла..." className="w-full pl-8 pr-4 py-1.5 text-sm border border-slate-200 rounded-lg outline-none focus:border-indigo-400 focus:ring-1 focus:ring-indigo-200" /> {search && ( )}
{/* Content */}
{loading ? (
) : isEmpty ? (
{isImage ? :
) : (
{items.map(item => ( ))}
)}
{ if (e.target.files[0]) handleUpload(e.target.files[0]) }} />
) }