'use client'; import { useState, useEffect } from 'react'; import { LibraryBlock, cmsApi } from '@/lib/api'; interface LibraryPanelProps { isOpen: boolean; onClose: () => void; onSelectBlock: (block: LibraryBlock) => void; } export default function LibraryPanel({ isOpen, onClose, onSelectBlock }: LibraryPanelProps) { const [blocks, setBlocks] = useState([]); const [filteredBlocks, setFilteredBlocks] = useState([]); const [loading, setLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [selectedType, setSelectedType] = useState(''); const [selectedTag, setSelectedTag] = useState(''); // Get unique types and tags from blocks const blockTypes = Array.from(new Set(blocks.map(b => b.block_type))); const allTags = Array.from(new Set(blocks.flatMap(b => b.tags || []))); useEffect(() => { if (isOpen) { loadBlocks(); } }, [isOpen]); useEffect(() => { filterBlocks(); }, [blocks, searchTerm, selectedType, selectedTag]); const loadBlocks = async () => { setLoading(true); try { const data = await cmsApi.listLibraryBlocks(); setBlocks(data); } catch (error) { console.error('Error loading library blocks:', error); } finally { setLoading(false); } }; const filterBlocks = () => { let filtered = [...blocks]; if (searchTerm) { const term = searchTerm.toLowerCase(); filtered = filtered.filter( b => b.name.toLowerCase().includes(term) || b.description?.toLowerCase().includes(term) ); } if (selectedType) { filtered = filtered.filter(b => b.block_type === selectedType); } if (selectedTag) { filtered = filtered.filter(b => b.tags?.includes(selectedTag)); } setFilteredBlocks(filtered); }; const handleUseBlock = async (block: LibraryBlock) => { try { // Increment usage counter await cmsApi.incrementBlockUsage(block.id); onSelectBlock(block); onClose(); } catch (error) { console.error('Error using block:', error); } }; const handleDeleteBlock = async (blockId: string, e: React.MouseEvent) => { e.stopPropagation(); if (!confirm('¿Estás seguro de eliminar este bloque de la biblioteca?')) return; try { await cmsApi.deleteLibraryBlock(blockId); setBlocks(blocks.filter(b => b.id !== blockId)); } catch (error) { console.error('Error deleting block:', error); alert('Error al eliminar el bloque'); } }; if (!isOpen) return null; return (
{/* Header */}

Biblioteca de Bloques

{/* Filters */}
{/* Search */} setSearchTerm(e.target.value)} className="px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" /> {/* Type Filter */} {/* Tag Filter */}
{/* Content */}
{loading ? (
Cargando...
) : filteredBlocks.length === 0 ? (

No se encontraron bloques

) : (
{filteredBlocks.map((block) => (

{block.name}

{block.block_type}
{block.description && (

{block.description}

)} {block.tags && block.tags.length > 0 && (
{block.tags.map((tag) => ( #{tag} ))}
)}
Usado {block.usage_count} {block.usage_count === 1 ? 'vez' : 'veces'}
))}
)}
{/* Footer */}
{filteredBlocks.length} bloque(s) encontrado(s)
); }