Ir al contenido
(function(){
// ===== CONFIG (tus IDs de Elementor popups) =====
var POPUP_INSTALL_ANDROID = 1134; // Instalación Android/desktop
var POPUP_INSTALL_IOS = 1166; // Instalación iOS (A2HS)
var POPUP_PUSH_ACTIVATE = 1176; // Activar notificaciones (en PWA)
// =================================================
var LS = window.localStorage||{getItem:function(){},setItem:function(){},removeItem:function(){}};
var deferredPrompt = null;
var SHOWN_INSTALL_FLAG='maipro.install.shown';
var SHOWN_PUSH_FLAG='maipro.push.shown';
function log(){ if (window.console && console.log) console.log.apply(console, ['[Maipro]'].concat([].slice.call(arguments))); }
function warn(){ if (window.console && console.warn) console.warn.apply(console, ['[Maipro]'].concat([].slice.call(arguments))); }
function $(s){return document.querySelector(s);}
function getCookie(n){var m=document.cookie.match(new RegExp('(?:^|; )'+n+'=([^;]+)'));return m?decodeURIComponent(m[1]):'';}
function isStandalone(){var m=false;try{m=window.matchMedia&&window.matchMedia('(display-mode: standalone)').matches;}catch(e){} return m||(window.navigator.standalone===true);}
function isIOS(){return /iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream;}
function canShowInstallPopup(){ if(isStandalone()) return false; return !LS.getItem(SHOWN_INSTALL_FLAG); }
function canShowPushPopup(){
// Mostramos el popup de activación solo si estamos en modo standalone (PWA) y no hay permiso ya concedido
if(!isStandalone()) return false;
if(window.Notification && Notification.permission==='granted') return false;
return !LS.getItem(SHOWN_PUSH_FLAG);
}
// ---------- Elementor Popups helpers ----------
function openPopupById(id){
try{
if(window.elementorProFrontend && elementorProFrontend.modules && elementorProFrontend.modules.popup){
elementorProFrontend.modules.popup.showPopup({id:id});
return true;
}
}catch(e){ warn('No se pudo abrir popup', id, e); }
return false;
}
function closePopups(){
try{
if(window.elementorProFrontend && elementorProFrontend.modules && elementorProFrontend.modules.popup){
elementorProFrontend.modules.popup.closePopup();
}
}catch(e){}
}
function openPopupWhenReady(id, maxWaitMs){
var started = Date.now();
(function tick(){
if (openPopupById(id)) return;
if (Date.now() - started > (maxWaitMs||6000)) { warn('Timeout abriendo popup', id); return; }
setTimeout(tick, 250);
})();
}
// ---------- Instalación PWA ----------
window.addEventListener('beforeinstallprompt', function(e){
e.preventDefault();
deferredPrompt = e;
log('beforeinstallprompt capturado');
var btn = $('#btn-install-pwa'); if (btn){ btn.disabled=false; btn.textContent='Instalar app'; }
});
function maybeShowWebInstallFallback(){
if (canShowInstallPopup() && !isIOS() && !isStandalone()) {
log('Mostrando popup de instalación (fallback web)');
LS.setItem(SHOWN_INSTALL_FLAG,'1');
openPopupWhenReady(POPUP_INSTALL_ANDROID, 6000);
}
}
function maybeShowIOSInstall(){
if (canShowInstallPopup() && isIOS() && !isStandalone()) {
log('Mostrando popup iOS A2HS');
LS.setItem(SHOWN_INSTALL_FLAG,'1');
openPopupWhenReady(POPUP_INSTALL_IOS, 6000);
}
}
function wireInstallButtons(){
var bInstall=$('#btn-install-pwa');
if(bInstall){
if(!deferredPrompt){ bInstall.disabled = true; bInstall.textContent='Preparando instalación…'; }
bInstall.addEventListener('click', function(ev){
ev.preventDefault();
if(!deferredPrompt){ alert('Aún preparando instalación. Intenta otra vez.'); return; }
deferredPrompt.prompt();
deferredPrompt.userChoice.then(function(choice){
log('Instalación:', choice && choice.outcome);
deferredPrompt = null;
closePopups();
})['catch'](function(){ deferredPrompt=null; closePopups(); });
});
}
var bDismiss=$('#btn-install-dismiss');
if(bDismiss){ bDismiss.addEventListener('click', function(){ closePopups(); }); }
var bDismissIOS=$('#btn-install-ios-dismiss');
if(bDismissIOS){ bDismissIOS.addEventListener('click', function(){ closePopups(); }); }
}
// ---------- OneSignal helpers (no inyectar SDK aquí) ----------
function waitForOneSignalReady(timeoutMs) {
timeoutMs = timeoutMs || 8000;
return new Promise(function (resolve) {
var waited = 0;
var interval = 150;
var t = setInterval(function () {
if (window.OneSignal && typeof OneSignal.push === 'function') {
clearInterval(t);
return resolve(true);
}
waited += interval;
if (waited >= timeoutMs) {
clearInterval(t);
return resolve(false);
}
}, interval);
});
}
function safeSetExternalUserId() {
try {
var externalId = (window.MaiproOneSignalConfig && MaiproOneSignalConfig.externalUserId) ? String(MaiproOneSignalConfig.externalUserId) : (window.USER_ID ? String(window.USER_ID) : null);
if (!externalId) return;
OneSignal.push(function() {
if (typeof OneSignal.setExternalUserId === 'function') {
try { OneSignal.setExternalUserId(externalId); log('OneSignal externalUserId seteado:', externalId); } catch(e){ warn('setExternalUserId error', e); }
}
});
} catch(e) { warn('safeSetExternalUserId', e); }
}
// Mostrar prompt de OneSignal (slidedown o registro)
function showOneSignalPrompt() {
waitForOneSignalReady(8000).then(function(ready){
if (!ready) { warn('OneSignal SDK no listo'); alert('OneSignal SDK no cargado todavía. Intenta de nuevo.'); return; }
// Asociar external user id si existe
safeSetExternalUserId();
OneSignal.push(function(){
if (typeof OneSignal.showSlidedownPrompt === 'function') {
OneSignal.showSlidedownPrompt();
} else if (typeof OneSignal.registerForPushNotifications === 'function') {
OneSignal.registerForPushNotifications().catch(function(e){ warn('registerForPushNotifications failed', e); });
} else {
warn('No hay método de prompt disponible en OneSignal');
}
});
});
}
// Opcional: guardar mapping OneSignal userId <-> WP user_id en servidor (recomendado)
// Puedes descomentar y ajustar la URL /wp-admin/admin-ajax.php?action=maipro_save_onesignal
function saveOneSignalIdOnServer(oneSignalUserId) {
try {
if (!oneSignalUserId) return;
// Si quieres que el servidor guarde el mapping, implementa el handler PHP para maipro_save_onesignal
/*
fetch('/wp-admin/admin-ajax.php?action=maipro_save_onesignal', {
method: 'POST',
credentials: 'same-origin',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ onesignal_id: oneSignalUserId })
}).then(function(r){ return r.json(); }).then(function(j){ log('Saved OS id on server', j); }).catch(function(e){ warn('saveOneSignalIdOnServer error', e); });
*/
} catch(e){ warn('saveOneSignalIdOnServer', e); }
}
// Cuando se suscriba, OneSignal dispara subscriptionChange / puedes obtener userId
function bindOneSignalEvents() {
waitForOneSignalReady(8000).then(function(ready){
if(!ready) return;
OneSignal.push(function(){
try {
OneSignal.on && OneSignal.on('subscriptionChange', function(isSubscribed){
log('OneSignal subscriptionChange:', isSubscribed);
if (isSubscribed) {
OneSignal.getUserId().then(function(osId){
log('OneSignal userId:', osId);
// Guardar mapping opcional:
saveOneSignalIdOnServer(osId);
}).catch(function(e){ warn('getUserId error', e); });
}
});
} catch(e){ warn('bindOneSignalEvents error', e); }
});
});
}
// ---------- Notificaciones: integrar con el popup de Elementor ----------
function setPushStatus(t){ var el=$('#push-status'); if(el) el.textContent=t||''; }
function wirePushPopup(){
function attach(){
var root = document.querySelector('.elementor-popup-modal[data-elementor-id="'+POPUP_PUSH_ACTIVATE+'"]');
if (!root) return false;
var btn = root.querySelector('#btn-activar-push');
if (!btn || btn.__wired) return false;
btn.__wired = true;
btn.style.display='inline-flex'; btn.style.visibility='visible'; btn.style.opacity='1';
// reemplazamos la lógica que antes usaba Firebase por llamada a OneSignal prompt
btn.addEventListener('click', function(ev){
ev.preventDefault();
setPushStatus('Preparando OneSignal...');
// Mostrar prompt de OneSignal (manejamos internamente si SDK no existe)
showOneSignalPrompt();
});
return true;
}
var mo = new MutationObserver(function(){ attach(); });
mo.observe(document.documentElement, { childList:true, subtree:true });
setTimeout(attach, 300);
if (window.jQuery && window.elementorProFrontend) {
try { jQuery(document).on('elementor/popup/show', function(e,id){ if(id===POPUP_PUSH_ACTIVATE) setTimeout(attach,50); }); } catch(e){}
}
}
function maybeShowPushPopup(){
try { var p=new URLSearchParams(window.location.search); if(p.get('showpush')==='1'){ openPopupWhenReady(POPUP_PUSH_ACTIVATE,6000); return; } } catch(e){}
if (canShowPushPopup()) {
log('Mostrando popup de activar notificaciones (PWA)');
LS.setItem(SHOWN_PUSH_FLAG,'1');
openPopupWhenReady(POPUP_PUSH_ACTIVATE, 6000);
}
}
// ---------- Inicio y flujo ----------
function init(){
wireInstallButtons();
wirePushPopup();
// Enlazar eventos OneSignal para capturar subscriptionChange y mapear al servidor si hace falta
bindOneSignalEvents();
if(isStandalone()){
// si estamos en PWA, esperar a que OneSignal esté listo y luego mostrar el popup si corresponde
waitForOneSignalReady(8000).then(function(){
maybeShowPushPopup();
});
}else{
// si no estamos en PWA, mostrar popups de instalación según plataforma
maybeShowIOSInstall();
maybeShowWebInstallFallback();
}
}
if(document.readyState==='complete' || document.readyState==='interactive'){ setTimeout(init, 300); }
else { document.addEventListener('DOMContentLoaded', function(){ setTimeout(init,300); }); }
// Mostrar instaladores si no está instalado pasado cierto timeout
setTimeout(function(){ if(!isStandalone()){ if(isIOS()) maybeShowIOSInstall(); else maybeShowWebInstallFallback(); } }, 3000);
window.addEventListener('appinstalled', function(){ LS.removeItem(SHOWN_INSTALL_FLAG); closePopups(); });
// Delegated listener fallback para botones que no se pudieron enganchar
document.addEventListener('click', function(ev){
var el = ev.target;
// activar push (fallback): si hay un botón con id btn-activar-push en cualquier parte
if (el && (el.id === 'btn-activar-push' || (el.closest && el.closest('#btn-activar-push')))) {
ev.preventDefault();
showOneSignalPrompt();
}
}, true);
// CSS para que el botón siempre sea visible en el popup
(function(){
var css = document.createElement('style');
css.textContent = ''
+ '.elementor-popup-modal[data-elementor-id="'+POPUP_PUSH_ACTIVATE+'"] #btn-activar-push{'
+ ' display:inline-flex !important; visibility:visible !important; opacity:1 !important;'
+ '}';
document.head.appendChild(css);
})();
})();