Todas as garantias são dadas pelos fabricantes, e variam de produto para produto. Elas serão informadas nas páginas de cada produto. Caso tenha alguma dúvida, entre em contato conosco.
Para devoluções, os produtos deverão ser remetidos em suas embalagens originais e caso for constatado mal uso, o custo será por parte do comprador.
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();
})();