{"version":3,"file":"main.js","mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,SAAS;AACT;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,+CAAe,QAAQ,EAAC;;;ACjExB;AACA;AACA;AACO;AACP;AACA;AACA,iDAAiD,KAAK;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,OAAO;AAC3C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,iEAAiE,OAAO;AACxE;AACA,SAAS;AACT;AACA;AACA,GAAG;AACH;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;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;AACA;AACA;AACA,oCAAoC,QAAQ;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpMsD;AACtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,GAAG;AACH;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,oDAAoD,WAAW,YAAY,0CAA0C,WAAW,YAAY;AAC5I;AACA,KAAK;AACL,mCAAmC,kDAAkD;AACrF,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAe,UAAU,EAAC;;;ACrE1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,6CAAe,MAAM,EAAC;AACtB;;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,2CAAe,IAAI,EAAC;AACpB;;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,KAAK;AAC3C,YAAY;AACZ,sCAAsC,KAAK;AAC3C;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,qDAAe,cAAc,EAAC;AAC9B;;;ACvByC;AACI;AACR;AACJ;AACjC;AACsD;AACD;AACrD;AACA;AACA;AACA;AACA;AACA;AACA,iEAAiE,iBAAiB,oCAAoC,kBAAkB;AACxI;AACA;AACA,EAAE,YAAY;AACd,EAAE,QAAQ;AACV,EAAE,UAAU;AACZ,EAAE,MAAM;AACR,EAAE,IAAI;AACN,EAAE,cAAc;AAChB,CAAC","sources":["webpack://build/../euliricas/assets/javascripts/common/webforms.js","webpack://build/../euliricas/assets/javascripts/components/utilities.js","webpack://build/../euliricas/assets/javascripts/common/headerCart.js","webpack://build/../euliricas/assets/javascripts/common/search.js","webpack://build/../euliricas/assets/javascripts/common/menu.js","webpack://build/../euliricas/assets/javascripts/common/changeLanguage.js","webpack://build/../euliricas/assets/javascripts/main.js"],"sourcesContent":["// ===============================================================\r\n// Envio padrão dos Webforms\r\n// ===============================================================\r\nconst Webforms = {\r\n submitForm: function(_$form) {\r\n _$form.find('[name=\"reply_to\"]').val(_$form.find('[name=\"email\"]').val());\r\n\r\n if (!_$form.hasClass('sending')) {\r\n $.ajax({\r\n url: '/webform',\r\n type: 'POST',\r\n data: _$form.serialize(),\r\n beforeSend: function () {\r\n _$form.addClass('sending');\r\n },\r\n })\r\n .done(function () {\r\n const successMessage = window.language == 'en'\r\n ? 'Sent'\r\n : 'Enviado'\r\n // console.info('foi');\r\n _$form.find('button[type=submit]').find('span').text(successMessage);\r\n })\r\n .fail(function () {\r\n const errorMessage = window.language == 'en'\r\n ? 'Falha ao enviar'\r\n : 'Failed to send'\r\n // console.info('foi, mas deu ruim');\r\n _$form.find('button[type=submit]').find('span').text('Falha ao enviar');\r\n })\r\n .always(function () {\r\n const buttonMessage = window.language == 'en'\r\n ? 'Send'\r\n : 'Enviar'\r\n\r\n console.log('complete');\r\n _$form.removeClass('sending');\r\n setTimeout(function () {\r\n _$form.find('button[type=submit]').find('span').text(buttonMessage);\r\n }, 3500); \r\n });\r\n }\r\n },\r\n\r\n init: function() {\r\n\r\n const _this = this;\r\n\r\n $('[data-webform]').on('submit', function (event) {\r\n event.preventDefault();\r\n var $form = $(this);\r\n var vnda = $(this).find('[name=\"vnda\"]');\r\n \r\n if (vnda.length > 0) {\r\n if (vnda.val() != '') {\r\n //console.info('ROBOT DETECTED');\r\n return false;\r\n }\r\n }\r\n \r\n _this.submitForm($form);\r\n });\r\n }\r\n}\r\n\r\nexport default Webforms;\r\n","// ===============================================================\r\n// Busca Preço de Produtos por Ajax\r\n// ===============================================================\r\nexport function getPriceProd() {\r\n const attr = 'data-update-price';\r\n const processedAttr = 'data-price-processed';\r\n const products = document.querySelectorAll(`[${attr}]`);\r\n\r\n if (products.length > 0) products.forEach(product => {\r\n const processed = product.getAttribute(processedAttr);\r\n\r\n if (processed != 'true') {\r\n const prodId = product.getAttribute(attr);\r\n const url = `/produto/preco/${prodId}`;\r\n\r\n if (prodId != null && prodId != '') {\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n })\r\n .done(function (resp) {\r\n // console.info(resp);\r\n product.innerHTML = resp;\r\n product.setAttribute(processedAttr, true);\r\n })\r\n .fail(function (resp) {\r\n // console.error(`Falha ao buscar o preço do produto ${prodId}`);\r\n // console.log(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// 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 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// MENSAGEM DE RESPOSTA\r\n// ===============================================================\r\nexport function setMsgResponse(_msg, _type, _$parent) {\r\n /*\r\n O tipo pode conter um dos 3 valores: success, warning, error ou CLEAR.\r\n O type CLEAR limpa as mensagens e faz sumir a mensagem\r\n O elemento _$parent precisa ter uma div [data-msg-retorno], com uma div [data-msg] dentro,\r\n para exibir a mensagem corretamente no local\r\n */\r\n\r\n // Verifica se não há mais de uma mensagem\r\n // caso tenha, gera um html para cada mensagem\r\n if (Array.isArray(_msg)) {\r\n var msgArr = _msg;\r\n _msg = '';\r\n for (var i = msgArr.length - 1; i >= 0; i--) {\r\n _msg += '' + msgArr[i] + '';\r\n }\r\n }\r\n\r\n _$parent\r\n .find('[data-msg-retorno]')\r\n .removeClass('success')\r\n .removeClass('warning')\r\n .removeClass('error');\r\n\r\n _$parent.find('[data-msg-retorno] [data-msg]').empty();\r\n\r\n if (_type != 'clear') {\r\n _$parent.find('[data-msg-retorno]').addClass(_type);\r\n _$parent.find('[data-msg-retorno] [data-msg]').html(_msg);\r\n }\r\n};\r\n","import { formatMoney } from '../components/utilities';\r\n\r\n// ===============================================================\r\n// Ações referente ao cart_drawer e ao carrinho de produtos\r\n// ===============================================================\r\nconst HeaderCart = {\r\n selector: '[data-cart-count]',\r\n attr: '[data-cart-count-attr]',\r\n text: '[data-cart-item-text]',\r\n\r\n getCartItens: async function() {\r\n try {\r\n const itens = await $.ajax({\r\n url: '/carrinho/itens',\r\n type: 'GET',\r\n dataType: 'text',\r\n })\r\n\r\n return itens;\r\n\r\n } catch (error) {\r\n console.error('Erro ao buscar a quantidade de produtos do carrinho');\r\n console.error(error);\r\n }\r\n },\r\n\r\n updateCartCount: async function(_itemsCount = null) {\r\n let items = _itemsCount;\r\n if (_itemsCount == null) {\r\n items = await this.getCartItens();\r\n }\r\n\r\n $(this.attr).data('cart-count-attr', items);\r\n $(this.attr).attr('data-cart-count-attr', items);\r\n\r\n $(this.attr).html(items);\r\n $(this.text).html(items);\r\n },\r\n \r\n show: function () {\r\n return window.componentCartDrawer.open()\r\n },\r\n\r\n updateInstallments: function () {\r\n const cartDrawer = document.querySelector('#component-cart-drawer-root');\r\n \r\n const observer = new MutationObserver(mutation => {\r\n if (!cartDrawer.querySelector('.cart-drawer-installments')) return;\r\n\r\n let installmentsEl = cartDrawer.querySelector('.cart-drawer-installments');\r\n let priceEl = installmentsEl.parentElement;\r\n let tempEl = priceEl.cloneNode(true);\r\n tempEl.querySelector('span').remove();\r\n\r\n let price = tempEl.innerText;\r\n if (price) {\r\n let value = Number(price.replace('R$ ', '').replace(',', '.'));\r\n if (installmentsEl.innerHTML != `ou 3x de ${formatMoney(value / 3)}`) installmentsEl.innerHTML = `ou 3x de ${formatMoney(value / 3)}`;\r\n }\r\n });\r\n observer.observe(cartDrawer, { attributes: true, childList: true, subtree: true });\r\n },\r\n\r\n init: function() {\r\n this.updateCartCount();\r\n this.updateInstallments();\r\n }\r\n};\r\n\r\nexport default HeaderCart;\r\n","const Search = {\r\n init: function() {\r\n const wrapperSearch = document.querySelector('[data-wrapper-search]');\r\n const openSearchButton = document.querySelector('[data-action=\"open-search\"]');\r\n const closeSearchButton = document.querySelector('[data-action=\"close-search\"]');\r\n const input = wrapperSearch.querySelector('[name=\"q\"]');\r\n\r\n openSearchButton.addEventListener('click', () => {\r\n wrapperSearch.classList.toggle('visible');\r\n\r\n setTimeout(() => {\r\n wrapperSearch.classList.contains('visible')\r\n ? input.focus()\r\n : input.blur();\r\n }, 200);\r\n });\r\n\r\n closeSearchButton.addEventListener('click', () => {\r\n wrapperSearch.classList.remove('visible');\r\n input.blur();\r\n });\r\n }\r\n}\r\n\r\nexport default Search;\r\n\r\n","const Menu = {\r\n init: function() {\r\n const $openSideMenu = $('[data-action=\"open-side-menu\"]');\r\n const $closeSideMenu = $('[data-action=\"close-side-menu\"]');\r\n const $sideMenu = $('#side-menu');\r\n const $firstMenu = $('[data-action=\"toggle-second-menu\"]');\r\n const $firstBottomMenu = $('[data-action=\"toggle-second-bottom-menu\"]');\r\n const $openFourthMenu = $('[data-toggle-fourth-menu]');\r\n const $overlay = $('[data-overlay]');\r\n\r\n $openSideMenu.on('click', function() {\r\n $sideMenu.toggleClass('visible');\r\n $overlay.toggleClass('active');\r\n });\r\n \r\n $closeSideMenu.on('click', function() {\r\n $sideMenu.removeClass('visible');\r\n $firstMenu.removeClass('active');\r\n $firstBottomMenu.removeClass('active');\r\n $('[data-submenu]').slideUp();\r\n $('[data-bottom-submenu]').slideUp();\r\n $overlay.toggleClass('active');\r\n });\r\n\r\n $firstMenu.on('click', function(e) {\r\n e.preventDefault();\r\n $(this).toggleClass('active');\r\n $(this).siblings('[data-submenu]').slideToggle();\r\n });\r\n\r\n $openFourthMenu.on('click', function() {\r\n const $thirdMenu = $(this).closest('.third-menu');\r\n \r\n if (!$thirdMenu.hasClass('active')) {\r\n $('.third-menu').removeClass('active');\r\n $thirdMenu.addClass('active');\r\n $('.third-menu:not(.active)').siblings('[data-fourth-menu]').slideUp();\r\n $thirdMenu.siblings('[data-fourth-menu]').slideDown();\r\n } else {\r\n $thirdMenu.removeClass('active');\r\n $thirdMenu.siblings('[data-fourth-menu]').slideUp();\r\n }\r\n })\r\n \r\n $firstBottomMenu.on('click', function(e) {\r\n e.preventDefault();\r\n $(this).toggleClass('active');\r\n $(this).siblings('[data-bottom-submenu]').slideToggle();\r\n });\r\n }\r\n}\r\n\r\nexport default Menu;\r\n\r\n","const ChangeLanguage = {\r\n init: function() {\r\n const intlSelector = document.querySelectorAll(\"[data-language-selector]\");\r\n\r\n if (intlSelector.length > 0) {\r\n intlSelector.forEach((selector) => {\r\n selector.addEventListener(\"change\", () => {\r\n let href = window.location.href;\r\n if (href.includes(\"?\")) href = window.location.href.split(\"?\")[0];\r\n\r\n if (selector.value == \"WORLDWIDE\") {\r\n window.location.href = `${href}?language=en`;\r\n } else if (selector.value == \"BRASIL\") {\r\n window.location.href = `${href}?language=pt-BR`;\r\n }\r\n });\r\n });\r\n }\r\n\r\n }\r\n}\r\n\r\nexport default ChangeLanguage;\r\n\r\n","import Webforms from './common/webforms';\r\nimport HeaderCart from './common/headerCart';\r\nimport Search from './common/search';\r\nimport Menu from './common/menu';\r\n\r\nimport { getPriceProd } from './components/utilities';\r\nimport ChangeLanguage from './common/changeLanguage';\r\n\r\nconst page = document.querySelector('body').getAttribute('data-page');\r\n\r\n// ==========================================\r\n// Inicialização\r\n// ==========================================\r\nconsole.log('%cVnda - Tecnologia em Ecommerce', 'color: #f88d5b; font-size: 15px; font-family: \"Verdana\", sans-serif; font-weight: bold;');\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n getPriceProd();\r\n Webforms.init();\r\n HeaderCart.init();\r\n Search.init();\r\n Menu.init();\r\n ChangeLanguage.init();\r\n});\r\n"],"names":[],"sourceRoot":""}