All checks were successful
Build and deploy / Validate source (push) Successful in 6s
Build and deploy / Integration suite on a real stack (push) Successful in 2m20s
Build and deploy / Secret scan and release gate (push) Successful in 6s
Build and deploy / Publish images (push) Successful in 1m46s
Going back to home delivery with a CEP already typed, or restoring a saved cart, now quotes the freight again by itself; before, only pressing Calcular did. With every case covered, the button is gone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
4.1 KiB
JavaScript
52 lines
4.1 KiB
JavaScript
/* Browser-local cart recovery. Files are stored only for an unfinished cart, for 24h. */
|
|
(() => {
|
|
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,customer:{...cliente},delivery:{...entrega},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;cliente=saved.customer;entrega=saved.delivery;
|
|
// Freight must be quoted again; restored browser values are never final.
|
|
if(entrega.tipo==='frete'){entrega.cotado=false;entrega.valor=0;entrega.dias=null;}
|
|
for(const [id,key] of [['fCnpj','cnpj'],['fZap','zap'],['fMail','mail']])$(id).value=cliente[key];
|
|
$('cepIn').value=fmtCep(entrega.cep);
|
|
entrega.end=entrega.end||{};
|
|
for(const [id,key] of [['eNome','nome'],['eRua','rua'],['eNum','num'],['eComp','comp'],
|
|
['eBairro','bairro'],['eCidade','cidade'],['eUf','uf']])$(id).value=entrega.end[key]||'';
|
|
$('atual').style.display='none';pintaEntrega();
|
|
if(entrega.tipo==='frete' && entrega.cep.length===8 && window.dtfFreight) window.dtfFreight();
|
|
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;}
|
|
})();
|
|
})();
|