"use client"; import { useEffect, useMemo, useState } from "react"; import PageLayout from "@/components/PageLayout"; import { cmsApi, Course, CourseTemplateSummary } from "@/lib/api"; import { BookOpen, Plus, Trash2, Wand2 } from "lucide-react"; import Link from "next/link"; export default function CourseTemplatesPage() { const [courses, setCourses] = useState([]); const [templates, setTemplates] = useState([]); const [loading, setLoading] = useState(true); const [sourceCourseId, setSourceCourseId] = useState(""); const [templateName, setTemplateName] = useState(""); const [templateDescription, setTemplateDescription] = useState(""); const [creating, setCreating] = useState(false); const [instantiatingId, setInstantiatingId] = useState(null); const sourceCourse = useMemo( () => courses.find((c) => c.id === sourceCourseId), [courses, sourceCourseId] ); async function loadData() { setLoading(true); try { const [coursesData, templatesData] = await Promise.all([ cmsApi.getCourses(), cmsApi.listCourseTemplates(), ]); setCourses(coursesData); setTemplates(templatesData); if (!sourceCourseId && coursesData.length > 0) { setSourceCourseId(coursesData[0].id); setTemplateName(`${coursesData[0].title} - Base`); } } catch (error) { console.error("Failed to load course templates page", error); alert("No se pudieron cargar los datos de plantillas de curso"); } finally { setLoading(false); } } useEffect(() => { void loadData(); }, []); async function handleCreateTemplate() { if (!sourceCourseId || !templateName.trim()) { alert("Selecciona un curso y nombre de plantilla"); return; } setCreating(true); try { await cmsApi.createCourseTemplateFromCourse( sourceCourseId, templateName.trim(), templateDescription.trim() || undefined ); setTemplateDescription(""); await loadData(); alert("Plantilla de curso creada"); } catch (error) { console.error("Failed to create course template", error); alert("No se pudo crear la plantilla de curso"); } finally { setCreating(false); } } async function handleInstantiateTemplate(template: CourseTemplateSummary) { const customTitle = prompt( "Título del nuevo curso (opcional):", `${template.name} - Copia` ); setInstantiatingId(template.id); try { const created = await cmsApi.applyCourseTemplate( template.id, customTitle && customTitle.trim().length > 0 ? customTitle.trim() : undefined ); alert(`Curso creado desde plantilla: ${created.title}`); } catch (error) { console.error("Failed to instantiate template", error); alert("No se pudo crear el curso desde la plantilla"); } finally { setInstantiatingId(null); } } async function handleDeleteTemplate(template: CourseTemplateSummary) { const ok = confirm(`¿Eliminar plantilla \"${template.name}\"?`); if (!ok) return; try { await cmsApi.deleteCourseTemplate(template.id); await loadData(); } catch (error) { console.error("Failed to delete template", error); alert("No se pudo eliminar la plantilla"); } } return (

Flujo recomendado

  1. Pruebas: crea o ajusta tus plantillas de pruebas.
  2. Plantilla de Curso: guarda una plantilla que agrupe esas pruebas.
  3. Curso: crea cursos nuevos basados en esa Plantilla de Curso.
1. Ir a Plantillas de Pruebas 2. Ir a Cursos

Nueva plantilla

setTemplateName(e.target.value)} className="mt-1 w-full rounded-xl border border-slate-200 dark:border-white/10 bg-white dark:bg-black/20 px-3 py-2" placeholder="Ej. Inglés A1 - Base" />