48 lines
3.7 KiB
JavaScript
48 lines
3.7 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.style.cssText='font:13px system-ui;color:#56616d;padding:8px 20px';
|
|
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;}
|
|
for(const [id,key] of [['fCnpj','cnpj'],['fZap','zap'],['fMail','mail']])$(id).value=cliente[key];
|
|
$('cepIn').value=entrega.cep;
|
|
$('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;}
|
|
})();
|
|
})();
|