{"version":3,"file":"pages.js","mappings":"yBA+GO,SAASA,UAAUC,eAAgBC,QAASC,SAAW,KAC5D,IAAIC,YAAcF,QAAQG,aAE1BJ,eAAeK,MAAMC,OAAS,GAAGH,gBACjCH,eAAeK,MAAME,WAAa,UAAUL,eAC9C,CClHe,SAASM,SACpB,IAAIC,gBACAT,eACAC,QAKJ,IAAIS,cAAgBC,SAASC,SAASC,KAElCH,gBACAD,gBAAkBE,SAASG,cAAcJ,eACzCV,eAAiBS,gBAAgBK,cAAc,oBAC/Cb,QAAUQ,gBAAgBK,cAAc,YAGxCC,OAAOC,SAAS,CACZC,IAAKjB,eAAekB,UAAY,IAChCC,SAAU,WAIdpB,UAAUC,eAAgBC,QAAS,MAIjBU,SAASS,iBAAiB,mBAEhCC,SAASC,SACrBA,OAAOC,iBAAiB,SAAUC,IAC9BA,EAAEC,iBAEFhB,gBAAkBa,OAAOI,QAAQ,mBACjC1B,eAAiBS,gBAAgBK,cAAc,oBAC/Cb,QAAUQ,gBAAgBK,cAAc,YAExCL,gBAAgBkB,UAAUC,OAAO,SDoDtC,SAAqB5B,eAAgBC,QAASC,SAAW,KAGzC,OAFDa,OAAOc,iBAAiB7B,gBAAgBM,OAGnDP,UAAUC,eAAgBC,QAASC,UASvC,SAAiBF,eAAgBE,SAAW,KACjDF,eAAeK,MAAMC,OAAS,MAC9BN,eAAeK,MAAME,WAAa,UAAUL,eAC9C,CAVW4B,CAAQ9B,eAAgBE,SAEnC,CC1DY6B,CAAY/B,eAAgBC,QAAS,IAAI,GAC3C,GAEV,CCxCA,MAAM+B,KAAO,CACXC,KAAM,WAEJzB,QAEF,GAGFO,OAAOQ,iBAAiB,oBAAoB,KAC1CS,KAAKC,MAAK,G","sources":["webpack://build/../shetreats/assets/javascripts/components/utilities.js","webpack://build/../shetreats/assets/javascripts/pages/pages/setFaq.js","webpack://build/../shetreats/assets/javascripts/pages/pages.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","import { slideToggle, slideDown } from '../../components/utilities';\r\n\r\nexport default function setFaq() {\r\n var collapseWrapper;\r\n var contentWrapper;\r\n var content;\r\n\r\n // No primeiro load verifica se tem o id do collapse na url e abre ela\r\n // console.log(document.location.hash);\r\n\r\n let urlCollapseId = document.location.hash;\r\n\r\n if (urlCollapseId) {\r\n collapseWrapper = document.querySelector(urlCollapseId);\r\n contentWrapper = collapseWrapper.querySelector('.content-wrapper');\r\n content = collapseWrapper.querySelector('.content');\r\n\r\n // Da scroll na página até o collapse\r\n window.scrollTo({\r\n top: contentWrapper.offsetTop - 300,\r\n behavior: 'smooth',\r\n });\r\n\r\n // Abre o collapse\r\n slideDown(contentWrapper, content, 300);\r\n }\r\n\r\n // Lida com o clique nos collapses\r\n var collapseButtons = document.querySelectorAll('[open-collapse]');\r\n\r\n collapseButtons.forEach((button) => {\r\n button.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n collapseWrapper = button.closest('[data-collapse]');\r\n contentWrapper = collapseWrapper.querySelector('.content-wrapper');\r\n content = collapseWrapper.querySelector('.content');\r\n\r\n collapseWrapper.classList.toggle('-open');\r\n\r\n slideToggle(contentWrapper, content, 300);\r\n });\r\n });\r\n}\r\n","import setFaq from './pages/setFaq';\r\n//addImports\r\n\r\nconst Page = {\r\n init: function () {\r\n var _this = this;\r\n setFaq()\r\n//calls\r\n },\r\n};\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n Page.init()\r\n})\r\n"],"names":["slideDown","contentWrapper","content","duration","innerHeight","clientHeight","style","height","transition","setFaq","collapseWrapper","urlCollapseId","document","location","hash","querySelector","window","scrollTo","top","offsetTop","behavior","querySelectorAll","forEach","button","addEventListener","e","preventDefault","closest","classList","toggle","getComputedStyle","slideUp","slideToggle","Page","init"],"sourceRoot":""}