The browser put the CNPJ, WhatsApp, e-mail, CEP and address back after a reload without telling the page, which then showed them but could not pay until they were typed again. The fields are now emptied on load and marked autocomplete="off", and the saved cart holds only the items: the details and address are typed again after a reload or a closed tab. The payment page already takes them from the server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
50 lines
3.8 KiB
JavaScript
50 lines
3.8 KiB
JavaScript
/* Browser-local cart recovery. Files are stored only for an unfinished cart, for 24h.
|
|
Only the items are kept: the customer's details and address are typed again
|
|
after a reload or a closed tab, so nothing personal stays in the browser. */
|
|
(() => {
|
|
// A browser may put back what was typed before the reload without telling
|
|
// the page, which then shows values it does not know and cannot pay with.
|
|
const CAMPOS=['fCnpj','fZap','fMail','cepIn','eNome','eRua','eNum','eComp','eBairro','eCidade','eUf'];
|
|
for(const id of CAMPOS)if($(id))$(id).value='';
|
|
let database,scope,timer,restoring=true;
|
|
let signedOut=false;
|
|
window.addEventListener('dtf-private-data-cleared',()=>{signedOut=true;clearTimeout(timer);pedido=[];itemAtual=null;folhas=[];artes=[];});
|
|
const notice=document.createElement('p');notice.className='carrAviso';
|
|
document.getElementById('carr').prepend(notice);
|
|
function transaction(mode,fn){return new Promise((resolve,reject)=>{const tx=database.transaction('cart',mode);const request=fn(tx.objectStore('cart'));let result;request.onsuccess=()=>result=request.result;tx.oncomplete=()=>resolve(result);tx.onerror=()=>reject(tx.error);tx.onabort=()=>reject(tx.error);});}
|
|
async function save(){
|
|
if(signedOut||restoring||!database||!scope)return;
|
|
const items=[...pedido,...(itemAtual?[itemAtual]:[])];
|
|
try{
|
|
if(!items.length){await transaction('readwrite',store=>store.delete(scope));return;}
|
|
await transaction('readwrite',store=>store.put({items,expires:Date.now()+86400000},scope));
|
|
notice.textContent='Carrinho salvo neste navegador por 24 horas. Você pode remover itens e adicionar outros após recarregar.';
|
|
}catch(error){notice.textContent='Não foi possível salvar o carrinho neste navegador. Mantenha esta página aberta até enviar o pedido.';}
|
|
}
|
|
window.dtfClearCart=async()=>{clearTimeout(timer);if(database&&scope)await transaction('readwrite',store=>store.delete(scope));notice.textContent='';};
|
|
window.addEventListener('dtf-cart-changed',()=>{clearTimeout(timer);timer=setTimeout(save,400);});
|
|
window.addEventListener('pagehide',()=>{clearTimeout(timer);save();});
|
|
setInterval(async()=>{
|
|
if(!database||signedOut)return;
|
|
try{const keys=await transaction('readonly',s=>s.getAllKeys());for(const key of keys){const value=await transaction('readonly',s=>s.get(key));if(value&&value.expires<Date.now())await transaction('readwrite',s=>s.delete(key));}}catch{/* Browser may close storage during navigation. */}
|
|
},60000);
|
|
(async()=>{
|
|
try{
|
|
scope=(await window.dtfSessionReady).cart_scope;
|
|
database=await new Promise((resolve,reject)=>{const req=indexedDB.open('dtf-local-cart',1);req.onupgradeneeded=()=>req.result.createObjectStore('cart');req.onsuccess=()=>resolve(req.result);req.onerror=()=>reject(req.error);});
|
|
const records=await transaction('readonly',store=>store.getAllKeys());
|
|
for(const key of records){const value=await transaction('readonly',store=>store.get(key));if(value.expires<Date.now())await transaction('readwrite',store=>store.delete(key));}
|
|
const saved=await transaction('readonly',store=>store.get(scope));
|
|
if(saved && !pedido.length && !itemAtual){
|
|
pedido=saved.items;
|
|
$('atual').style.display='none';pintaEntrega();
|
|
notice.textContent='Carrinho recuperado. Remova e adicione novamente um item se precisar alterar sua montagem.';
|
|
}else{
|
|
const account=await window.dtfApi('/account/me');
|
|
if(account.customer && !cliente.mail){cliente={...account.customer};for(const [id,key] of [['fCnpj','cnpj'],['fZap','zap'],['fMail','mail']])$(id).value=cliente[key];pintaEntrega();}
|
|
}
|
|
}catch(error){notice.textContent='Recuperação de carrinho indisponível; o pedido ainda pode ser feito nesta sessão.';}
|
|
finally{restoring=false;}
|
|
})();
|
|
})();
|