{"version":3,"file":"tag.js","mappings":";;;;AAAA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,UAAU,GAAG,YAAY;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA,mCAAmC,YAAY;AAC/C,8CAA8C,UAAU;AACxD;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,SAAS;AAC5D;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,WAAW;AACX;AACA;AACA,WAAW;AACX;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,IAAI,KAAK,IAAI,KAAK,IAAI;AAC1F;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kEAAkE,IAAI,KAAK,IAAI;AAC/E;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,kEAAkE,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,mEAAmE,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI;AAC3G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,0EAA0E,IAAI,KAAK,IAAI,KAAK,IAAI;AAChG;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,IAAI,YAAY;AACnB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG,IAAI,YAAY;AACnB;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACldsD;AACtD;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,WAAW;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,4BAA4B;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,WAAW;AACvB;AACA,IAAI,QAAQ;AACZ,IAAI,QAAQ;AACZ,GAAG;AACH;AACA;AACA,YAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA,YAAY,qBAAqB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,MAAM;AACN;AACA;AACA,GAAG;AACH;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,oBAAoB,IAAI,eAAe;AACxF;AACA;AACA,GAAG;AACH;AACA;AACA,qDAAe,cAAc,EAAC;;;ACnHkB;AACU;AACI;AAC9D;AACA;AACA;AACA,IAAI,eAAe;AACnB,IAAI,gBAAgB;AACpB,IAAI,cAAc;AAClB,GAAG;AACH;AACA;AACA;AACA;AACA,CAAC","sources":["webpack://build/../pordosol/assets/javascripts/components/utilities.js","webpack://build/../pordosol/assets/javascripts/pages/tag/filters.js","webpack://build/../pordosol/assets/javascripts/components/infinityScroll.js","webpack://build/../pordosol/assets/javascripts/pages/tag.js"],"sourcesContent":["// ===============================================================\r\n// ADIÇÃO MANUAL DE ASSET\r\n// ===============================================================\r\n// Usado para incluir assets no código de forma manual, conforme a necessidade\r\nexport function addAsset(source, onloadCallback) {\r\n if (!source || source === '') return console.error(`addAsset: caminho não definido.`);\r\n\r\n if (source.includes('.js')) {\r\n const scriptTag = document.createElement('script');\r\n scriptTag.setAttribute('src', source);\r\n\r\n if (onloadCallback && typeof onloadCallback === 'function') {\r\n scriptTag.onload = onloadCallback;\r\n }\r\n\r\n return document.body.appendChild(scriptTag);\r\n } else if (source.includes('.css')) {\r\n const linkTag = document.createElement('link');\r\n linkTag.setAttribute('rel', 'stylesheet');\r\n linkTag.setAttribute('type', 'text/css');\r\n linkTag.setAttribute('href', source);\r\n return document.head.appendChild(linkTag);\r\n } else {\r\n const error = `addAsset: Erro ao criar o asset. Tipo de script não definido, ou não possui tratamento para este tipo de asset.`;\r\n return console.error(error, source);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA O CARRINHO ATIVO\r\n// ===============================================================\r\nexport async function getCart() {\r\n try {\r\n const response = await fetch('/carrinho', {\r\n headers: {\r\n Accept: 'application/json',\r\n },\r\n });\r\n\r\n return await response.json();\r\n } catch (error) {\r\n console.error('Erro ao buscar os dados do carrinho');\r\n console.error(error);\r\n return false;\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SERIALIZE ARRAY\r\n// ===============================================================\r\nexport function serializeArray(form) {\r\n const formData = new FormData(form);\r\n const data = {};\r\n\r\n for (const [name, value] of formData) {\r\n data[name] = value;\r\n }\r\n\r\n const formBody = [];\r\n\r\n for (const key in data) {\r\n const encodeKey = encodeURIComponent(key);\r\n const encodeValue = encodeURIComponent(data[key]);\r\n formBody.push(`${encodeKey}=${encodeValue}`);\r\n }\r\n\r\n return formBody.join('&');\r\n}\r\n\r\n// ===============================================================\r\n// URL ENCODE FORM DATA\r\n// ===============================================================\r\nexport function urlencodeFormData(formData) {\r\n let string = '';\r\n\r\n function encode(s) {\r\n return encodeURIComponent(s).replace(/%20/g, '+');\r\n }\r\n\r\n for (const pair of formData.entries()) {\r\n if (typeof pair[1] == 'string') {\r\n string += (string ? '&' : '') + encode(pair[0]) + '=' + encode(pair[1]);\r\n }\r\n }\r\n return string;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE TOGGLE\r\n// ===============================================================\r\nexport function slideToggle(contentWrapper, content, duration = 500) {\r\n let initialHeight = window.getComputedStyle(contentWrapper).height;\r\n\r\n if (initialHeight == '0px') {\r\n return slideDown(contentWrapper, content, duration);\r\n } else {\r\n return slideUp(contentWrapper, duration);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE UP\r\n// ===============================================================\r\nexport function slideUp(contentWrapper, duration = 500) {\r\n contentWrapper.style.height = '0px';\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE DOWN\r\n// ===============================================================\r\nexport function slideDown(contentWrapper, content, duration = 500) {\r\n let innerHeight = content.clientHeight;\r\n\r\n contentWrapper.style.height = `${innerHeight}px`;\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// UPDATE DISCOUNT IN PRODUCT BLOCK\r\n// ===============================================================\r\nexport function updatePriceBlock() {\r\n const priceEls = document.querySelectorAll('[data-init-price]');\r\n\r\n if (priceEls == null) return;\r\n\r\n priceEls.forEach((priceEl) => {\r\n const discount = priceEl.dataset.discountPercent;\r\n\r\n priceEl.dispatchEvent(new Event('change'));\r\n\r\n // discount\r\n if (discount != '0') {\r\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\r\n }\r\n });\r\n}\r\n\r\n// ===============================================================\r\n// PREÇO POR AJAX\r\n// ===============================================================\r\nexport function getPriceProd() {\r\n var selectors = document.querySelectorAll('[data-update-price]');\r\n var attr = 'update-price';\r\n\r\n if (selectors.length() > 0) {\r\n selectors.forEach((selector) => {\r\n var prodId = selector.dataset(attr);\r\n var url = '/produto/preco/' + prodId;\r\n\r\n if (prodId != '' && prodId != null) {\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n })\r\n .done((resp) => {\r\n selector.innerHTML = resp;\r\n })\r\n .fail((resp) => {\r\n console.error(resp);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// DEBOUNCE\r\n// ===============================================================\r\n/*\r\n Debounce retorna uma função que enquanto continuar sendo chamada não é executada\r\n A função só será executada quando para de ser chamada por N milisegundos\r\n Útil para melhorar a performance de códigos que são executados muitas vezes por segundo, como o $(window).resize()\r\n\r\n Ex:\r\n \r\n $(window).resize(debounce(function() {\r\n // código a ser executado\r\n }, 500))\r\n \r\n No exemplo acima a função só será executada 500ms depois do último resize\r\n Abra o link abaixo e redimensione a janela branca e acompanhe o output do console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/oNgqyWY\r\n\r\n Um caso comum de uso é em lojas onde a seleção de um filtro na página de tag recarrega automáticamente a página\r\n Com o debounce o usuário pode escolher vários filtros rapidamente e a página só recarrega quando parar de escolher\r\n*/\r\n\r\nexport function debounce(func, wait, immediate) {\r\n var timeout;\r\n immediate || (immediate = true);\r\n\r\n return function () {\r\n var context = this,\r\n args = arguments;\r\n\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n\r\n var callNow = immediate && !timeout;\r\n\r\n clearTimeout(timeout);\r\n\r\n timeout = setTimeout(later, wait);\r\n\r\n if (callNow) func.apply(context, args);\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// THROTTLE\r\n// ===============================================================\r\n/*\r\n Throttle diminui a frequencia que uma função é executada\r\n Enquanto no debounce a função só é executada quando para de ser chamada, no throttle ela\r\n continua sendo executada só que em um intervalo mínimo de N milisegundos (default = 250)\r\n\r\n Ex:\r\n\r\n $(window).resize(throttle() {\r\n // código a ser executado\r\n }, 500)\r\n\r\n No exemplo acima a função resize é chamada várias vezes por segundo mas só é executada 1 vez a cada 500ms\r\n Abra o link abaixo, redimensione a janela branca e acompanhe o console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/yLyKEPW\r\n\r\n Um caso comum de uso é checar se o scroll passou de um determinado ponto, para fixar um header ou alterar algum elemento do DOM\r\n*/\r\nexport function throttle(fn, threshhold, scope) {\r\n threshhold || (threshhold = 250);\r\n var last, deferTimer;\r\n return function () {\r\n var context = scope || this;\r\n\r\n var now = +new Date(),\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n // hold on to it\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n fn.apply(context, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n fn.apply(context, args);\r\n }\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT MONEY\r\n// ===============================================================\r\nexport function formatMoney(value) {\r\n // FORMATA UM VALOR\r\n return (\r\n 'R$ ' +\r\n value\r\n .toFixed(2)\r\n .replace('.', ',')\r\n .replace(/(\\d)(?=(\\d{3})+\\,)/g, '$1.')\r\n );\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT VALUE\r\n// ===============================================================\r\n\r\nexport const formatValue = function (value = '') {\r\n let parsedValue = value;\r\n if (typeof value === 'number') {\r\n parsedValue = value.toFixed(2).toString();\r\n }\r\n return parsedValue.replace('.', ',');\r\n};\r\n\r\n// ===============================================================\r\n// VALIDA QUANTIDADE\r\n// ===============================================================\r\nexport function validateQuantity(_val) {\r\n // VALIDA SE A QUANTIDADE INFORMADA É UM NÚMERO\r\n if (!isNaN(_val)) {\r\n if (parseInt(_val) > 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// CLEAR NUMBER\r\n// ===============================================================\r\nexport function getClearNumber(_val) {\r\n // RETORNA UM NÚMERO LIMPO COMO INT\r\n if (!isNaN(_val)) {\r\n var clearNumber = parseInt(_val);\r\n\r\n return clearNumber;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA\r\n// ===============================================================\r\nexport function setSearch() {\r\n const toggleButton = document.querySelectorAll('[data-toggle-search]');\r\n const search = document.querySelector('[data-search-container]');\r\n const input = document.querySelector('[data-search-input]');\r\n\r\n toggleButton.length > 0 &&\r\n toggleButton.forEach((button) => {\r\n button.addEventListener('click', () => {\r\n if (search.classList.contains('open')) {\r\n search.classList.remove('open');\r\n } else {\r\n search.classList.add('open');\r\n setTimeout(() => {\r\n input.focus();\r\n }, 400);\r\n }\r\n });\r\n });\r\n}\r\n\r\n// ===============================================================\r\n// MÁSCARA PARA INPUTS\r\n// ===============================================================\r\nexport function formMasks() {\r\n const inputPhone = document.querySelector('[data-phone-mask]'),\r\n inputCEP = document.querySelector('[data-cep-mask]'),\r\n inputCPF = document.querySelector('[data-cpf-mask]'),\r\n inputCNPJ = document.querySelector('[data-cnpj-mask]'),\r\n inputDateOfBirth = document.querySelector('[data-birth-mask]');\r\n\r\n inputPhone &&\r\n inputPhone.addEventListener('input', (e) => {\r\n //(XX) XXXXX-XXXX\r\n var phoneValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,5})(\\d{0,4})/);\r\n e.target.value = !phoneValue[2]\r\n ? phoneValue[1]\r\n : '(' + phoneValue[1] + ') ' + phoneValue[2] + (phoneValue[3] ? '-' + phoneValue[3] : '');\r\n });\r\n\r\n inputCEP &&\r\n inputCEP.addEventListener('input', (e) => {\r\n //XXXXX-XX\r\n var cepValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,5})(\\d{0,3})/);\r\n e.target.value = !cepValue[2] ? cepValue[1] : cepValue[1] + '-' + cepValue[2];\r\n });\r\n\r\n inputCPF &&\r\n inputCPF.addEventListener('input', (e) => {\r\n //XXX.XXX.XXX-XX\r\n var cpfValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,3})(\\d{0,3})(\\d{0,3})(\\d{0,2})/);\r\n e.target.value = !cpfValue[2]\r\n ? cpfValue[1]\r\n : cpfValue[1] +\r\n '.' +\r\n cpfValue[2] +\r\n (cpfValue[3] ? '.' + cpfValue[3] : '') +\r\n (cpfValue[4] ? '-' + cpfValue[4] : '');\r\n });\r\n\r\n inputCNPJ &&\r\n inputCNPJ.addEventListener('input', (e) => {\r\n //XX.XXX.XXX/XXXX-XX\r\n var cnpjValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,3})(\\d{0,3})(\\d{0,4})(\\d{0,2})/);\r\n e.target.value = !cnpjValue[2]\r\n ? cnpjValue[1]\r\n : cnpjValue[1] +\r\n '.' +\r\n cnpjValue[2] +\r\n (cnpjValue[3] ? '.' + cnpjValue[3] : '') +\r\n (cnpjValue[4] ? '/' + cnpjValue[4] : '') +\r\n (cnpjValue[5] ? '-' + cnpjValue[5] : '');\r\n });\r\n\r\n inputDateOfBirth &&\r\n inputDateOfBirth.addEventListener('input', (e) => {\r\n // XXXX-XX-XX\r\n var dateOfBirthValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,2})(\\d{0,4})/);\r\n e.target.value = !dateOfBirthValue[2]\r\n ? dateOfBirthValue[1]\r\n : dateOfBirthValue[1] + '/' + dateOfBirthValue[2] + (dateOfBirthValue[3] ? '/' + dateOfBirthValue[3] : '');\r\n });\r\n}\r\n\r\n// ===============================================================\r\n// INSERE SCRIPT DO RECLAME AQUI\r\n// ===============================================================\r\nexport function addReclameAquiScript() {\r\n const scriptContainer = document.getElementById(\"ra-verified-seal\");\r\n\r\n // Montagem do script\r\n const reclameAquiScript = document.createElement('script')\r\n reclameAquiScript.setAttribute('type', 'text/javascript');\r\n reclameAquiScript.setAttribute('id', 'ra-embed-verified-seal');\r\n reclameAquiScript.setAttribute('src', 'https://s3.amazonaws.com/raichu-beta/ra-verified/bundle.js');\r\n reclameAquiScript.setAttribute('data-id', 'bXNEZkFmV2ZEWmdaOUdFVzpwb3ItZG8tc29sLWV4cGFuc2Fv');\r\n reclameAquiScript.setAttribute('data-target', 'ra-verified-seal');\r\n reclameAquiScript.setAttribute('data-model', '1');\r\n\r\n const eventType = window.mobile ? 'scroll' : 'mousemove'\r\n window.addEventListener(eventType, () => {\r\n console.log(\"-> Reclame aqui script\")\r\n\r\n // Inserção\r\n scriptContainer.appendChild(reclameAquiScript);\r\n }, { once: true })\r\n\r\n}\r\n\r\n// ===============================================================\r\n// INSERE SCRIPT DO EBIT\r\n// ===============================================================\r\nexport function addEbitScript() {\r\n const scriptContainer = document.querySelector(\".stamps\");\r\n\r\n // Montagem do script\r\n const ebitScript = document.createElement('script')\r\n ebitScript.setAttribute('type', 'text/javascript');\r\n ebitScript.setAttribute('id', 'getSelo');\r\n ebitScript.setAttribute('src', 'https://imgs.ebit.com.br/ebitBR/selo-ebit/js/getSelo.js?119961');\r\n\r\n const eventType = window.mobile ? 'scroll' : 'mousemove'\r\n window.addEventListener(eventType, () => {\r\n console.log(\"-> Ebit script\")\r\n\r\n // Inserção\r\n scriptContainer.appendChild(ebitScript);\r\n }, { once: true })\r\n\r\n}\r\n\r\n// =================================================\r\n// Atualiza o a Tag Canônica - Remoção de parâmetros\r\n// =================================================\r\nexport function updateCanonicalTag() {\r\n const canonicalLink = document.querySelector('link[rel=\"canonical\"]');\r\n const getPage = /page=([^&]+)/;\r\n\r\n if (canonicalLink) {\r\n let canonicalURL = canonicalLink.getAttribute('href');\r\n let canonicalPage = canonicalURL.match(getPage);\r\n\r\n console.log(canonicalPage);\r\n\r\n // Verifica se a URL canônica contém algum parâmetro\r\n if (canonicalURL.includes('?')) {\r\n // Guarda apenas o conteúdo sem parâmetros\r\n canonicalURL = canonicalURL.split('?')[0];\r\n\r\n if (canonicalPage && canonicalPage[1] > 1) {\r\n canonicalURL = canonicalURL + \"?\" + canonicalPage[0];\r\n }\r\n\r\n // Atualiza a tag canônica com o link sem parâmetros\r\n canonicalLink.setAttribute('href', canonicalURL);\r\n }\r\n }\r\n}\r\n","import { addAsset } from '../../components/utilities';\r\n\r\nexport const FilterComponent = {\r\n root: document.querySelector('#component-products-filter-root'),\r\n mobileButton: document.querySelector('#open-filter-mobile'),\r\n settings: window.filterSettings || false,\r\n showPriceSlider: true,\r\n instance: false,\r\n\r\n sortArrayValues: function (array, property) {\r\n let sortedArray = array.sort((a, b) => {\r\n if (a[property] < b[property]) return -1;\r\n if (b[property] > b[property]) return 1;\r\n return 0;\r\n });\r\n\r\n // Define ordenação dos tamanhos\r\n const customOrder = ['pp', 'p', 'm', 'g', 'gg', 'xg', 'xgg'];\r\n sortedArray.forEach((item) => {\r\n item.sort = 99;\r\n customOrder.forEach((order, index) => {\r\n if (item[property].toLowerCase() === order) item.sort = index;\r\n });\r\n });\r\n\r\n return sortedArray.sort((a, b) => {\r\n if (a.sort < b.sort) return -1;\r\n if (b.sort > b.sort) return 1;\r\n return 0;\r\n });\r\n },\r\n\r\n setTagTypes: function () {\r\n const { settings } = FilterComponent;\r\n const tags = [];\r\n\r\n if (settings.aggregations) {\r\n const aggregations = settings.aggregations;\r\n\r\n // Filtro de categoria\r\n if (aggregations.types.categoria)\r\n tags.push({\r\n title: 'Categoria',\r\n type: 'categoria',\r\n style: 'list',\r\n options: FilterComponent.sortArrayValues(aggregations.types.categoria, 'title'),\r\n });\r\n }\r\n\r\n return tags;\r\n },\r\n\r\n setPropeties: function () {\r\n const { settings } = FilterComponent;\r\n const properties = [];\r\n\r\n if (settings.aggregations) {\r\n const aggregations = settings.aggregations;\r\n\r\n // Filtros Atributo 1\r\n if (aggregations.properties.property1.length > 0)\r\n properties.push({\r\n title: 'Cor',\r\n property: 'property1',\r\n style: 'colors',\r\n colorsProps: {\r\n showTitle: true,\r\n showColor: true,\r\n },\r\n options: FilterComponent.sortArrayValues(aggregations.properties.property1, 'value'),\r\n patterns: settings.patterns,\r\n });\r\n\r\n // Filtros Atributo 2\r\n if (aggregations.properties.property2.length > 0)\r\n properties.push({\r\n title: 'Volume',\r\n property: 'property2',\r\n style: 'list',\r\n options: FilterComponent.sortArrayValues(aggregations.properties.property2, 'value'),\r\n patterns: settings.patterns,\r\n });\r\n\r\n // Filtros Atributo 3\r\n if (aggregations.properties.property3.length > 0)\r\n properties.push({\r\n title: 'Tamanho',\r\n property: 'property3',\r\n style: 'list',\r\n options: FilterComponent.sortArrayValues(aggregations.properties.property3, 'value'),\r\n patterns: settings.patterns,\r\n });\r\n }\r\n\r\n return properties;\r\n },\r\n\r\n setPricesRanges: function () {\r\n const { settings, showPriceSlider } = FilterComponent;\r\n let priceSettings = {\r\n price: false,\r\n priceProps: false,\r\n };\r\n\r\n // Exibe o slider de preço. Caso tenha faixas de preço,\r\n // preferência fica para as faixas (abaixo)\r\n if (showPriceSlider) {\r\n priceSettings.price = [settings.aggregations.min_price, settings.aggregations.max_price];\r\n }\r\n\r\n // Exibe as opções de faixa de preço\r\n if (settings.prices_range.length > 0) {\r\n priceSettings.priceProps = {\r\n mode: 'options',\r\n options: settings.prices_range,\r\n };\r\n priceSettings.price = [settings.aggregations.min_price, settings.aggregations.max_price];\r\n }\r\n\r\n return priceSettings;\r\n },\r\n\r\n setFilters: function () {\r\n const { root } = FilterComponent;\r\n const tags = FilterComponent.setTagTypes();\r\n const properties = FilterComponent.setPropeties();\r\n const priceSettings = FilterComponent.setPricesRanges();\r\n const mode = window.innerWidth <= 1024 ? 'drawer' : 'vertical';\r\n\r\n const componentFilters = new Vnda.Component.ProductsFilter({\r\n mode,\r\n hasSort: true,\r\n filterOnClick: false,\r\n resetMode: 'all',\r\n tags,\r\n properties,\r\n price: priceSettings.price,\r\n priceProps: priceSettings.priceProps,\r\n });\r\n\r\n // Renderiza o componente\r\n componentFilters.render(root);\r\n FilterComponent.instance = componentFilters;\r\n root.dispatchEvent(new Event('vnda:filter-component-loaded'));\r\n },\r\n\r\n loadFilters: function () {\r\n const { settings } = FilterComponent;\r\n if (!settings) return;\r\n addAsset(settings.script, FilterComponent.setFilters);\r\n addAsset(settings.styles);\r\n },\r\n\r\n show: function () {\r\n const { root } = FilterComponent;\r\n\r\n if (!FilterComponent.instance) {\r\n FilterComponent.loadFilters();\r\n root.addEventListener('vnda:filter-component-loaded', () => {\r\n FilterComponent.instance.toggle();\r\n });\r\n } else {\r\n FilterComponent.instance.toggle();\r\n }\r\n },\r\n\r\n init: function () {\r\n const { root, mobileButton } = FilterComponent;\r\n\r\n if (!root) return;\r\n\r\n // mobile: monta ao clicar no botão\r\n // desktop: monta ao carregar a página\r\n if (window.innerWidth <= 991) {\r\n if (mobileButton)\r\n mobileButton.addEventListener('click', () => {\r\n FilterComponent.show();\r\n });\r\n } else {\r\n FilterComponent.loadFilters();\r\n }\r\n },\r\n};\r\n","// Insira esse arquivo em javascripts/components\r\n\r\nconst InfinityScroll = {\r\n params: window._pagination,\r\n priceProds: {\r\n selector: '[data-update-price]',\r\n attr: 'update-price',\r\n },\r\n elementsWrapper: document.querySelectorAll('.section-list-products, .blog')[0],\r\n elementWrapper: document.querySelectorAll('.list-products, .list-posts')[0],\r\n element: '',\r\n button: document.querySelector('[data-load-more]'),\r\n\r\n stopLoading: function () {\r\n const button = this.button;\r\n\r\n if (button != null) button.parentElement.removeChild(button);\r\n },\r\n\r\n setCurrentPage: function (_number) {\r\n const totalPages = this.params.totalPages;\r\n\r\n if (_number <= totalPages) {\r\n this.params.currentPage = _number;\r\n\r\n if (this.params.currentPage >= totalPages) this.stopLoading();\r\n\r\n if (_number < totalPages) return (this.params.nextUrl = this.params.pages[_number].url);\r\n }\r\n },\r\n\r\n setScript: function (script) {\r\n const newScript = document.createElement('script');\r\n newScript.innerText = script.innerText;\r\n return document.body.appendChild(newScript);\r\n },\r\n\r\n loadElements: async function () {\r\n const nextUrl = this.params.nextUrl;\r\n const response = await fetch(nextUrl);\r\n const data = await response.text();\r\n\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(data, 'text/html');\r\n\r\n // Busca por scripts para compra rápida\r\n const scripts = doc.querySelectorAll('[data-variants-script]');\r\n scripts.length > 0 && scripts.forEach(script => this.setScript(script));\r\n\r\n return doc.querySelectorAll('.product-block, .post-block');\r\n },\r\n\r\n updatePrice: function () {\r\n window.Vnda.Component.Price.update();\r\n },\r\n\r\n getNextPage: async function () {\r\n const currentPage = this.params.currentPage;\r\n const wrapper = this.elementWrapper;\r\n const elementWrapper = this.elementWrapper;\r\n const button = this.button;\r\n\r\n if (!wrapper.classList.contains('-searching')) {\r\n wrapper.classList.add('-searching');\r\n button.classList.add('-searching');\r\n\r\n const newElements = await this.loadElements();\r\n\r\n newElements.forEach(element => elementWrapper.appendChild(element));\r\n\r\n this.setCurrentPage(currentPage + 1);\r\n\r\n if (document.querySelector('.product-block')) {\r\n window.ProductPurchase.init(true);\r\n this.updatePrice(currentPage + 1)\r\n }\r\n\r\n window.lazyLoad && window.lazyLoad.init();\r\n\r\n wrapper.classList.remove('-searching');\r\n button.classList.remove('-searching');\r\n }\r\n },\r\n\r\n updateBlogPagination: function () {\r\n let infoToReplace = \"blog?\";\r\n\r\n if (window.location.href.includes(\"categories=\")) {\r\n const categoryParams = window.location.href.split('blog?')[1];\r\n infoToReplace = `blog?${categoryParams}&`;\r\n }\r\n\r\n this.params = JSON.parse(JSON.stringify(this.params)\r\n .replaceAll('cockpit?', infoToReplace)\r\n .replaceAll('cockpit', 'blog')\r\n );\r\n\r\n },\r\n\r\n init: function () {\r\n const params = this.params;\r\n const button = this.button;\r\n\r\n if (typeof params != 'undefined') {\r\n\r\n //Atualiza URLs da paginação do blog\r\n window.location.href.includes(\"m/blog\") && this.updateBlogPagination();\r\n\r\n if (button != null) {\r\n button.addEventListener('click', () => { this.getNextPage() }, { passive: true });\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport default InfinityScroll;\r\n","import { FilterComponent } from './tag/filters';\r\nimport InfinityScroll from '../components/infinityScroll';\r\nimport { updatePriceBlock } from '../components/utilities.js';\r\n\r\nconst Tag = {\r\n init: function () {\r\n FilterComponent.init();\r\n updatePriceBlock();\r\n InfinityScroll.init();\r\n },\r\n};\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n Tag.init();\r\n})\r\n"],"names":[],"sourceRoot":""}