diff --git a/web/studio/src/app/courses/[id]/lessons/[lessonId]/page.tsx b/web/studio/src/app/courses/[id]/lessons/[lessonId]/page.tsx index 0bc46bb..41fd5d7 100644 --- a/web/studio/src/app/courses/[id]/lessons/[lessonId]/page.tsx +++ b/web/studio/src/app/courses/[id]/lessons/[lessonId]/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { cmsApi, Lesson, Block, GradingCategory, LibraryBlock, api } from "@/lib/api"; +import { cmsApi, Lesson, Block, GradingCategory, LibraryBlock } from "@/lib/api"; import Link from "next/link"; import DescriptionBlock from "@/components/blocks/DescriptionBlock"; import MediaBlock from "@/components/blocks/MediaBlock"; @@ -218,6 +218,39 @@ export default function LessonEditor({ params }: { params: { id: string; lessonI setBlocks(newBlocks); }; + // Content Libraries functions + const handleSaveToLibrary = async (name: string, description: string, tags: string[]) => { + if (!blockToSave) return; + + try { + await cmsApi.createLibraryBlock({ + name, + description, + block_type: blockToSave.type, + block_data: blockToSave, + tags, + }); + alert('¡Bloque guardado en la biblioteca exitosamente!'); + } catch (error) { + console.error('Error saving to library:', error); + throw error; + } + }; + + const handleSelectFromLibrary = (libraryBlock: LibraryBlock) => { + // Create a new block from the library block + const newBlock: Block = { + ...libraryBlock.block_data, + id: Math.random().toString(36).substr(2, 9), // New unique ID + }; + setBlocks([...blocks, newBlock]); + }; + + const openSaveToLibraryModal = (block: Block) => { + setBlockToSave(block); + setIsSaveToLibraryModalOpen(true); + }; + const handleSummarize = async () => { if (!lesson) return; @@ -779,6 +812,15 @@ export default function LessonEditor({ params }: { params: { id: string; lessonI {isGeneratingQuiz ? '⏳' : '✨'} {isGeneratingQuiz ? 'Building...' : 'AI Builder'} + + {/* Browse Library */} + @@ -854,6 +896,25 @@ export default function LessonEditor({ params }: { params: { id: string; lessonI + + {/* Content Libraries Modals */} + {blockToSave && ( + { + setIsSaveToLibraryModalOpen(false); + setBlockToSave(null); + }} + onSave={handleSaveToLibrary} + /> + )} + + setIsLibraryPanelOpen(false)} + onSelectBlock={handleSelectFromLibrary} + /> ); } diff --git a/web/studio/src/components/LibraryPanel.tsx b/web/studio/src/components/LibraryPanel.tsx index 6f2cf3d..eb94e0f 100644 --- a/web/studio/src/components/LibraryPanel.tsx +++ b/web/studio/src/components/LibraryPanel.tsx @@ -34,7 +34,7 @@ export default function LibraryPanel({ isOpen, onClose, onSelectBlock }: Library const loadBlocks = async () => { setLoading(true); try { - const data = await api.listLibraryBlocks(); + const data = await cmsApi.listLibraryBlocks(); setBlocks(data); } catch (error) { console.error('Error loading library blocks:', error); @@ -68,7 +68,7 @@ export default function LibraryPanel({ isOpen, onClose, onSelectBlock }: Library const handleUseBlock = async (block: LibraryBlock) => { try { // Increment usage counter - await api.incrementBlockUsage(block.id); + await cmsApi.incrementBlockUsage(block.id); onSelectBlock(block); onClose(); } catch (error) { @@ -81,7 +81,7 @@ export default function LibraryPanel({ isOpen, onClose, onSelectBlock }: Library if (!confirm('¿Estás seguro de eliminar este bloque de la biblioteca?')) return; try { - await api.deleteLibraryBlock(blockId); + await cmsApi.deleteLibraryBlock(blockId); setBlocks(blocks.filter(b => b.id !== blockId)); } catch (error) { console.error('Error deleting block:', error);