import { useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import { createTemplate } from "../api/templates"; import { useToast } from "../context/ToastContext"; import { Field, Input, Select, Checkbox } from "../components/ui/Field"; import Button from "../components/ui/Button"; import { Badge } from "../components/ui/Misc"; import { QUESTION_TYPES, DIFFICULTIES } from "../utils/constants"; import { totalQuestionsFromProfile } from "../utils/format"; const emptyType = () => ({ type: "multichoice", count: 5, options_count: 4, multiple_correct: false, score: 1, penalty: 0, }); export default function CreateTemplatePage() { const navigate = useNavigate(); const toast = useToast(); const [form, setForm] = useState({ title: "", subject: "", educational_level: "", language: "es", }); const [types, setTypes] = useState([emptyType()]); const [settings, setSettings] = useState({ shuffle_questions: true, shuffle_answers: true, include_feedback: true, }); const [difficulty, setDifficulty] = useState({ easy: 2, medium: 3, hard: 0, very_hard: 0, }); const [errors, setErrors] = useState({}); const [saving, setSaving] = useState(false); const totalDifficulty = useMemo( () => totalQuestionsFromProfile(difficulty), [difficulty] ); const onField = (e) => setForm((f) => ({ ...f, [e.target.name]: e.target.value })); const updateType = (idx, patch) => setTypes((prev) => prev.map((t, i) => (i === idx ? { ...t, ...patch } : t))); const addType = () => setTypes((prev) => [...prev, emptyType()]); const removeType = (idx) => setTypes((prev) => prev.filter((_, i) => i !== idx)); const validate = () => { const e = {}; if (form.title.trim().length < 3) e.title = "Mínimo 3 caracteres."; if (form.subject.trim().length < 2) e.subject = "Mínimo 2 caracteres."; if (form.educational_level.trim().length < 2) e.educational_level = "Mínimo 2 caracteres."; if (types.length === 0) e.types = "Añade al menos un tipo de pregunta."; if (totalDifficulty <= 0) e.difficulty = "Reparte al menos una pregunta entre las dificultades."; setErrors(e); return Object.keys(e).length === 0; }; const submit = async (e) => { e.preventDefault(); if (!validate()) { toast.error("Revisa los campos marcados."); return; } const payload = { ...form, title: form.title.trim(), subject: form.subject.trim(), educational_level: form.educational_level.trim(), settings: { question_types: types.map((t) => ({ type: t.type, count: Number(t.count), options_count: t.type === "multichoice" ? Number(t.options_count) : null, multiple_correct: t.type === "multichoice" ? t.multiple_correct : false, score: Number(t.score), penalty: Number(t.penalty), })), ...settings, }, difficulty_profile: { easy: Number(difficulty.easy) || 0, medium: Number(difficulty.medium) || 0, hard: Number(difficulty.hard) || 0, very_hard: Number(difficulty.very_hard) || 0, }, }; setSaving(true); try { const created = await createTemplate(payload); toast.success("Plantilla creada correctamente."); navigate(`/plantillas/${created.id}`); } catch (err) { toast.error(err.message); if (err.details) { console.warn("Detalles de validación:", err.details); } } finally { setSaving(false); } }; return (
Define la estructura. Después podrás subir material y generar preguntas.