{"version":3,"file":"tag.js","mappings":"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","sources":["webpack://build/../pairbeauty/assets/javascripts/components/utilities.js","webpack://build/../pairbeauty/assets/javascripts/pages/tag/filters.js","webpack://build/../pairbeauty/assets/javascripts/components/infinityScroll.js","webpack://build/../pairbeauty/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\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\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\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 const cart = await response.json();\r\n return cart;\r\n } catch (error) {\r\n console.error('Erro ao buscar os dados do carrinho');\r\n console.error(error);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SERIALIZE ARRAY\r\n// ===============================================================\r\nexport function serializeArray(form) {\r\n\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 = formBody.join('&')\r\n \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 && toggleButton.forEach(button => {\r\n button.addEventListener('click', () => {\r\n\r\n if (search.classList.contains('open')) {\r\n search.classList.remove('open');\r\n\r\n } else {\r\n search.classList.add('open');\r\n setTimeout(() => { input.focus() }, 400);\r\n }\r\n })\r\n })\r\n}\r\n\r\n// ===============================================================\r\n// CONDITIONAL LAZY\r\n// ===============================================================\r\nexport function handleConditionalLazy () {\r\n\r\n const setConditionalLazy = () => {\r\n window.removeEventListener('scroll', setConditionalLazy);\r\n window.removeEventListener('mousemove', setConditionalLazy);\r\n\r\n const productsVideo = document.querySelectorAll(\"[data-conditional-lazy]\");\r\n productsVideo.length > 0 && productsVideo.forEach(video => {\r\n video.classList.add('lazy');\r\n window.lazyLoadInstance && window.lazyLoadInstance.update();\r\n })\r\n }\r\n window.addEventListener('scroll', setConditionalLazy);\r\n window.addEventListener('mousemove', setConditionalLazy);\r\n\r\n}","import { addAsset } from '../../components/utilities';\n\nexport const FilterComponent = {\n root: document.querySelector('#component-products-filter-root'),\n mobileButton: document.querySelector('#open-filter-mobile'),\n settings: window.filterSettings || false,\n showPriceSlider: true,\n instance: false,\n\n sortArrayValues: function (array, property) {\n let sortedArray = array.sort((a, b) => {\n if (a[property] < b[property]) return -1;\n if (b[property] > b[property]) return 1;\n return 0;\n });\n\n // Define ordenação dos tamanhos\n const customOrder = ['pp', 'p', 'm', 'g', 'gg', 'xg', 'xgg'];\n sortedArray.forEach((item) => {\n item.sort = 99;\n customOrder.forEach((order, index) => {\n if (item[property].toLowerCase() === order) item.sort = index;\n });\n });\n\n return sortedArray.sort((a, b) => {\n if (a.sort < b.sort) return -1;\n if (b.sort > b.sort) return 1;\n return 0;\n });\n },\n\n setTagTypes: function () {\n const { settings } = FilterComponent;\n const tags = [];\n\n if (settings.aggregations) {\n const aggregations = settings.aggregations;\n\n // Filtro de categoria\n if (aggregations.types.categoria)\n tags.push({\n title: 'Categoria',\n type: 'categoria',\n style: 'list',\n options: FilterComponent.sortArrayValues(aggregations.types.categoria, 'title'),\n });\n }\n\n return tags;\n },\n\n setProperties: function () {\n const { settings } = FilterComponent;\n const properties = [];\n\n if (settings.aggregations) {\n const aggregations = settings.aggregations;\n\n // Filtros Atributo 1\n if (aggregations.properties.property1.length > 0)\n properties.push({\n title: 'Cor',\n property: 'property1',\n style: 'colors',\n colorsProps: {\n showTitle: true,\n showColor: true,\n },\n options: FilterComponent.sortArrayValues(aggregations.properties.property1, 'value'),\n patterns: settings.patterns,\n });\n\n // Filtros Atributo 2\n if (aggregations.properties.property2.length > 0)\n properties.push({\n title: 'Tamanho',\n property: 'property2',\n style: 'grid',\n options: FilterComponent.sortArrayValues(aggregations.properties.property2, 'value'),\n patterns: settings.patterns,\n });\n\n // Filtros Atributo 3\n if (aggregations.properties.property3.length > 0)\n properties.push({\n title: 'Fragrância',\n property: 'property3',\n style: 'list',\n options: FilterComponent.sortArrayValues(aggregations.properties.property3, 'value'),\n patterns: settings.patterns,\n });\n }\n\n return properties;\n },\n\n setPricesRanges: function () {\n const { settings, showPriceSlider } = FilterComponent\n let priceSettings = {\n price: false,\n priceProps: false\n }\n\n // Exibe o slider de preço. Caso tenha faixas de preço,\n // preferência fica para as faixas (abaixo)\n if (showPriceSlider) {\n priceSettings.price = [\n settings.aggregations.min_price,\n settings.aggregations.max_price\n ]\n }\n\n // Exibe as opções de faixa de preço\n if (settings.prices_range.length > 0) {\n priceSettings.priceProps = {\n mode: 'options',\n options: settings.prices_range\n }\n priceSettings.price = [\n settings.aggregations.min_price,\n settings.aggregations.max_price\n ]\n }\n\n console.log('priceSettings', priceSettings)\n\n return priceSettings\n },\n\n setFilters: function () {\n const { root } = FilterComponent;\n const tags = FilterComponent.setTagTypes();\n const properties = FilterComponent.setProperties();\n const priceSettings = FilterComponent.setPricesRanges();\n const mode = window.innerWidth <= 1024 ? 'drawer' : 'vertical';\n\n const componentFilters = new Vnda.Component.ProductsFilter({\n mode,\n hasSort: true,\n filterOnClick: false,\n resetMode: 'all',\n tags,\n properties,\n price: priceSettings.price,\n priceProps: priceSettings.priceProps,\n });\n\n // Renderiza o componente\n componentFilters.render(root);\n FilterComponent.instance = componentFilters;\n root.dispatchEvent(new Event('vnda:filter-component-loaded'));\n },\n\n loadFilters: function () {\n const { settings } = FilterComponent;\n if (!settings) return;\n addAsset(settings.script, FilterComponent.setFilters);\n addAsset(settings.styles);\n },\n\n show: function () {\n const { root } = FilterComponent;\n\n if (!FilterComponent.instance) {\n FilterComponent.loadFilters();\n root.addEventListener('vnda:filter-component-loaded', () => {\n FilterComponent.instance.toggle();\n });\n } else {\n FilterComponent.instance.toggle();\n }\n },\n\n init: function () {\n const { root, mobileButton } = FilterComponent;\n\n if (!root) return;\n\n // mobile: monta ao clicar no botão\n // desktop: monta ao carregar a página\n if (window.innerWidth <= 1024) {\n if (mobileButton)\n mobileButton.addEventListener('click', () => {\n FilterComponent.show();\n });\n } else {\n FilterComponent.loadFilters();\n }\n },\n};\n","const InfinityScroll = {\r\n params: window._pagination,\r\n priceProds: {\r\n selector: '[data-update-price]',\r\n attr: 'update-price',\r\n },\r\n productsWrapper: document.querySelectorAll('.section-list-products')[0],\r\n productWrapper: document.querySelectorAll('.list-products')[0],\r\n button: document.querySelector('[data-load-more]'),\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 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 loadProducts: 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 const script = doc.querySelector('[data-product-variants]');\r\n\r\n // Busca por scripts para compra rápida\r\n const scripts = doc.querySelectorAll('[data-variants-script]');\r\n if (scripts.length > 0)\r\n scripts.forEach((script) => {\r\n InfinityScroll.setScript(script);\r\n });\r\n\r\n return doc.querySelectorAll('.product-block');\r\n },\r\n updatePrice: function () {\r\n window.Vnda.Component.Price.update();\r\n },\r\n getNextPage: async function () {\r\n const currentPage = this.params.currentPage;\r\n const wrapper = this.productsWrapper;\r\n const productWrapper = this.productWrapper;\r\n\r\n if (!wrapper.classList.contains('-searching')) {\r\n this.productsWrapper.classList.add('-searching');\r\n this.button.classList.add('-searching');\r\n\r\n const newProducts = await this.loadProducts();\r\n\r\n newProducts.forEach((product) => {\r\n productWrapper.appendChild(product);\r\n });\r\n\r\n this.setCurrentPage(currentPage + 1);\r\n\r\n window.ProductPurchase.init(true);\r\n lazyLoadInstance.update();\r\n this.updatePrice();\r\n\r\n wrapper.classList.remove('-searching');\r\n this.button.classList.remove('-searching');\r\n }\r\n },\r\n\r\n init: function () {\r\n const button = this.button;\r\n\r\n if (typeof this.params != undefined) {\r\n if (button != null) {\r\n button.addEventListener(\r\n 'click',\r\n () => {\r\n this.getNextPage();\r\n },\r\n { passive: true }\r\n );\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport default InfinityScroll;\r\n","import { FilterComponent } from './tag/filters';\nimport InfinityScroll from '../components/infinityScroll';\nimport { updatePriceBlock } from '../components/utilities.js';\n\nconst Tag = {\n init: function () {\n FilterComponent.init();\n updatePriceBlock();\n InfinityScroll.init();\n },\n};\n\nwindow.addEventListener('DOMContentLoaded', () => {\n Tag.init();\n})\n"],"names":["addAsset","source","onloadCallback","console","error","includes","scriptTag","document","createElement","setAttribute","onload","body","appendChild","linkTag","head","FilterComponent","root","querySelector","mobileButton","settings","window","filterSettings","showPriceSlider","instance","sortArrayValues","array","property","sortedArray","sort","a","b","customOrder","forEach","item","order","index","toLowerCase","setTagTypes","tags","aggregations","types","categoria","push","title","type","style","options","setProperties","properties","property1","length","colorsProps","showTitle","showColor","patterns","property2","property3","setPricesRanges","priceSettings","price","priceProps","min_price","max_price","prices_range","mode","log","setFilters","innerWidth","componentFilters","Vnda","Component","ProductsFilter","hasSort","filterOnClick","resetMode","render","dispatchEvent","Event","loadFilters","script","styles","show","toggle","addEventListener","init","InfinityScroll","params","_pagination","priceProds","selector","attr","productsWrapper","querySelectorAll","productWrapper","button","stopLoading","this","parentElement","removeChild","setCurrentPage","_number","totalPages","currentPage","nextUrl","pages","url","setScript","newScript","innerText","loadProducts","async","response","fetch","data","text","doc","DOMParser","parseFromString","scripts","updatePrice","Price","update","getNextPage","wrapper","classList","contains","add","product","ProductPurchase","lazyLoadInstance","remove","undefined","passive","Tag","priceEls","priceEl","discount","dataset","discountPercent","setProperty","updatePriceBlock"],"sourceRoot":""}