Ejercicio: Plantillas de mensaje
Objetivo
Validar una plantilla antes de mandarla a revisión, construir el arreglo de variables a partir de un pedido y comprobar los límites de los botones de respuesta rápida, todo con funciones puras que se comprueban en el navegador.
Cómo se trabaja
La parte A se hace con la documentación de Meta y tu cuenta de pruebas (sin enviar nada a clientes reales). La parte B son funciones de JavaScript puro. Los límites que usamos (cuerpo de 1024 caracteres, botón de 25, hasta 10 botones de respuesta rápida) vienen de la documentación; verifica que sigan vigentes cuando trabajes con una cuenta real.
💡 Reto extra
Haz que validarPlantilla también avise cuando el cuerpo empieza o termina con una variable (Meta suele rechazar plantillas así: verifica la regla vigente en la documentación) y cuando hay más variables que ejemplos disponibles.
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: Encontrar las variables
Con texto.match(...) y una expresión regular global que busque dos llaves, dígitos y dos llaves obtienes todas las apariciones. Saca los números, quita repetidos con new Set(...), ordénalos y comprueba que sean 1, 2, 3... sin saltos.
💡 Pista 2: Nombre válido
Una expresión regular con letras a-z minúsculas, dígitos y guion bajo (con +, entre ^ y $), más la comprobación del largo, resuelve todo. Las tildes y mayúsculas no pasan.
💡 Pista 3: Formato de soles
pedido.total.toFixed(2) da dos decimales: 8.6 se vuelve "8.60".
🔎 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 contarVariables(texto) {
const hallados = texto.match(/\{\{(\d+)\}\}/g) ?? [];
const numeros = [...new Set(hallados.map((h) => Number(h.slice(2, -2))))].sort((a, b) => a - b);
numeros.forEach((n, i) => {
if (n !== i + 1) throw new Error("Las variables deben ser consecutivas desde {{1}}");
});
return numeros.length;
}
function nombreValido(nombre) {
return typeof nombre === "string" && nombre.length >= 1 && nombre.length <= 512 && /^[a-z0-9_]+$/.test(nombre);
}
function validarPlantilla(def) {
const problemas = [];
if (!nombreValido(def.nombre)) problemas.push("Nombre inválido: solo minúsculas sin tilde, números y guion bajo");
if (!def.cuerpo || def.cuerpo.length > 1024) problemas.push("El cuerpo debe tener entre 1 y 1024 caracteres");
try { contarVariables(def.cuerpo ?? ""); } catch (e) { problemas.push(e.message); }
const botones = def.botones ?? [];
if (botones.length > 10) problemas.push("Máximo 10 botones");
for (const b of botones) {
if (!b || b.length > 25) problemas.push(`Texto de botón de 1 a 25 caracteres: "${b}"`);
}
return problemas;
}
function variablesDePedido(pedido) {
return [pedido.id, "S/ " + pedido.total.toFixed(2)];
}