/* 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.expiress.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.expiresstore.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;} })(); })();