Ejercicio: Enviar mensajes
Objetivo
Enviar de verdad un texto, botones y una lista a tu celular, y practicar con JavaScript puro las tres decisiones que toma el código de envío: validar botones, armar el cuerpo de un texto y decidir qué hacer ante un código de error.
Cómo se trabaja
La parte A usa tu cuenta de pruebas de la lección 12 y el código del curso. La parte B son tres funciones que se comprueban en esta página; son versiones reducidas de construirEnvio y de la tabla de errores. No pegues tokens reales aquí.
💡 Reto extra
Añade validarLista(secciones) con las reglas de la lección (máximo 10 filas en total, títulos de fila de hasta 24 caracteres y descripción de hasta 72) y compárala con envioLista de src/whatsapp.js.
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: Validar sin repetir
Para detectar títulos repetidos usa un Set: si ya lo contiene, agrega el problema; si no, añádelo. Para el largo, compara titulo.length > 20.
💡 Pista 2: Cuerpo de texto
Valida primero (if (!texto || texto.length > 4096) throw new Error(...)) y luego devuelve el objeto literal. Cuida el nombre preview_url y su valor false.
💡 Pista 3: Tabla de códigos
Un switch o un objeto { 190: "renovar-token", ... } con ?? "leer-documentacion" resuelve todo. Los números del código pueden venir como número; no hace falta convertirlos.
🔎 Comprueba tu trabajo
Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.
✅ Ver una solución posible
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
function validarBotones(botones) {
const problemas = [];
if (!Array.isArray(botones) || botones.length < 1 || botones.length > 3) {
problemas.push("entre 1 y 3 botones");
}
const titulos = new Set();
for (const b of botones ?? []) {
if (!b.id) problemas.push("id vacio");
if (b.titulo.length > 20) problemas.push("titulo largo: " + b.titulo);
if (titulos.has(b.titulo)) problemas.push("titulo repetido: " + b.titulo);
titulos.add(b.titulo);
}
return problemas;
}
function cuerpoTexto(to, texto) {
if (!texto || texto.length > 4096) throw new Error("texto vacio o de mas de 4096 caracteres");
return {
messaging_product: "whatsapp",
recipient_type: "individual",
to,
type: "text",
text: { preview_url: false, body: texto },
};
}
const ACCIONES = {
190: "renovar-token",
131047: "usar-plantilla",
100: "revisar-cuerpo",
131051: "revisar-cuerpo",
132000: "revisar-cuerpo",
130429: "esperar",
131056: "esperar",
131026: "pedir-revision-cliente",
};
function accionParaError(codigo) {
return ACCIONES[codigo] ?? "leer-documentacion";
}