Com relação aos seus dados pessoais de endereçamento, pagamento e conteúdo do pedido, você pode estar certo de que não serão utilizados para outros fins que não o de processamento dos pedidos realizados, não sendo portanto divulgados em hipótese alguma.
Com relação à segurança no tráfego de dados, toda transação que envolver pagamento, seja por cartão de crédito ou não, estará encriptada com a tecnologia SSL (Secure Socket Layer). Isso significa que só nossa empresa terá acesso a estes dados.
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();
})();