// ===================================================================== // Pantalla de entrada · Magic Login // Dos caminos al mismo sitio: acceso rápido por rol (demo) o correo. // ===================================================================== import { api, esc, ficha, brindis, activarCopiado } from './ui.mjs'; const $ = (s) => document.querySelector(s); const MOTIVOS = { invalido: 'Ese enlace no es válido. Genera uno nuevo.', 'ya-usado': 'Ese enlace ya se usó. Los enlaces de acceso sirven una sola vez.', vencido: 'El enlace venció. Genera uno nuevo.', 'usuario-inactivo': 'Tu cuenta está desactivada. Habla con dirección.', }; function mostrarError(texto) { const caja = $('#error-entrada'); caja.hidden = false; caja.className = 'aviso aviso--error'; caja.textContent = texto; } // Si venimos rebotados de /acceso/:token con un problema, decirlo aquí. const motivo = new URLSearchParams(location.search).get('error'); if (motivo) mostrarError(MOTIVOS[motivo] ?? 'No se pudo validar el enlace.'); /** Genera el enlace y lo canjea de inmediato: es el flujo real, sin el correo. */ async function entrar(email, boton) { const previo = boton?.textContent; if (boton) { boton.disabled = true; boton.textContent = 'Generando enlace…'; } $('#error-entrada').hidden = true; $('#resultado').innerHTML = ''; try { const r = await api('/auth/enlace', { method: 'POST', body: { email } }); $('#resultado').innerHTML = `
${esc(location.origin + r.enlace)}` : ''}
npm start
y que el contenedor de MySQL esté arriba.