Ir al contenido

Modales (formularios)

Un modal es una ventana emergente con un formulario. Sirve para pedir al usuario textos, opciones o archivos.

Vista previa
Envíanos tu opinión
¿Qué te ha parecido el bot?*
Cuéntanos lo que quieras, en pocas palabras.
Me encanta porque...
Puntuación*
Elige una puntuación
modal.json
{
"type": 9,
"data": {
"custom_id": "feedback_modal",
"title": "Envíanos tu opinión",
"components": [
{
"type": 18,
"label": "¿Qué te ha parecido el bot?",
"description": "Cuéntanos lo que quieras, en pocas palabras.",
"component": {
"type": 4,
"custom_id": "opinion",
"style": 2,
"placeholder": "Me encanta porque...",
"max_length": 1000
}
},
{
"type": 18,
"label": "Puntuación",
"component": {
"type": 3,
"custom_id": "puntuacion",
"placeholder": "Elige una puntuación",
"options": [
{
"label": "⭐⭐⭐⭐⭐ Excelente",
"value": "5"
},
{
"label": "⭐⭐⭐ Normal",
"value": "3"
},
{
"label": "⭐ Mejorable",
"value": "1"
}
]
}
}
]
}
}
  1. El usuario usa un comando o pulsa un botón.
  2. Tu bot responde con el tipo de respuesta MODAL (9). Abrir el modal es la respuesta, así que tiene que ser lo primero que hagas.
  3. El usuario rellena el formulario y pulsa Enviar.
  4. Tu bot recibe una interacción MODAL_SUBMIT (5) con los valores, y responde (por ejemplo con un mensaje).
Campo Tipo Descripción
custom_id string obligatorio Identifica el modal al recibir la respuesta (1-100 caracteres).
title string obligatorio Título de la ventana (máx. 45 caracteres).
components array obligatorio Entre 1 y 5 componentes: Label o Text Display.
Componente Cómo se usa
Text Display Directamente, para mostrar texto explicativo.
Label Envuelve a un componente de entrada y le pone título y descripción.
Text Input Dentro de un Label.
String Select y menús automáticos Dentro de un Label.
File Upload Dentro de un Label.
Radio Group, Checkbox Group y Checkbox Dentro de un Label.

Envía el JSON de arriba (el que empieza con "type": 9) a:

POST /interactions/{interaction.id}/{interaction.token}/callback

Cuando el usuario pulsa Enviar, recibes una interacción MODAL_SUBMIT (5). Cada Label llega con su componente y el valor introducido:

data de la interacción MODAL_SUBMIT
{
"custom_id": "feedback_modal",
"components": [
{
"type": 18,
"id": 1,
"component": { "type": 4, "id": 2, "custom_id": "opinion", "value": "¡Me encanta!" }
},
{
"type": 18,
"id": 3,
"component": { "type": 3, "id": 4, "custom_id": "puntuacion", "values": ["5"] }
}
]
}
Componente Dónde está el valor
Text Input value (string)
Selects values (array de strings con los valores o IDs)
File Upload values (IDs de adjuntos; los datos completos están en resolved.attachments)
Radio Group value (string, o null si no se eligió nada)
Checkbox Group values (array de strings)
Checkbox value (true o false)

Recorre data.components, busca el custom_id que quieres dentro de cada component y lee su value o values.

Si vienes de los embeds, mira la guía de migración.