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);