{"id":10787,"date":"2026-08-26T13:41:44","date_gmt":"2026-08-26T16:41:44","guid":{"rendered":"https:\/\/santoantoniosm.com.br\/site\/?page_id=10787"},"modified":"2026-08-26T16:09:54","modified_gmt":"2026-08-26T19:09:54","slug":"instalar-app","status":"publish","type":"page","link":"https:\/\/santoantoniosm.com.br\/site\/instalar-app\/","title":{"rendered":"Instalar App"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"10787\" class=\"elementor elementor-10787\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-79823d9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"79823d9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-988d5e0\" data-id=\"988d5e0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-342ba55 elementor-widget elementor-widget-html\" data-id=\"342ba55\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- MUDA PUSH MARKETING | P\u00c1GINA DE INSTALA\u00c7\u00c3O V1.4 | ELEMENTOR -->\r\n<div id=\"mpm-install-page\" class=\"mpm-install-shell\">\r\n  <style>\r\n    #mpm-install-page{\r\n      --mpm-primary:#d42d66;\r\n      --mpm-secondary:#ffffff;\r\n      --mpm-ink:#172033;\r\n      --mpm-muted:#687386;\r\n      --mpm-line:#e1e7ef;\r\n      --mpm-bg:#f5f7fb;\r\n      --mpm-success:#087a4c;\r\n      --mpm-warning:#8a6500;\r\n      --mpm-danger:#a7252d;\r\n      width:100%;min-height:100svh;margin:0;padding:0;overflow-x:hidden;\r\n      background:var(--mpm-bg);color:var(--mpm-ink);\r\n      font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Arial,sans-serif;\r\n      -webkit-font-smoothing:antialiased;\r\n    }\r\n    #mpm-install-page *{box-sizing:border-box}\r\n    #mpm-install-page img{max-width:100%;display:block}\r\n    #mpm-install-page button{font:inherit}\r\n    #mpm-install-page .mpm-hidden{display:none!important}\r\n    #mpm-install-page .mpm-stage{min-height:100svh;display:flex;flex-direction:column}\r\n    #mpm-install-page .mpm-hero{\r\n      position:relative;overflow:hidden;padding:28px 18px 92px;\r\n      background:linear-gradient(145deg,var(--mpm-primary),color-mix(in srgb,var(--mpm-primary) 72%,#000));\r\n      color:#fff;text-align:center;\r\n    }\r\n    #mpm-install-page .mpm-hero:before,#mpm-install-page .mpm-hero:after{content:\"\";position:absolute;border-radius:999px;background:rgba(255,255,255,.09);pointer-events:none}\r\n    #mpm-install-page .mpm-hero:before{width:210px;height:210px;right:-95px;top:-85px}\r\n    #mpm-install-page .mpm-hero:after{width:150px;height:150px;left:-80px;bottom:-55px}\r\n    #mpm-install-page .mpm-brand{position:relative;z-index:1;display:flex;justify-content:center;margin-bottom:22px}\r\n    #mpm-install-page .mpm-brand-box{min-width:128px;max-width:230px;height:78px;border-radius:18px;background:#fff;padding:10px 15px;display:flex;align-items:center;justify-content:center;box-shadow:0 10px 26px rgba(0,0,0,.12)}\r\n    #mpm-install-page .mpm-brand-box img{max-width:100%;max-height:58px;object-fit:contain}\r\n    #mpm-install-page .mpm-hero h1{position:relative;z-index:1;font-size:clamp(31px,9vw,46px);line-height:1.02;letter-spacing:-.035em;margin:0 auto 13px;max-width:660px;font-weight:900}\r\n    #mpm-install-page .mpm-hero p{position:relative;z-index:1;margin:0 auto;max-width:560px;font-size:16px;line-height:1.55;color:rgba(255,255,255,.9)}\r\n    #mpm-install-page .mpm-main{width:min(620px,calc(100% - 28px));margin:-58px auto 0;position:relative;z-index:2;flex:1}\r\n    #mpm-install-page .mpm-card{background:#fff;border:1px solid rgba(214,223,235,.9);border-radius:24px;padding:22px 18px;box-shadow:0 20px 50px rgba(17,32,54,.13)}\r\n    #mpm-install-page .mpm-app-row{display:flex;align-items:center;gap:14px;margin-bottom:18px}\r\n    #mpm-install-page .mpm-icon{width:72px;height:72px;flex:0 0 72px;border-radius:20px;background:#f3f5f8;border:1px solid var(--mpm-line);padding:7px;object-fit:cover;box-shadow:0 7px 16px rgba(20,32,51,.07)}\r\n    #mpm-install-page .mpm-app-row h2{font-size:20px;line-height:1.15;margin:0 0 5px;font-weight:900}\r\n    #mpm-install-page .mpm-app-row p{font-size:12px;line-height:1.4;color:var(--mpm-muted);margin:0}\r\n    #mpm-install-page .mpm-benefits{display:grid;gap:9px;margin:0 0 20px;padding:0;list-style:none}\r\n    #mpm-install-page .mpm-benefits li{display:flex;align-items:flex-start;gap:10px;font-size:13px;line-height:1.42;color:#3d4859}\r\n    #mpm-install-page .mpm-check{width:22px;height:22px;flex:0 0 22px;border-radius:50%;display:grid;place-items:center;background:color-mix(in srgb,var(--mpm-primary) 12%,#fff);color:var(--mpm-primary);font-size:12px;font-weight:900}\r\n    #mpm-install-page .mpm-primary-btn{width:100%;min-height:58px;border:0;border-radius:16px;background:var(--mpm-primary);color:#fff;font-weight:900;font-size:16px;padding:0 18px;cursor:pointer;box-shadow:0 12px 24px color-mix(in srgb,var(--mpm-primary) 28%,transparent);transition:transform .15s,opacity .15s,box-shadow .15s}\r\n    #mpm-install-page .mpm-primary-btn:hover{transform:translateY(-1px);box-shadow:0 15px 28px color-mix(in srgb,var(--mpm-primary) 33%,transparent)}\r\n    #mpm-install-page .mpm-primary-btn:disabled{opacity:.58;cursor:not-allowed;transform:none;box-shadow:none}\r\n    #mpm-install-page .mpm-primary-btn.is-busy:before{content:\"\";display:inline-block;width:16px;height:16px;margin-right:9px;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;border-radius:50%;vertical-align:-3px;animation:mpmspin .75s linear infinite}\r\n    @keyframes mpmspin{to{transform:rotate(360deg)}}\r\n    #mpm-install-page .mpm-small{font-size:10px;line-height:1.5;text-align:center;color:#8a93a3;margin:10px 8px 0}\r\n    #mpm-install-page .mpm-status{display:none;margin-top:15px;padding:13px 14px;border-radius:13px;font-size:12px;line-height:1.5;border:1px solid transparent}\r\n    #mpm-install-page .mpm-status.show{display:block}\r\n    #mpm-install-page .mpm-status.info{background:#edf5ff;color:#245d8f;border-color:#cadff5}\r\n    #mpm-install-page .mpm-status.ok{background:#ebf8f2;color:var(--mpm-success);border-color:#bee8d4}\r\n    #mpm-install-page .mpm-status.warn{background:#fff8df;color:var(--mpm-warning);border-color:#f2dda0}\r\n    #mpm-install-page .mpm-status.error{background:#fff0f1;color:var(--mpm-danger);border-color:#f2c9cd}\r\n    #mpm-install-page .mpm-platform-box{margin-top:15px;padding:16px;border-radius:16px;background:#f7f9fc;border:1px solid var(--mpm-line)}\r\n    #mpm-install-page .mpm-platform-box h3{font-size:14px;margin:0 0 7px;font-weight:900}\r\n    #mpm-install-page .mpm-platform-box p{font-size:12px;line-height:1.55;color:var(--mpm-muted);margin:0}\r\n    #mpm-install-page .mpm-ios-steps{display:grid;gap:10px;margin-top:13px}\r\n    #mpm-install-page .mpm-ios-step{display:flex;gap:11px;align-items:flex-start;background:#fff;border:1px solid var(--mpm-line);border-radius:12px;padding:11px}\r\n    #mpm-install-page .mpm-step-num{width:26px;height:26px;flex:0 0 26px;border-radius:50%;display:grid;place-items:center;background:var(--mpm-primary);color:#fff;font-weight:900;font-size:11px}\r\n    #mpm-install-page .mpm-ios-step strong{display:block;font-size:12px;margin:1px 0 2px}.mpm-ios-step span{font-size:11px;color:var(--mpm-muted);line-height:1.4}\r\n    #mpm-install-page .mpm-desktop{text-align:center;padding:10px 4px 2px}\r\n    #mpm-install-page .mpm-desktop .mpm-phone{width:66px;height:66px;margin:0 auto 12px;border-radius:20px;background:#eef2f7;display:grid;place-items:center;font-size:30px}\r\n    #mpm-install-page .mpm-desktop h2{font-size:20px;margin:0 0 7px}.mpm-desktop p{font-size:13px;color:var(--mpm-muted);line-height:1.55;margin:0}\r\n    #mpm-install-page .mpm-footer{display:flex;align-items:center;justify-content:center;gap:8px;padding:22px 14px 25px;color:#7e8796;font-size:10px}\r\n    #mpm-install-page .mpm-footer img{width:62px;max-height:26px;object-fit:contain}\r\n    #mpm-install-page .mpm-debug{font-size:9px;color:#a2a9b4;text-align:center;margin-top:8px;word-break:break-all}\r\n    @media(min-width:640px){\r\n      #mpm-install-page .mpm-hero{padding:42px 22px 104px}\r\n      #mpm-install-page .mpm-card{padding:28px}\r\n      #mpm-install-page .mpm-main{margin-top:-66px}\r\n      #mpm-install-page .mpm-benefits{grid-template-columns:1fr 1fr}\r\n    }\r\n  <\/style>\r\n\r\n  <div class=\"mpm-stage\">\r\n    <header class=\"mpm-hero\">\r\n      <div class=\"mpm-brand\"><div class=\"mpm-brand-box\"><img id=\"mpm-install-logo\" alt=\"\"><\/div><\/div>\r\n      <h1>Ofertas direto no seu celular<\/h1>\r\n      <p>Instale <strong id=\"mpm-install-appname\">nosso aplicativo<\/strong> e receba as pr\u00f3ximas promo\u00e7\u00f5es assim que forem publicadas.<\/p>\r\n    <\/header>\r\n\r\n    <main class=\"mpm-main\">\r\n      <section class=\"mpm-card\">\r\n        <div id=\"mpm-mobile-flow\">\r\n          <div class=\"mpm-app-row\">\r\n            <img id=\"mpm-install-icon\" class=\"mpm-icon\" alt=\"\u00cdcone do aplicativo\">\r\n            <div><h2 id=\"mpm-install-title\">Aplicativo de ofertas<\/h2><p>Instala\u00e7\u00e3o r\u00e1pida e notifica\u00e7\u00f5es de novas promo\u00e7\u00f5es.<\/p><\/div>\r\n          <\/div>\r\n\r\n          <ul class=\"mpm-benefits\">\r\n            <li><span class=\"mpm-check\">\u2713<\/span><span>Promo\u00e7\u00f5es sempre atualizadas no \u00edcone do app.<\/span><\/li>\r\n            <li><span class=\"mpm-check\">\u2713<\/span><span>Avisos de novas ofertas direto no celular.<\/span><\/li>\r\n          <\/ul>\r\n\r\n          <button id=\"mpm-install-primary\" class=\"mpm-primary-btn\" type=\"button\" disabled>Preparando instala\u00e7\u00e3o...<\/button>\r\n          <p id=\"mpm-install-note\" class=\"mpm-small\">Voc\u00ea poder\u00e1 confirmar a instala\u00e7\u00e3o e as notifica\u00e7\u00f5es nas telas do seu celular.<\/p>\r\n          <div id=\"mpm-install-status\" class=\"mpm-status\"><\/div>\r\n\r\n          <div id=\"mpm-samsung-box\" class=\"mpm-platform-box mpm-hidden\">\r\n            <h3>Samsung Internet detectado<\/h3>\r\n            <p>Para evitar avisos do Google Play Protect em alguns aparelhos Samsung, a instala\u00e7\u00e3o ser\u00e1 conclu\u00edda pelo Google Chrome.<\/p>\r\n          <\/div>\r\n\r\n          <div id=\"mpm-ios-box\" class=\"mpm-platform-box mpm-hidden\">\r\n            <h3>Instalar no iPhone \/ iPad<\/h3>\r\n            <p>No iOS, a Apple exige que o aplicativo seja adicionado primeiro \u00e0 Tela de In\u00edcio.<\/p>\r\n            <div class=\"mpm-ios-steps\">\r\n              <div class=\"mpm-ios-step\"><span class=\"mpm-step-num\">1<\/span><div><strong>Toque em Compartilhar<\/strong><span>Use o bot\u00e3o de compartilhamento do Safari.<\/span><\/div><\/div>\r\n              <div class=\"mpm-ios-step\"><span class=\"mpm-step-num\">2<\/span><div><strong>Adicionar \u00e0 Tela de In\u00edcio<\/strong><span>Escolha \u201cAdicionar \u00e0 Tela de In\u00edcio\u201d e confirme.<\/span><\/div><\/div>\r\n              <div class=\"mpm-ios-step\"><span class=\"mpm-step-num\">3<\/span><div><strong>Abra o aplicativo<\/strong><span>Dentro do app, conclua a ativa\u00e7\u00e3o das notifica\u00e7\u00f5es quando solicitado.<\/span><\/div><\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div id=\"mpm-desktop-flow\" class=\"mpm-desktop mpm-hidden\">\r\n          <div class=\"mpm-phone\">\ud83d\udcf1<\/div>\r\n          <h2>Abra esta p\u00e1gina pelo celular<\/h2>\r\n          <p>A instala\u00e7\u00e3o do aplicativo est\u00e1 dispon\u00edvel somente em dispositivos m\u00f3veis. Envie este endere\u00e7o para o seu celular e abra pelo navegador.<\/p>\r\n        <\/div>\r\n      <\/section>\r\n      <div id=\"mpm-install-debug\" class=\"mpm-debug\"><\/div>\r\n    <\/main>\r\n\r\n    <footer class=\"mpm-footer\">Desenvolvido por: <img decoding=\"async\" src=\"https:\/\/mudamarketing.com.br\/wp-content\/uploads\/2022\/08\/mudda_marketing_logo_maior.png\" alt=\"Muda Marketing\"><\/footer>\r\n  <\/div>\r\n\r\n  <script>\r\n    window.__mpmDeferredPrompt = window.__mpmDeferredPrompt || null;\r\n    window.__mpmInstalledThisSession = false;\r\n\r\n    window.addEventListener('beforeinstallprompt', function(event){\r\n      event.preventDefault();\r\n      window.__mpmDeferredPrompt = event;\r\n      window.dispatchEvent(new CustomEvent('mpm-install-ready'));\r\n    });\r\n\r\n    window.addEventListener('appinstalled', function(){\r\n      window.__mpmInstalledThisSession = true;\r\n      window.dispatchEvent(new CustomEvent('mpm-app-installed'));\r\n    });\r\n  <\/script>\r\n\r\n  <script type=\"module\">\r\n    import { initializeApp, getApps, getApp } from 'https:\/\/www.gstatic.com\/firebasejs\/12.18.0\/firebase-app.js';\r\n    import { getMessaging, isSupported, getToken } from 'https:\/\/www.gstatic.com\/firebasejs\/12.18.0\/firebase-messaging.js';\r\n\r\n    const FALLBACK_VAPID_KEY = 'BGvZj5FM7YVtUGUsVTladUYJwNOcuCJLiPbf4x_ZJtc6FJdhP-yPAwQ56k6dZ0kizGuj_Ld1NzQfMVgemeSr674';\r\n    const $ = id => document.getElementById(id);\r\n\r\n    const state = {\r\n      cfg:null,\r\n      app:null,\r\n      messaging:null,\r\n      swReg:null,\r\n      ready:false,\r\n      fcmBusy:false,\r\n      lastPushToken:'',\r\n      clientDeviceId:'',\r\n      installConfirmed:false,\r\n      platform:null\r\n    };\r\n\r\n    function normalizeHex(v,fallback){ return \/^#[0-9a-f]{6}$\/i.test(String(v||'')) ? v : fallback; }\r\n    function isStandalone(){\r\n      return window.matchMedia?.('(display-mode: standalone)').matches === true || window.navigator.standalone === true;\r\n    }\r\n    function platformInfo(){\r\n      const ua=navigator.userAgent||'';\r\n      const iOS=\/iPad|iPhone|iPod\/.test(ua)||(navigator.platform==='MacIntel'&&navigator.maxTouchPoints>1);\r\n      const android=\/Android\/i.test(ua);\r\n      const samsung=\/SamsungBrowser\/i.test(ua);\r\n      const edge=\/EdgA|EdgiOS|Edg\\\/\/i.test(ua);\r\n      const chrome=\/Chrome|CriOS\/i.test(ua)&&!edge&&!samsung;\r\n      const firefox=\/Firefox|FxiOS\/i.test(ua);\r\n      const safari=\/Safari\/i.test(ua)&&!chrome&&!edge&&!samsung&&!firefox;\r\n      const mobile=iOS||android;\r\n      return {ua,iOS,android,samsung,edge,chrome,firefox,safari,mobile,standalone:isStandalone()};\r\n    }\r\n    function browserName(p){\r\n      if(p.samsung)return 'Samsung Internet';\r\n      if(p.edge)return 'Microsoft Edge';\r\n      if(p.chrome)return 'Google Chrome';\r\n      if(p.firefox)return 'Firefox';\r\n      if(p.safari)return 'Safari';\r\n      return 'Navegador';\r\n    }\r\n    function setStatus(message,type='info'){\r\n      const el=$('mpm-install-status');\r\n      el.textContent=message;\r\n      el.className='mpm-status show '+type;\r\n    }\r\n    function clearStatus(){ $('mpm-install-status').className='mpm-status'; $('mpm-install-status').textContent=''; }\r\n    function setButton(text,{disabled=false,busy=false}={}){\r\n      const btn=$('mpm-install-primary');\r\n      btn.textContent=text;\r\n      btn.disabled=disabled;\r\n      btn.classList.toggle('is-busy',busy);\r\n    }\r\n    function debug(message){\r\n      if(new URLSearchParams(location.search).get('debug')==='1') $('mpm-install-debug').textContent=message||'';\r\n    }\r\n    async function waitForPluginConfig(timeout=7000){\r\n      const start=Date.now();\r\n      while(Date.now()-start<timeout){\r\n        if(window.MudaPushMarketing?.installation?.id) return window.MudaPushMarketing;\r\n        await new Promise(r=>setTimeout(r,100));\r\n      }\r\n\r\n      const restLink=document.querySelector('link[rel=\"https:\/\/api.w.org\/\"]')?.href;\r\n      const candidates=[];\r\n      if(restLink) candidates.push(new URL('muda-push\/v1\/public-config',restLink).href);\r\n      candidates.push(new URL('..\/wp-json\/muda-push\/v1\/public-config',location.href).href);\r\n      candidates.push(new URL('\/wp-json\/muda-push\/v1\/public-config',location.origin).href);\r\n\r\n      for(const url of [...new Set(candidates)]){\r\n        try{\r\n          const res=await fetch(url,{cache:'no-store',credentials:'same-origin'});\r\n          const data=await res.json().catch(()=>null);\r\n          if(res.ok&&data?.ok&&data?.connected) return data;\r\n        }catch(e){}\r\n      }\r\n      throw new Error('N\u00e3o foi poss\u00edvel carregar a configura\u00e7\u00e3o desta instala\u00e7\u00e3o. Verifique se o plugin Muda Push Marketing est\u00e1 conectado.');\r\n    }\r\n    function injectHead(cfg){\r\n      if(cfg.manifestUrl&&!document.querySelector('link[data-mpm-manifest]')){\r\n        const link=document.createElement('link');link.rel='manifest';link.href=cfg.manifestUrl;link.dataset.mpmManifest='1';document.head.appendChild(link);\r\n      }\r\n      const icon=cfg.installation?.branding?.iconUrl||'';\r\n      if(icon&&!document.querySelector('link[data-mpm-apple-icon]')){\r\n        const link=document.createElement('link');link.rel='apple-touch-icon';link.href=icon;link.dataset.mpmAppleIcon='1';document.head.appendChild(link);\r\n      }\r\n      let theme=document.querySelector('meta[name=\"theme-color\"]');\r\n      if(!theme){theme=document.createElement('meta');theme.name='theme-color';document.head.appendChild(theme)}\r\n      theme.content=normalizeHex(cfg.installation?.branding?.primaryColor,'#172033');\r\n    }\r\n    function applyBrand(cfg){\r\n      const inst=cfg.installation||{},branding=inst.branding||{};\r\n      const primary=normalizeHex(branding.primaryColor,'#d42d66');\r\n      const secondary=normalizeHex(branding.secondaryColor,'#ffffff');\r\n      document.getElementById('mpm-install-page').style.setProperty('--mpm-primary',primary);\r\n      document.getElementById('mpm-install-page').style.setProperty('--mpm-secondary',secondary);\r\n      const logo=branding.logoUrl||branding.iconUrl||'https:\/\/mudamarketing.com.br\/wp-content\/uploads\/2022\/08\/mudda_marketing_logo_maior.png';\r\n      const icon=branding.iconUrl||branding.logoUrl||logo;\r\n      $('mpm-install-logo').src=logo;\r\n      $('mpm-install-icon').src=icon;\r\n      const appName=inst.appName||inst.name||'Aplicativo de ofertas';\r\n      $('mpm-install-appname').textContent=appName;\r\n      $('mpm-install-title').textContent=appName;\r\n      document.title=`Instalar ${appName}`;\r\n    }\r\n    function readCookie(name){\r\n      const prefix=name+'=';\r\n      const parts=String(document.cookie||'').split(';');\r\n      for(const part of parts){\r\n        const item=part.trim();\r\n        if(item.startsWith(prefix)) return decodeURIComponent(item.slice(prefix.length));\r\n      }\r\n      return '';\r\n    }\r\n    function randomDeviceId(){\r\n      if(globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();\r\n      const bytes=new Uint8Array(16);\r\n      if(globalThis.crypto?.getRandomValues) globalThis.crypto.getRandomValues(bytes);\r\n      else for(let i=0;i<bytes.length;i++) bytes[i]=Math.floor(Math.random()*256);\r\n      return Array.from(bytes,b=>b.toString(16).padStart(2,'0')).join('');\r\n    }\r\n    function getClientDeviceId(){\r\n      let id='';\r\n      try{id=localStorage.getItem('mpm_client_device_id')||''}catch(e){}\r\n      if(!id) id=readCookie('mpm_client_device_id');\r\n      if(!id){\r\n        id=randomDeviceId();\r\n      }\r\n      try{localStorage.setItem('mpm_client_device_id',id)}catch(e){}\r\n      try{\r\n        document.cookie='mpm_client_device_id='+encodeURIComponent(id)+'; Max-Age=315360000; Path=\/; SameSite=Lax; Secure';\r\n      }catch(e){}\r\n      return id;\r\n    }\r\n    function getStoredFid(){\r\n      try{return localStorage.getItem('mpm_last_fid')||''}catch(e){return ''}\r\n    }\r\n    async function registerServiceWorker(cfg){\r\n      if(!('serviceWorker' in navigator)) throw new Error('Este navegador n\u00e3o oferece suporte ao Service Worker necess\u00e1rio para o aplicativo.');\r\n      const swUrl=cfg.serviceWorkerUrl;\r\n      if(!swUrl) throw new Error('Service Worker n\u00e3o configurado pelo plugin.');\r\n      const swScope=cfg.serviceWorkerScope || new URL('.\/',swUrl).pathname;\r\n      const reg=await navigator.serviceWorker.register(swUrl,{scope:swScope,updateViaCache:'none'});\r\n      await navigator.serviceWorker.ready;\r\n      return reg;\r\n    }\r\n    function cloudFunctionHttpUrl(functionName){\r\n      const projectId=state.cfg?.firebase?.projectId||'';\r\n      if(!projectId) throw new Error('Project ID do Firebase n\u00e3o configurado.');\r\n      return `https:\/\/southamerica-east1-${projectId}.cloudfunctions.net\/${functionName}`;\r\n    }\r\n    async function callDeviceHttp(functionName,payload){\r\n      const response=await fetch(cloudFunctionHttpUrl(functionName),{\r\n        method:'POST',\r\n        mode:'cors',\r\n        cache:'no-store',\r\n        credentials:'omit',\r\n        headers:{'Content-Type':'application\/json'},\r\n        body:JSON.stringify(payload||{})\r\n      });\r\n      const data=await response.json().catch(()=>null);\r\n      if(!response.ok||data?.ok===false){\r\n        throw new Error(data?.message||`Falha ao sincronizar aparelho (${response.status}).`);\r\n      }\r\n      return data||{ok:true};\r\n    }\r\n    function getStoredPushToken(){\r\n      try{return localStorage.getItem('mpm_last_push_token')||''}catch(e){return ''}\r\n    }\r\n\r\n    async function savePushToken(pushToken){\r\n      if(!pushToken||!state.cfg?.installation?.id) return;\r\n\r\n      const previousPushToken=getStoredPushToken();\r\n      const clientDeviceId=state.clientDeviceId||getClientDeviceId();\r\n      const p=state.platform||platformInfo();\r\n\r\n      await callDeviceHttp('registerDeviceHttp',{\r\n        installationId:state.cfg.installation.id,\r\n        pushToken,\r\n        previousPushToken:\r\n          previousPushToken&&previousPushToken!==pushToken\r\n            ? previousPushToken\r\n            : '',\r\n        clientDeviceId,\r\n        domain:state.cfg.installation.domain||location.hostname,\r\n        platform:p.iOS?'iOS':p.android?'Android':'Web',\r\n        browser:browserName(p),\r\n        locale:navigator.language||'',\r\n        userAgent:navigator.userAgent||'',\r\n        pwaInstalled:\r\n          isStandalone()||\r\n          state.installConfirmed===true||\r\n          window.__mpmInstalledThisSession===true,\r\n        notificationsGranted:\r\n          Notification.permission==='granted'\r\n      });\r\n\r\n      state.lastPushToken=pushToken;\r\n\r\n      try{\r\n        localStorage.setItem('mpm_last_push_token',pushToken);\r\n        \/\/ Remove o FID das vers\u00f5es anteriores para n\u00e3o voltarmos a us\u00e1-lo.\r\n        localStorage.removeItem('mpm_last_fid');\r\n      }catch(e){}\r\n    }\r\n\r\n    async function setupMessaging(){\r\n      const supported=await isSupported().catch(()=>false);\r\n      if(!supported){\r\n        throw new Error(\r\n          'As notifica\u00e7\u00f5es push n\u00e3o s\u00e3o suportadas neste navegador.'\r\n        );\r\n      }\r\n\r\n      state.messaging=getMessaging(state.app);\r\n    }\r\n\r\n    async function syncFcmPushToken(){\r\n      if(state.fcmBusy) return state.lastPushToken;\r\n\r\n      state.fcmBusy=true;\r\n\r\n      try{\r\n        if(!state.messaging) await setupMessaging();\r\n\r\n        const vapidKey=state.cfg.vapidKey||FALLBACK_VAPID_KEY;\r\n        if(!vapidKey){\r\n          throw new Error('Chave p\u00fablica Web Push n\u00e3o configurada.');\r\n        }\r\n\r\n        const pushToken=await getToken(state.messaging,{\r\n          vapidKey,\r\n          serviceWorkerRegistration:state.swReg\r\n        });\r\n\r\n        if(!pushToken){\r\n          throw new Error(\r\n            'O Firebase n\u00e3o retornou o identificador push deste aparelho.'\r\n          );\r\n        }\r\n\r\n        await savePushToken(pushToken);\r\n\r\n        return pushToken;\r\n      }finally{\r\n        state.fcmBusy=false;\r\n      }\r\n    }\r\n\r\n    async function requestAndRegisterNotifications(){\r\n      if(!('Notification' in window)) throw new Error('Este navegador n\u00e3o oferece suporte a notifica\u00e7\u00f5es.');\r\n      let permission=Notification.permission;\r\n      if(permission==='default') permission=await Notification.requestPermission();\r\n      if(permission!=='granted'){\r\n        if(permission==='denied') throw new Error('As notifica\u00e7\u00f5es foram bloqueadas. Abra as configura\u00e7\u00f5es do navegador e permita notifica\u00e7\u00f5es para este site.');\r\n        throw new Error('A permiss\u00e3o de notifica\u00e7\u00f5es n\u00e3o foi concedida.');\r\n      }\r\n      await syncFcmPushToken();\r\n      return true;\r\n    }\r\n    async function openChromeForSamsung(){\r\n      const current=location.href.replace(\/^https?:\\\/\\\/\/i,'');\r\n      const intent=`intent:\/\/${current}#Intent;scheme=https;package=com.android.chrome;end`;\r\n      setStatus('Abrindo esta mesma p\u00e1gina no Google Chrome para concluir a instala\u00e7\u00e3o com mais seguran\u00e7a.','info');\r\n      location.href=intent;\r\n    }\r\n    async function waitForInstallPrompt(timeout=2500){\r\n      if(window.__mpmDeferredPrompt) return window.__mpmDeferredPrompt;\r\n      return await new Promise(resolve=>{\r\n        let done=false;\r\n        const finish=()=>{\r\n          if(done)return;\r\n          done=true;\r\n          window.removeEventListener('mpm-install-ready',onReady);\r\n          resolve(window.__mpmDeferredPrompt||null);\r\n        };\r\n        const onReady=()=>finish();\r\n        window.addEventListener('mpm-install-ready',onReady,{once:true});\r\n        setTimeout(finish,timeout);\r\n      });\r\n    }\r\n\r\n    function updateButtonForPlatform(){\r\n      const p=state.platform;\r\n      if(!p.mobile){\r\n        $('mpm-mobile-flow').classList.add('mpm-hidden');\r\n        $('mpm-desktop-flow').classList.remove('mpm-hidden');\r\n        return;\r\n      }\r\n      if(p.samsung&&!p.standalone){\r\n        $('mpm-samsung-box').classList.remove('mpm-hidden');\r\n        setButton('Abrir no Google Chrome');\r\n        return;\r\n      }\r\n      if(p.iOS&&!p.standalone){\r\n        $('mpm-ios-box').classList.remove('mpm-hidden');\r\n        setButton('Instale pela Tela de In\u00edcio',{disabled:true});\r\n        $('mpm-install-note').textContent='Siga os tr\u00eas passos abaixo. O iPhone exige esse processo para liberar notifica\u00e7\u00f5es web.';\r\n        return;\r\n      }\r\n      if(p.iOS&&p.standalone){\r\n        $('mpm-ios-box').classList.add('mpm-hidden');\r\n        setButton(Notification.permission==='granted'?'Notifica\u00e7\u00f5es ativadas':'Ativar notifica\u00e7\u00f5es',{disabled:Notification.permission==='granted'});\r\n        return;\r\n      }\r\n      if(p.android){\r\n        if(p.standalone){\r\n          if(Notification.permission==='granted'){\r\n            setButton('App instalado e notifica\u00e7\u00f5es ativadas',{disabled:true});\r\n            setStatus('Tudo pronto. Voc\u00ea receber\u00e1 as pr\u00f3ximas promo\u00e7\u00f5es neste aparelho.','ok');\r\n          }else{\r\n            setButton('Ativar notifica\u00e7\u00f5es');\r\n          }\r\n          return;\r\n        }\r\n\r\n        if(state.installConfirmed||window.__mpmInstalledThisSession){\r\n          setButton(Notification.permission==='granted'?'Instala\u00e7\u00e3o conclu\u00edda':'Ativar notifica\u00e7\u00f5es',\r\n                    {disabled:Notification.permission==='granted'});\r\n          if(Notification.permission==='granted'){\r\n            setStatus('Aplicativo instalado. Em alguns celulares Samsung o \u00edcone aparece primeiro na lista de aplicativos; procure por \u201c'+\r\n              (state.cfg?.installation?.appName||state.cfg?.installation?.name||'Santo Ant\u00f4nio')+\r\n              '\u201d e, se quiser, mantenha pressionado para adicionar \u00e0 Tela inicial.','ok');\r\n          }\r\n          return;\r\n        }\r\n\r\n        setButton('Instalar e ativar notifica\u00e7\u00f5es');\r\n      }\r\n    }\r\n    async function handleAndroid(){\r\n      const btn=$('mpm-install-primary');\r\n      btn.classList.add('is-busy');btn.disabled=true;clearStatus();\r\n      let installAccepted=isStandalone()||state.installConfirmed===true||window.__mpmInstalledThisSession===true;\r\n      if(!installAccepted&&!window.__mpmDeferredPrompt){\r\n        await waitForInstallPrompt(2500);\r\n      }\r\n      let installPromptAvailable=!!window.__mpmDeferredPrompt;\r\n      let installError=null;\r\n      let notifyError=null;\r\n\r\n      try{\r\n        \/\/ O navegador decide se consegue exibir os dois prompts na mesma intera\u00e7\u00e3o.\r\n        \/\/ Disparamos a instala\u00e7\u00e3o primeiro e, na sequ\u00eancia, conclu\u00edmos a inscri\u00e7\u00e3o FCM.\r\n        if(!installAccepted&&window.__mpmDeferredPrompt){\r\n          const prompt=window.__mpmDeferredPrompt;\r\n          window.__mpmDeferredPrompt=null;\r\n          try{\r\n            await prompt.prompt();\r\n            const choice=await prompt.userChoice;\r\n            installAccepted=choice?.outcome==='accepted';\r\n            if(installAccepted){\r\n              state.installConfirmed=true;\r\n              window.__mpmInstalledThisSession=true;\r\n            }\r\n          }catch(err){installError=err}\r\n        }\r\n\r\n        try{await requestAndRegisterNotifications()}catch(err){notifyError=err}\r\n\r\n        if((installAccepted||isStandalone())&&!notifyError){\r\n          setButton('App instalado e notifica\u00e7\u00f5es ativadas',{disabled:true});\r\n          setStatus('Pronto! O aplicativo foi instalado e este aparelho est\u00e1 cadastrado para receber as pr\u00f3ximas promo\u00e7\u00f5es. Em alguns aparelhos Samsung, o \u00edcone fica primeiro na lista de aplicativos e n\u00e3o \u00e9 colocado automaticamente na Tela inicial.','ok');\r\n          return;\r\n        }\r\n\r\n        if(!installAccepted&&!installPromptAvailable&&!notifyError){\r\n          setButton('Instalar e ativar notifica\u00e7\u00f5es');\r\n          setStatus('As notifica\u00e7\u00f5es est\u00e3o ativadas, mas o navegador ainda n\u00e3o confirmou a instala\u00e7\u00e3o do app. No Google Chrome, abra o menu \u22ee e toque em \u201cInstalar app\u201d ou \u201cAdicionar \u00e0 tela inicial\u201d. Se o app j\u00e1 estiver instalado, procure por ele na lista de aplicativos.','warn');\r\n          return;\r\n        }\r\n\r\n        if(!installAccepted&&!notifyError){\r\n          setButton('Instalar e ativar notifica\u00e7\u00f5es');\r\n          setStatus('As notifica\u00e7\u00f5es foram ativadas, por\u00e9m a instala\u00e7\u00e3o n\u00e3o foi confirmada. Use o menu \u22ee do Google Chrome e escolha \u201cInstalar app\u201d.','warn');\r\n          return;\r\n        }\r\n\r\n        if(notifyError){\r\n          setButton(installAccepted?'Ativar notifica\u00e7\u00f5es':'Instalar e ativar notifica\u00e7\u00f5es');\r\n          setStatus((notifyError?.message||'N\u00e3o foi poss\u00edvel ativar as notifica\u00e7\u00f5es.')+(installError?' A instala\u00e7\u00e3o tamb\u00e9m n\u00e3o p\u00f4de ser iniciada automaticamente.':''),'error');\r\n        }\r\n      }finally{\r\n        btn.classList.remove('is-busy');\r\n        if(!btn.textContent.includes('ativadas')) btn.disabled=false;\r\n      }\r\n    }\r\n    async function handleIosInstalled(){\r\n      setButton('Ativando notifica\u00e7\u00f5es...',{disabled:true,busy:true});clearStatus();\r\n      try{\r\n        await requestAndRegisterNotifications();\r\n        setButton('Notifica\u00e7\u00f5es ativadas',{disabled:true});\r\n        setStatus('Pronto! Este iPhone\/iPad est\u00e1 cadastrado para receber as pr\u00f3ximas promo\u00e7\u00f5es.','ok');\r\n      }catch(err){\r\n        setButton('Ativar notifica\u00e7\u00f5es');\r\n        setStatus(err?.message||'N\u00e3o foi poss\u00edvel ativar as notifica\u00e7\u00f5es.','error');\r\n      }finally{$('mpm-install-primary').classList.remove('is-busy')}\r\n    }\r\n    async function primaryAction(){\r\n      const p=state.platform;\r\n      if(!state.ready)return;\r\n      if(p.samsung&&!p.standalone) return openChromeForSamsung();\r\n      if(p.iOS&&p.standalone) return handleIosInstalled();\r\n      if(p.android) return handleAndroid();\r\n    }\r\n    async function init(){\r\n      try{\r\n        state.cfg=await waitForPluginConfig();\r\n        injectHead(state.cfg);applyBrand(state.cfg);\r\n        state.clientDeviceId=getClientDeviceId();\r\n        state.platform=platformInfo();\r\n        state.installConfirmed=state.platform.standalone===true;\r\n        updateButtonForPlatform();\r\n\r\n        if(!state.platform.mobile){state.ready=true;return}\r\n\r\n        state.app=getApps().length?getApp():initializeApp(state.cfg.firebase);\r\n        state.swReg=await registerServiceWorker(state.cfg);\r\n        await setupMessaging();\r\n\r\n        if(Notification.permission==='granted'){\r\n          setButton('Sincronizando notifica\u00e7\u00f5es...',{disabled:true,busy:true});\r\n          setStatus('Atualizando o cadastro deste aparelho...','info');\r\n          await syncFcmPushToken();\r\n          setStatus(\r\n            'Notifica\u00e7\u00f5es ativadas e aparelho sincronizado com sucesso.',\r\n            'ok'\r\n          );\r\n          $('mpm-install-primary').classList.remove('is-busy');\r\n        }\r\n\r\n        state.ready=true;\r\n        updateButtonForPlatform();\r\n        debug(`SW: ${state.swReg.scope} \u00b7 ${browserName(state.platform)} \u00b7 ${state.platform.standalone?'standalone':'browser'} \u00b7 Device: ${state.clientDeviceId.slice(-8)}`);\r\n\r\n        if(Notification.permission==='granted'&&state.platform.android){\r\n          updateButtonForPlatform();\r\n        }\r\n      }catch(err){\r\n        state.ready=false;\r\n        setButton('Instala\u00e7\u00e3o indispon\u00edvel',{disabled:true});\r\n        setStatus(err?.message||String(err),'error');\r\n        debug(err?.stack||String(err));\r\n      }\r\n    }\r\n\r\n    window.addEventListener('mpm-app-installed',()=>{\r\n      state.installConfirmed=true;\r\n      updateButtonForPlatform();\r\n    });\r\n\r\n    window.addEventListener('mpm-install-ready',()=>{\r\n      if(state.platform?.android&&!state.platform?.standalone&&!state.installConfirmed){\r\n        setButton('Instalar e ativar notifica\u00e7\u00f5es');\r\n      }\r\n    });\r\n\r\n    $('mpm-install-primary').addEventListener('click',primaryAction);\r\n    window.addEventListener('mpm-install-ready',()=>{if(state.ready&&state.platform?.android&&!state.platform.samsung)updateButtonForPlatform()});\r\n    window.addEventListener('mpm-app-installed',()=>{\r\n      state.platform=platformInfo();\r\n      setStatus('Aplicativo instalado. Agora vamos concluir a ativa\u00e7\u00e3o das notifica\u00e7\u00f5es.','ok');\r\n      updateButtonForPlatform();\r\n    });\r\n\r\n    init();\r\n  <\/script>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-10787","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/pages\/10787","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/comments?post=10787"}],"version-history":[{"count":11,"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/pages\/10787\/revisions"}],"predecessor-version":[{"id":10823,"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/pages\/10787\/revisions\/10823"}],"wp:attachment":[{"href":"https:\/\/santoantoniosm.com.br\/site\/wp-json\/wp\/v2\/media?parent=10787"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}