Sem visitas neste período.
';
return;
}
var maxV = entries[0].count;
var pc = ['gold','silver','bronze'];
rank.innerHTML = entries.map(function(e, i){
var m = null;
for(var j = 0; j < MOTOS.length; j++){ if(MOTOS[j].id === e.id){ m = MOTOS[j]; break; } }
var meta = m ? (m.ano + ' • ' + m.quilometragem + ' • ' + m.preco) : 'Removida do estoque';
var pct = Math.round(e.count / maxV * 100);
var dataId = m ? (e.id) : null;
var divOpen = dataId ? '' : '
';
return divOpen
+ '
' + (i+1) + '
'
+ '
'
+ '
' + e.nome + '
'
+ '
' + meta + '
'
+ '
'
+ '
'
+ '
' + e.count + 'visitas
'
+ '
';
}).join('');
}).catch(function(err){
rank.innerHTML = '
Erro ao carregar dados.
';
console.error('renderAn:', err);
});
}
function resetAn(){
if(!confirm('Zerar todos os dados de visitas?')) return;
db.collection('analytics').doc('views').delete().then(function(){
renderAn();
toast('Dados zerados');
});
}
// ════ CLOUDINARY ════
function uploadFotos(files,motoId){
var CL='dkjskbcvu', CP='quipapa_motos';
var promises=files.map(function(f){
var fd=new FormData();
fd.append('file',f);fd.append('upload_preset',CP);fd.append('folder','motos/'+motoId);
return fetch('https://api.cloudinary.com/v1_1/'+CL+'/image/upload',{method:'POST',body:fd})
.then(function(r){retur.then(function(d){if(d.secure_url)return d.secure_url;throw new Error(d.error&&d.error.message||'Erro Cloudinary');});
});
return Promise.all(promises);
}
// ════ TOAST ════
function toast(msg){
var t=document.getElementById('toast');
t.textContent=msg;t.classList.add('show');
setTimeout(function(){t.classList.remove('show');},2500);
}
// ════ FIREBASE INIT ════
try{
firebase.initializeApp({
apiKey:"AIzaSyAps1xgMeQgLLrQKhw4oEuqTNErpvMX94",
authDomain:"quipapa-multimarcas.firebaseapp.com",
projectId:"quipapa-multimarcas",
storageBucket:"quipapa-multimarcas.firebasestorage.app",
messagingSenderId:"731303861629",
appId:"1:731303861629:web:b544afef8515c3586ec014"
});
db=firebase.firestore();
// Firestore offline cache - persiste dados entre sessões
db.enablePersistence({synchronizeTabs:true}).catch(function(){});
// Carrega cache local imediatamente enquanto busca do servidor
try {
var cached = localStorage.getItem('qm_motos_cache');
if(cached){
MOTOS = JSON.parse(cached);
renderCat(); popModelos();
document.getElementById('mgrid').querySelectorAll('.mcard').forEach(function(c,i){
c.style.animationDelay = (i*0.03)+'s';
});
}
} catch(e){}
db.collection('motos').orderBy('criadoEm','desc').onSnapshot(function(snap){
MOTOS = snap.docs.map(function(d){ return Object.assign({id:d.id}, d.data()); });
// Salva cache local (sem imagens base64 para não pesar)
try {
var lite = MOTOS.map(function(m){
return {id:m.id, nome:m.nome, ano:m.ano, quilometragem:m.quilometragem,
preco:m.preco, vendida:m.vendida,
imagens: m.imagens ? [m.imagens[0]] : [] }; // só primeira foto no cache
});
localStorage.setItem('qm_motos_cache', JSON.stringify(lite));
} catch(e){}
renderCat(); popModelos();
if(document.getElementById('pg-adm').classList.contains('active')) renderList();
}, function(err){
console.error('Firestore error:', err);
if(!MOTOS.length)
document.getElementById('mgrid').innerHTML='
Erro ao carregar. Verifique sua conexão.
';
});
}catch(e){
console.error('Firebase init error:',e);
}
// ════ EVENTOS ════
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeLB();});
document.addEventListener('click',function(e){
var item = e.target.closest ? e.target.closest('[data-mid]') : null;
if(item){ openDet(item.getAttribute('data-mid')); }
});
var ltap=0,ltmr;
document.getElementById('hlogo').addEventListener('click',function(){
ltap++;clearTimeout(ltmr);ltmr=setTimeout(function(){ltap=0;},1500);
if(ltap>=5){ltap=0;goTo('login');}
});
document.getElementById('caro').addEventListener('touchstart',function(e){tst=e.touches[0].clientX;});
.then(function(d){if(d.secure_url)return d.secure_url;throw new Error(d.error&&d.error.message||'Erro Cloudinary');});
});
return Promise.all(promises);
}
// ════ TOAST ════
function toast(msg){
var t=document.getElementById('toast');
t.textContent=msg;t.classList.add('show');
setTimeout(function(){t.classList.remove('show');},2500);
}
// ════ FIREBASE INIT ════
try{
firebase.initializeApp({
apiKey:"AIzaSyAps1xgMeQgLLrQKhw4oEuqTNErpvMX94",
authDomain:"quipapa-multimarcas.firebaseapp.com",
projectId:"quipapa-multimarcas",
storageBucket:"quipapa-multimarcas.firebasestorage.app",
messagingSenderId:"731303861629",
appId:"1:731303861629:web:b544afef8515c3586ec014"
});
db=firebase.firestore();
db.collection('motos').orderBy('criadoEm','desc').onSnapshot(function(snap){
MOTOS=snap.docs.map(function(d){return Object.assign({id:d.id},d.data());});
renderCat();popModelos();
if(document.getElementById('pg-adm').classList.contains('active'))renderList();
},function(err){
console.error('Firestore error:',err);
document.getElementById('mgrid').innerHTML='
Erro ao carregar dados.
';
});
}catch(e){
console.error('Firebase init error:',e);
}
// ════ EVENTOS ════
document.addEventListener('keydown',function(e){if(e.key==='Escape')closeLB();});
document.addEventListener('click',function(e){
var item = e.target.closest ? e.target.closest('[data-mid]') : null;
if(item){ openDet(item.getAttribute('data-mid')); }
});
var ltap=0,ltmr;
document.getElementById('hlogo').addEventListener('click',function(){
ltap++;clearTimeout(ltmr);ltmr=setTimeout(function(){ltap=0;},1500);
if(ltap>=5){ltap=0;goTo('login');}
});
document.getElementById('caro').addEventListener('touchstart',function(e){tst=e.touches[0].clientX;});