0
Meu carrinho
Carrinho Vazio
Ganhe mais ${CONFIG.discountPercent} com o cupom ${CONFIG.couponCode} ao finalizar a compra
⏰ Expira em: 10:00
`; return div; } // ============================================ // FUNÇÃO: INSERIR TIMER NO DOM // ============================================ function insertTimer() { const wrapper = document.querySelector(CONFIG.timerWrapperSelector); if (!wrapper) { console.warn('EVUS Timer: Wrapper não encontrado:', CONFIG.timerWrapperSelector); return false; } // Verificar se já existe if (wrapper.querySelector('[data-evus-timer]')) { return true; } // Criar e inserir timerElement = createTimerElement(); wrapper.appendChild(timerElement); isTimerInserted = true; console.log('EVUS Timer: Timer inserido com sucesso'); return true; } // ============================================ // FUNÇÃO: ATUALIZAR DISPLAY DO TIMER // ============================================ function updateDisplay() { if (!timerElement || !isTimerInserted) { return; } const now = Date.now(); const remaining = Math.max(0, endTime - now); const seconds = Math.floor(remaining / 1000); if (seconds <= 0) { onTimerExpired(); return; } const minutes = Math.floor(seconds / 60); const secs = seconds % 60; const formatted = `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; const displayElement = timerElement.querySelector('[data-timer-display]'); if (displayElement) { displayElement.textContent = formatted; } // Modo urgente if (seconds <= CONFIG.urgentThreshold) { timerElement.classList.add('urgent'); } else { timerElement.classList.remove('urgent'); } } // ============================================ // FUNÇÃO: INICIAR CONTAGEM REGRESSIVA // ============================================ function startCountdown() { if (timerInterval) { clearInterval(timerInterval); } updateDisplay(); timerInterval = setInterval(updateDisplay, 1000); } // ============================================ // FUNÇÃO: TIMER EXPIRADO // ============================================ function onTimerExpired() { clearInterval(timerInterval); const displayElement = timerElement?.querySelector('[data-timer-display]'); if (displayElement) { displayElement.textContent = '00:00'; } // Remover após 3 segundos setTimeout(() => { if (timerElement) { timerElement.style.animation = 'slideIn 0.5s ease-out reverse'; setTimeout(() => { timerElement.remove(); isTimerInserted = false; }, 500); } }, 3000); } // ============================================ // FUNÇÃO: INICIALIZAR TIMER // ============================================ function initTimer() { // Verificar localStorage if (CONFIG.useLocalStorage) { const savedEndTime = localStorage.getItem(CONFIG.storageKey); if (savedEndTime) { endTime = parseInt(savedEndTime, 10); const now = Date.now(); if (endTime > now) { // Timer ainda válido if (insertTimer()) { startCountdown(); } return; } else { // Verificar se deve resetar const timeSinceExpiry = now - endTime; const resetThreshold = CONFIG.resetAfterMinutes * 60 * 1000; if (timeSinceExpiry < resetThreshold) { // Não mostrar timer return; } } } } // Criar novo timer endTime = Date.now() + (CONFIG.durationSeconds * 1000); if (CONFIG.useLocalStorage) { localStorage.setItem(CONFIG.storageKey, endTime.toString()); } if (insertTimer()) { startCountdown(); } } // ============================================ // FUNÇÃO: CONFIGURAR MUTATION OBSERVER // ============================================ function setupObserver() { const priceContainer = document.querySelector(CONFIG.priceContainerSelector); if (!priceContainer) { console.warn('EVUS Timer: Container de preço não encontrado:', CONFIG.priceContainerSelector); console.warn('EVUS Timer: Verifique o seletor nas configurações!'); return; } console.log('EVUS Timer: Observando container:', CONFIG.priceContainerSelector); observer = new MutationObserver((mutations) => { // Verificar se timer ainda existe const wrapper = document.querySelector(CONFIG.timerWrapperSelector); const timerExists = wrapper?.querySelector('[data-evus-timer]'); if (!timerExists && endTime && Date.now() < endTime) { console.log('EVUS Timer: Timer removido, reinserindo...'); isTimerInserted = false; insertTimer(); } }); // Observar mudanças no container e seus filhos observer.observe(priceContainer, { childList: true, subtree: true, attributes: false }); // Também observar o wrapper do timer const wrapper = document.querySelector(CONFIG.timerWrapperSelector); if (wrapper) { observer.observe(wrapper, { childList: true, subtree: true }); } } // ============================================ // INICIALIZAÇÃO // ============================================ function init() { // Aguardar DOM estar pronto if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); return; } console.log('EVUS Timer: Inicializando...'); // Verificar se estamos na página de produto const wrapper = document.querySelector(CONFIG.timerWrapperSelector); if (!wrapper) { console.log('EVUS Timer: Não é página de produto, abortando'); return; } // Inicializar timer initTimer(); // Configurar observer setupObserver(); console.log('EVUS Timer: Inicialização completa'); } // Executar init(); })();