1(function () { 2 'use strict'; 3 4 function post(data) { 5 var body = new URLSearchParams(data); 6 return fetch(NetlusaCV.ajaxUrl, { 7 method: 'POST', 8 credentials: 'same-origin', 9 headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 10 body: body.toString() 11 }).then(function (response) { 12 return response.json().then(function (json) { 13 if (!response.ok || !json.success) { 14 var error = new Error(json && json.data && json.data.message ? json.data.message : 'Falha na solicitação.'); 15 error.data = json && json.data ? json.data : {}; 16 throw error; 17 } 18 return json.data; 19 }); 20 }); 21 } 22 23 function feedback(message, error) { 24 var el = document.querySelector('[data-netlusa-feedback]'); 25 if (!el) return; 26 el.textContent = message || ''; 27 el.classList.toggle('is-error', !!error); 28 } 29 30 function setupGoogleLogin() { 31 if (!window.google || !google.accounts || !google.accounts.id || !NetlusaCV.googleClientId) { 32 return; 33 } 34 google.accounts.id.initialize({ 35 client_id: NetlusaCV.googleClientId, 36 callback: function (response) { 37 feedback('Confirmando sua conta...', false); 38 post({ 39 action: 'netlusa_cv_google_login', 40 nonce: NetlusaCV.nonce, 41 credential: response.credential || '' 42 }).then(function () { 43 window.location.reload(); 44 }).catch(function (error) { 45 feedback(error.message || NetlusaCV.loginError, true); 46 }); 47 } 48 }); 49 document.querySelectorAll('[data-netlusa-google-login]').forEach(function (holder) { 50 holder.innerHTML = ''; 51 google.accounts.id.renderButton(holder, {theme: 'outline', size: 'large', text: 'continue_with', width: 280}); 52 }); 53 } 54 55 function claimSupporterIfAvailable() { 56 if (!NetlusaCV.loggedIn || !NetlusaCV.rrmBridge) return; 57 if (!window.isRRMMember && !document.documentElement.classList.contains('netlusa-rrm-member')) return; 58 var key = 'netlusa_cv_rrm_claimed'; 59 var last = parseInt(sessionStorage.getItem(key) || '0', 10); 60 if (Date.now() - last < 3600000) return; 61 sessionStorage.setItem(key, String(Date.now())); 62 post({action: 'netlusa_cv_rrm_confirm', nonce: NetlusaCV.nonce}).then(function () { 63 if (!document.querySelector('.netlusa-cv-badge')) window.location.reload(); 64 }).catch(function () {}); 65 } 66 67 function updateCountdowns() { 68 document.querySelectorAll('[data-netlusa-countdown]').forEach(function (el) { 69 var target = parseInt(el.getAttribute('data-netlusa-countdown'), 10) * 1000; 70 var diff = Math.max(0, target - Date.now()); 71 if (!diff) { 72 window.location.reload(); 73 return; 74 } 75 var hours = Math.floor(diff / 3600000); 76 var minutes = Math.ceil((diff % 3600000) / 60000); 77 el.textContent = hours > 0 ? hours + 'h ' + String(minutes).padStart(2, '0') + 'min' : minutes + 'min'; 78 }); 79 } 80 81 function clearReactionFeedback(box) { 82 var holder = box.querySelector('[data-netlusa-reaction-feedback]'); 83 if (!holder) return; 84 var message = holder.querySelector('[data-netlusa-reaction-message]'); 85 var supportButton = holder.querySelector('[data-netlusa-reaction-support]'); 86 var fallback = holder.querySelector('[data-netlusa-support-fallback]'); 87 if (message) message.textContent = ''; 88 if (supportButton) supportButton.hidden = true; 89 if (fallback) fallback.remove(); 90 holder.classList.remove('is-visible'); 91 } 92 93 function reactionFeedback(box, error) { 94 var holder = box.querySelector('[data-netlusa-reaction-feedback]'); 95 if (!holder) return; 96 clearReactionFeedback(box); 97 var message = holder.querySelector('[data-netlusa-reaction-message]'); 98 if (message) message.textContent = error.message || 'Não foi possÃvel registrar a reação.'; 99 holder.classList.add('is-visible'); 100 101 var showSupport = !(error.data && error.data.showSupport === false); 102 var supportUrl = error.data && error.data.supportUrl ? error.data.supportUrl : NetlusaCV.supportUrl; 103 var supportButton = holder.querySelector('[data-netlusa-reaction-support]'); 104 if (!showSupport) { 105 if (supportButton) supportButton.hidden = true; 106 return; 107 } 108 if (supportButton && NetlusaCV.rrmBridge) { 109 supportButton.hidden = false;
110 } else if (supportUrl) { 111 var link = document.createElement('a'); 112 link.href = supportUrl; 113 link.setAttribute('data-netlusa-support-fallback', ''); 114 link.textContent = ' Apoie o NETLUSA'; 115 holder.appendChild(link); 116 } 117 } 118 119 document.addEventListener('click', function (event) { 120 var logoutButton = event.target.closest('[data-netlusa-logout]'); 121 if (logoutButton) { 122 event.preventDefault(); 123 logoutButton.disabled = true; 124 post({action: 'netlusa_cv_logout', nonce: NetlusaCV.nonce}).then(function () { 125 window.location.reload(); 126 }).catch(function () { 127 logoutButton.disabled = false; 128 }); 129 return; 130 } 131 132 var reactionButton = event.target.closest('[data-netlusa-react]'); 133 if (reactionButton) { 134 event.preventDefault(); 135 var box = reactionButton.closest('[data-netlusa-reaction-box]'); 136 reactionButton.disabled = true; 137 clearReactionFeedback(box); 138 post({ 139 action: 'netlusa_cv_react', 140 nonce: NetlusaCV.nonce, 141 commentId: reactionButton.getAttribute('data-comment-id') 142 }).then(function (data) { 143 reactionButton.classList.toggle('is-reacted', !!data.reacted); 144 reactionButton.setAttribute('aria-pressed', data.reacted ? 'true' : 'false'); 145 var action = reactionButton.querySelector('[data-netlusa-reaction-action]'); 146 var count = box.querySelector('[data-netlusa-reaction-count]'); 147 if (action) action.textContent = data.reacted ? 'Curtido' : 'Curtir'; 148 if (count) count.textContent = data.countLabel; 149 }).catch(function (error) { 150 reactionFeedback(box, error); 151 }).finally(function () { 152 reactionButton.disabled = false; 153 }); 154 } 155 }); 156 157 document.addEventListener('DOMContentLoaded', function () { 158 setupGoogleLogin(); 159 updateCountdowns(); 160 setInterval(updateCountdowns, 30000); 161 claimSupporterIfAvailable(); 162 setTimeout(claimSupporterIfAvailable, 1200); 163 setTimeout(claimSupporterIfAvailable, 3000); 164 }); 165}());
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.