import React from 'react'; import { FormularioCreacion, TipoPregunta, TiposValidacion, } from '@/types/create-formulario'; import SimpleInput from '@/components/input'; import Select, { Option } from '@/components/select'; import Button from '@/components/button'; import { GetEventoWithCuestionariosWithCupos } from '@/types/evento'; import { formatearRangoFechas } from '@/utils/date-utils'; interface Props { evento?: GetEventoWithCuestionariosWithCupos; formulario: FormularioCreacion; onChange: (formularioActualizado: FormularioCreacion) => void; tipo_eventos?: Option[]; } const tipoPreguntaOpciones: TipoPregunta[] = [ 'Abierta (Respuesta corta)', 'Abierta (Parrafo)', 'Cerrada', 'Multiple', ]; const tiposValidacion: TiposValidacion[] = [ 'correo', 'correo_institucional', 'telefono', 'nombre', 'apellidos', 'genero', 'entero', 'decimal', 'comunidad_alumno', 'cuenta_alumno', 'comunidad_trabajador', 'cuenta_trabajador', 'rfc', ]; type CampoPreguntaSimple = | 'titulo' | 'tipo' | 'validacion' | 'obligatoria' | 'limite'; type CampoPreguntaOpciones = 'opciones'; const tiposCuestionario = [ { label: 'Registro', value: 1 }, { label: 'Evaluación', value: 2 }, ]; export default function FormularioEditor({ formulario, onChange, evento, tipo_eventos, }: Props) { function actualizarCampo( campo: K, valor: FormularioCreacion[K] ): void { const actualizado = { ...formulario, [campo]: valor }; onChange(actualizado); } function handleUpdatePregunta( seccionIdx: number, preguntaIdx: number, campo: CampoPreguntaSimple | CampoPreguntaOpciones, valor: | string | boolean | TipoPregunta | TiposValidacion | number | { valor: string }[] | undefined ) { const actualizado = { ...formulario }; const pregunta = actualizado.secciones[seccionIdx].preguntas[preguntaIdx]; if (campo === 'opciones') { pregunta.opciones = valor as { valor: string }[]; } else if (campo === 'titulo' && typeof valor === 'string') { pregunta.titulo = valor; } else if (campo === 'tipo' && typeof valor === 'string') { pregunta.tipo = valor as TipoPregunta; } else if (campo === 'validacion' || valor === undefined) { pregunta.validacion = valor as TiposValidacion | undefined; } else if (campo === 'obligatoria' && typeof valor === 'boolean') { pregunta.obligatoria = valor; } else if (campo === 'limite' && typeof valor === 'number') { pregunta.limite = valor; } onChange(actualizado); } const handleUpdateSeccion = ( index: number, campo: 'titulo' | 'descripcion', valor: string ) => { const actualizado = { ...formulario }; actualizado.secciones = actualizado.secciones.map((seccion, idx) => idx === index ? { ...seccion, [campo]: valor } : seccion ); onChange(actualizado); }; const agregarSeccion = () => { const nuevaSeccion = { titulo: '', descripcion: '', preguntas: [], }; onChange({ ...formulario, secciones: [...formulario.secciones, nuevaSeccion], }); }; const eliminarSeccion = (index: number) => { const nuevas = [...formulario.secciones]; nuevas.splice(index, 1); onChange({ ...formulario, secciones: nuevas }); }; const agregarPregunta = (seccionIdx: number) => { const nuevaPregunta = { titulo: '', tipo: 'Abierta (Respuesta corta)' as TipoPregunta, obligatoria: false, opciones: [], }; const actualizado = { ...formulario }; actualizado.secciones[seccionIdx].preguntas.push(nuevaPregunta); onChange(actualizado); }; const eliminarPregunta = (seccionIdx: number, preguntaIdx: number) => { const actualizado = { ...formulario }; actualizado.secciones[seccionIdx].preguntas.splice(preguntaIdx, 1); onChange(actualizado); }; // Renderizar solo información básica del formulario const renderInformacionBasica = () => (

Información del Formulario

actualizarCampo('nombre_form', e.target.value)} />
actualizarCampo('cupo_maximo', Number(e.target.value) || 0) } />
actualizarCampo('descripcion', e.target.value)} />
actualizarCampo('fecha_inicio', e.target.value)} />
actualizarCampo('fecha_fin', e.target.value)} />
{evento && (
Evento: {evento.nombre_evento}
Se realizará{' '} {formatearRangoFechas(evento.fecha_inicio, evento.fecha_fin)}
)} actualizarCampo('mensaje_correo', e.target.value)} placeholder="Mensaje que se enviará al correo del participante al registrarse" />
actualizarCampo('id_tipo_evento', Number(e.target.value)) } options={tipo_eventos!} placeholder="Selecciona un tipo" />
); // Renderizar secciones y preguntas const renderSeccionesYPreguntas = () => (

Secciones y Preguntas

{formulario.secciones.map((seccion, seccionIdx) => (
Sección {seccionIdx + 1}
handleUpdateSeccion(seccionIdx, 'titulo', e.target.value) } /> handleUpdateSeccion(seccionIdx, 'descripcion', e.target.value) } /> {/* Preguntas */} {seccion.preguntas.map((pregunta, preguntaIdx) => (
Pregunta {preguntaIdx + 1}
handleUpdatePregunta( seccionIdx, preguntaIdx, 'titulo', e.target.value ) } />
handleUpdatePregunta( seccionIdx, preguntaIdx, 'validacion', e.target.value || undefined ) } options={[ { label: 'Ninguna', value: '' }, ...tiposValidacion.map((v) => ({ label: v, value: v, })), ]} />
handleUpdatePregunta( seccionIdx, preguntaIdx, 'obligatoria', e.target.checked ) } />
{(pregunta.tipo === 'Cerrada' || pregunta.tipo === 'Multiple') && (
{(pregunta.opciones || []).map((op, opIdx) => (
{ const nuevasOpciones = [...(pregunta.opciones || [])]; nuevasOpciones[opIdx].valor = e.target.value; handleUpdatePregunta( seccionIdx, preguntaIdx, 'opciones', nuevasOpciones ); }} placeholder={`Opción ${opIdx + 1}`} className={{ container: 'me-2 flex-grow-1 mb-0', input: 'form-control', }} />
))} {(!pregunta.opciones || pregunta.opciones.length === 0) && (
Esta pregunta cerrada no tiene opciones. Agrega al menos una opción.
)}
)}
))}
))}
); return { informacionBasica: renderInformacionBasica, seccionesYPreguntas: renderSeccionesYPreguntas, }; }