{"version":3,"sources":["webpack:///./app/javascript/controllers/products_controller.js","webpack:///./app/javascript/utils/address_api.js","webpack:///./app/javascript/utils/order_api.js","webpack:///./app/javascript/utils/cart_updates_handler.js","webpack:///./app/javascript/utils/delivery_address.js","webpack:///./app/javascript/utils/popover_handler.js"],"names":["this","delayTimer","orderAPI","OrderAPI","cartUpdatesHandler","CartUpdatesHandler","e","preventDefault","lineItemId","productTarget","dataset","newQuantity","productId","parseInt","quantityTarget","value","disableVariantsDropdown","disableButtons","target","setAttribute","innerText","gtag","totalOnHand","showOutOfStockPopover","classList","toggle","disableShoppingBagCounter","clearTimeout","setTimeout","addtoCart","updateItem","removeItem","deliveryAddress","variantId","priceTarget","variantPrice","presentationUnitTarget","variantPresentationUnit","totalInCart","variantIDTarget","quantityTotalTarget","decreaseButtonTarget","toggleAttribute","increaseButtonTarget","DeliveryAddress","showPopover","stillAvailable","userStockLocation","popoverWrapperTarget","PopoverHandler","inExclusionArea","validForDeliver","AddressAPI","showInvalidAddressMsg","show","document","querySelector","isCartPage","toggleLoading","then","data","handle","updateShoppingBagCounter","updateProductThumbnailControls","add","show_flash_message","window","scrollTo","enableVariantsDropdown","enableButtons","removeAttribute","remove","enableShoppingBagCounter","quantity","addressInput","getElementById","createCart","formTarget","orderNumber","order","number","orderGuestToken","guest_token","line_item","id","response","errorMessage","error","updateCart","productControlsWrappers","querySelectorAll","product_id","length","forEach","el","innerHTML","updated_product_controls","toggleDropdown","buttons","$","find","addClass","prop","each","index","div","getAttribute","button","removeClass","item_count","location","pathname","Controller","targets","addressAttributes","address","firstname","lastname","city","zipcode","phone","country_code","longitude","latitude","state","expireCookies","cookie","isDeliveryAddressValid","csrfTokenTag","csrfToken","content","instance","axios","create","headers","Promise","resolve","reject","method","url","valid_delivery_address","in_exclusion_area","saveAddress","Turbolinks","visit","toString","setCookies","place","coordinates","exclusionArea","deliveryAddressTarget","invalidAddressTitle","popover","title","trigger","template","clone","saveInvalidShippingAddress","user_address","invalid_address","isCompleteAddress","street_number","isMissingStreetNumber","missingStreetNumberMessage","Accept","params","emptyOrder","cartForm","FormData","action","line_items_content","updateLineItems","order_summary","updateOrderSummary","dispatchEvent","CustomEvent","searchInput","match","RegExp","focus"],"mappings":"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","file":"js/8-87a73549ed668fdda5b5.chunk.js","sourcesContent":["import { Controller } from '@hotwired/stimulus'\nimport { OrderAPI } from \"../utils/order_api\"\nimport { DeliveryAddress } from \"../utils/delivery_address\"\nimport { AddressAPI } from \"../utils/address_api\"\nimport { PopoverHandler } from \"../utils/popover_handler\"\nimport { CartUpdatesHandler } from \"../utils/cart_updates_handler\"\n\nexport default class extends Controller {\n static targets = [\"quantity\",\n \"decreaseButton\",\n \"product\",\n \"form\",\n \"selectedVariant\",\n \"productLabel\",\n \"increaseButton\",\n \"quantityTotal\",\n \"popoverWrapper\",\n \"variantID\",\n \"price\",\n \"presentationUnit\"]\n connect() {\n this.delayTimer\n this.orderAPI = OrderAPI()\n this.cartUpdatesHandler = CartUpdatesHandler()\n }\n\n updateQuantity(e) {\n e.preventDefault()\n const lineItemId = this.productTarget.dataset.lineItemId\n const productId = this.productTarget.dataset.productId\n\n let currentQuantity = parseInt(this.quantityTarget.value)\n let newQuantity = currentQuantity\n\n this.disableVariantsDropdown()\n this.disableButtons()\n e.target.setAttribute(\"disabled\", \"disabled\")\n\n if (e.target.innerText == \"+\") {\n newQuantity += 1\n gtag('event', 'add_to_cart')\n } else {\n newQuantity -= 1\n }\n\n if (newQuantity == parseInt(this.productTarget.dataset.totalOnHand)) {\n this.showOutOfStockPopover();\n }\n\n this.productTarget.classList.toggle(\"product-in-cart\", newQuantity > 0)\n\n if (newQuantity < 0) { return }\n\n this.quantityTarget.value = newQuantity;\n this.disableShoppingBagCounter()\n\n clearTimeout(this.delayTimer)\n\n this.delayTimer = setTimeout(() => {\n if (newQuantity > 0 && e.target.innerText == \"+\") { this.addtoCart(newQuantity) }\n else if (newQuantity > 0 && e.target.innerText == \"-\") {this.updateItem(lineItemId, newQuantity)}\n // Avoid triggering remove item if the item doesn't exist in the order\n // use case: customer click on add button and then click on remove button\n if (newQuantity == 0 && lineItemId) { this.removeItem(lineItemId) }\n }, 300)\n }\n\n variantSelected(e) {\n e.preventDefault()\n let lineItemId = e.target.dataset.lineItemId\n let deliveryAddress = this.productTarget.dataset.deliveryAddress\n\n if(typeof(lineItemId) == \"undefined\") { lineItemId = \"\" }\n\n this.productTarget.dataset.variantId = e.target.dataset.variantId\n this.productTarget.dataset.lineItemId = lineItemId\n this.productTarget.dataset.totalOnHand = e.target.dataset.totalOnHand\n this.priceTarget.innerText = e.target.dataset.variantPrice\n this.presentationUnitTarget.innerText = e.target.dataset.variantPresentationUnit\n this.quantityTarget.value = e.target.dataset.totalInCart\n this.variantIDTarget.value = e.target.dataset.variantId\n this.quantityTotalTarget.value = e.target.dataset.totalInCart\n\n this.decreaseButtonTarget.toggleAttribute(\"disabled\", e.target.dataset.totalInCart == 0)\n this.increaseButtonTarget.toggleAttribute(\"disabled\", (parseInt(e.target.dataset.totalOnHand) <= 0 || deliveryAddress == \"missing\"))\n this.productTarget.classList.toggle(\"product-in-cart\", e.target.dataset.totalInCart > 0)\n }\n\n showAddressPopover(e) {\n DeliveryAddress().showPopover();\n }\n\n outOfStockPopover() {\n let quantity = parseInt(this.quantityTarget.value)\n let stillAvailable = quantity < this.productTarget.dataset.totalOnHand\n let userStockLocation = this.popoverWrapperTarget.dataset.userStockLocation\n\n if(stillAvailable || userStockLocation == \"false\") { return }\n\n this.showOutOfStockPopover()\n }\n\n showOutOfStockPopover() {\n PopoverHandler().showPopover(this.popoverWrapperTarget)\n }\n\n invalidAddressPopover() {\n let inExclusionArea = this.popoverWrapperTarget.dataset.inExclusionArea == \"true\"\n if(this.popoverWrapperTarget.dataset.validForDeliver == \"false\") {\n AddressAPI().showInvalidAddressMsg(inExclusionArea, this.popoverWrapperTarget)\n }\n }\n\n toggleLoading(show) {\n let progress = document.querySelector(\"#progress\")\n progress.classList.toggle(\"loading\", show)\n }\n\n removeItem(lineItemId) {\n if (this.isCartPage()) { this.toggleLoading(true) }\n this.orderAPI\n .removeItem(lineItemId)\n .then((data) => {\n if (this.isCartPage()) {\n this.cartUpdatesHandler.handle(data)\n } else {\n this.quantityTotalTarget.value = 0\n this.updateShoppingBagCounter(data)\n this.updateProductThumbnailControls(data)\n }\n })\n .catch(({ }) => {\n this.productTarget.classList.add(\"product-in-cart\")\n this.quantityTarget.value = this.quantityTotalTarget.value\n show_flash_message(\"error\", \"We couldn't update your order. Please try again\")\n window.scrollTo(0, 0)\n })\n .finally(() => {\n this.enableVariantsDropdown()\n this.enableButtons()\n\n if (parseInt(this.quantityTarget.value) < parseInt(this.productTarget.dataset.totalOnHand)) {\n this.increaseButtonTarget.removeAttribute(\"disabled\")\n this.increaseButtonTarget.classList.remove('disabled')\n }\n\n this.enableShoppingBagCounter()\n this.toggleLoading(false)\n })\n }\n\n addtoCart(quantity) {\n this.quantityTotalTarget.value = quantity - parseInt(this.quantityTotalTarget.value)\n let addressInput = document.getElementById(\"ship-address\")\n\n if (this.isCartPage()) { this.toggleLoading(true) }\n\n this.orderAPI\n .createCart(this.formTarget)\n .then((data) => {\n addressInput.dataset.orderNumber = data.order.number\n addressInput.dataset.orderGuestToken = data.order.guest_token\n if (this.isCartPage()) {\n this.cartUpdatesHandler.handle(data)\n } else {\n this.productTarget.dataset.lineItemId = data.line_item.id\n this.quantityTotalTarget.value = data.line_item.quantity\n this.updateShoppingBagCounter(data)\n this.updateProductThumbnailControls(data)\n }\n })\n .catch(({ response }) => {\n let errorMessage = \"We couldn't add those products to your order. Please try again\"\n\n if(response.data.error) { errorMessage = response.data.error }\n\n this.quantityTarget.value = response.data.line_item.quantity\n this.updateShoppingBagCounter(data)\n this.updateProductThumbnailControls(data)\n show_flash_message(\"error\", errorMessage)\n window.scrollTo(0, 0)\n })\n .finally(() => {\n this.toggleLoading(false)\n this.enableVariantsDropdown()\n this.enableButtons()\n this.enableShoppingBagCounter()\n })\n }\n \n updateItem(lineItemId, quantity) {\n this.quantityTotalTarget.value = quantity - parseInt(this.quantityTotalTarget.value)\n\n if (this.isCartPage()) { this.toggleLoading(true) }\n \n this.orderAPI\n .updateCart(lineItemId, quantity)\n .then((data) => {\n if (this.isCartPage()) {\n this.cartUpdatesHandler.handle(data)\n } else {\n this.productTarget.dataset.lineItemId = data.line_item.id\n this.quantityTotalTarget.value = data.line_item.quantity\n this.updateShoppingBagCounter(data)\n this.updateProductThumbnailControls(data)\n }\n })\n .catch(({response}) => {\n let errorMessage = \"We couldn't remove those products to your order. Please try again\"\n\n if(response.data.error) { errorMessage = response.data.error }\n\n this.quantityTarget.value = response.data.line_item.quantity\n this.updateShoppingBagCounter(data)\n this.updateProductThumbnailControls(data)\n show_flash_message(\"error\", errorMessage)\n window.scrollTo(0, 0)\n })\n .finally(() => {\n this.toggleLoading(false)\n this.enableVariantsDropdown()\n this.enableButtons()\n this.enableShoppingBagCounter()\n })\n}\n\n updateProductThumbnailControls (data) {\n \n let productControlsWrappers = document.querySelectorAll(`[data-hook=\"product-controls-${data.product_id}\"]`)\n\n if (productControlsWrappers.length > 0) {\n productControlsWrappers.forEach(el => el.innerHTML = data.updated_product_controls)\n }\n }\n\n enableVariantsDropdown () {\n let form = this.formTarget\n let toggleDropdown = form.querySelector(\".dropdown-toggle\")\n if (toggleDropdown) { toggleDropdown.classList.remove(\"disabled\") }\n }\n\n disableButtons () {\n let buttons = $(\".product-in-cart\").find(\"button[type=submit]\")\n buttons.addClass('disabled')\n buttons.prop(\"disabled\", true)\n }\n\n disableVariantsDropdown () {\n let form = this.formTarget\n let toggleDropdown = form.querySelector(\".dropdown-toggle\")\n\n if (toggleDropdown) { toggleDropdown.classList.add(\"disabled\") }\n }\n\n enableShoppingBagCounter () {\n let cartIcon = document.querySelector(\".shopping-bag-wrapper\")\n cartIcon.classList.remove(\"disabled\")\n }\n\n enableButtons () {\n $(\".product-in-cart\").each(function(index, div) {\n if (parseInt(div.getAttribute('data-total-on-hand')) == parseInt(div.querySelector(\"input[type=text]\").value)) {\n let button = $(this).find(\"button[type=submit]:first\")\n button.removeClass('disabled')\n button.prop(\"disabled\", false)\n } else {\n let buttons = $(this).find(\"button[type=submit]\")\n buttons.removeClass('disabled')\n buttons.prop(\"disabled\", false)\n }\n })\n }\n\n disableShoppingBagCounter () {\n let cartIcon = document.querySelector(\".shopping-bag-wrapper\")\n cartIcon.classList.add(\"disabled\")\n }\n\n updateShoppingBagCounter (data) {\n let cartBag = document.querySelector(\".shopping-bag-item-count\")\n cartBag.innerText = data.order.item_count\n }\n\n isCartPage () {\n return window.location.pathname === \"/store/cart\"\n }\n}\n","import axios from \"axios\"\n\nexport function AddressAPI() {\n function isDeliveryAddressValid(address) {\n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n let instance = axios.create({ headers: { 'X-CSRF-Token': csrfToken } })\n\n return new Promise((resolve, reject) => {\n instance({\n method: \"post\",\n url: \"/deliverable_addresses\",\n data: addressAttributes(address)\n })\n .then(({ data }) => {\n if(!data.valid_delivery_address || data.in_exclusion_area) {\n reject(data)\n } else {\n resolve(data)\n }\n }).catch(() => { reject(false) })\n })\n }\n\n function saveAddress(address) {\n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n let data = addressAttributes(address)\n data[\"save_as_default\"] = true\n\n let instance = axios.create({ headers: { 'X-CSRF-Token': csrfToken } })\n instance({\n url: \"/shipping_addresses\",\n method: \"post\",\n data: data\n }).then(() => {\n Turbolinks.visit(location.toString())\n })\n }\n\n function addressAttributes(address) {\n return {\n \"shipping_address\": {\n \"firstname\": address.firstname,\n \"lastname\": address.lastname,\n \"address1\": address.address,\n \"city\": address.city,\n \"zipcode\": address.zipcode,\n \"phone\": address.phone,\n \"country_code\": address.country_code,\n \"longitude\": address.longitude,\n \"latitude\": address.latitude\n\n },\n \"state\": address.state\n }\n }\n\n function missingStreetNumberMessage() {\n $(\"[data-invalid-address-wrapper]\")\n .popover(\n {\n title: \"Missing Street Number\",\n content: \"Psst! We need your street number in order to validate your address. Please try again\",\n trigger: \"manual\",\n template: '

',\n }\n )\n }\n \n function showInvalidAddressMsg(exclusionArea, deliveryAddressTarget) {\n let invalidAddressTitle = \"🌿 Fast Nationwide Shipping Available! 🌿\"\n\n deliveryAddressTarget.classList.remove(\"validating\")\n $(\"[data-target='address-search.invalidAddress']\").popover(\"dispose\")\n\n if(exclusionArea) {\n invalidAddressTitle = \"This is an exclusion area\"\n\n $(\"[data-invalid-address-wrapper]\")\n .popover(\n { \n title: invalidAddressTitle,\n content: \"
We’re unable to deliver to your address because it appears to be a public park, public school, publicly owned or leased land.
\",\n trigger: \"manual\",\n template: '

'\n }\n )\n }\n\n $(\"[data-invalid-address-wrapper]\")\n .popover(\n { \n title: invalidAddressTitle,\n content: function() {\n var clone= $($(this).data('popover-content')).clone(true).removeClass('popover-hide')\n return clone;\n },\n trigger: \"manual\",\n template: '

'\n }\n )\n\n $(\"[data-target='address-search.invalidAddress']\").popover(\"show\")\n }\n\n function setCookies(address, zipcode, place, state, coordinates) {\n document.cookie = `zipcode=${zipcode};Path=/`\n document.cookie = `city=${place};Path=/`\n document.cookie = `state=${state};Path=/`\n document.cookie = `temp_delivery_address=${address};Path=/`\n document.cookie = \"isValid=true;Path=/\"\n document.cookie = `longitude=${coordinates[0]};Path=/`\n document.cookie = `latitude=${coordinates[1]};Path=/`\n }\n\n function expireCookies() {\n document.cookie = \"temp_delivery_address=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"isValid=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"city=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"zipcode=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"state=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"place=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"longitude=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n document.cookie = \"latitude=;expires=Thu, 01 Jan 1970 00:00:01 GMT\"\n }\n\n function saveInvalidShippingAddress(user_address, invalid_address) {\n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n\n let instance = axios.create({ headers: { 'X-CSRF-Token': csrfToken } })\n instance({\n url: \"/invalid_shipping_addresses\",\n method: \"post\",\n data: { user_address: user_address, invalid_address: invalid_address }\n })\n }\n\n function isCompleteAddress(address) {\n return address.street_number && address.zipcode && address.city\n }\n\n function isMissingStreetNumber(address) {\n return !address.street_number && address.address && address.city\n }\n\n return {\n expireCookies,\n isDeliveryAddressValid,\n saveAddress,\n setCookies,\n showInvalidAddressMsg,\n saveInvalidShippingAddress,\n isCompleteAddress,\n isMissingStreetNumber,\n missingStreetNumberMessage\n }\n}\n","import axios from \"axios\"\n\nexport function OrderAPI() {\n function updateCart(lineItemId, quantity) {\n \n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n let instance = axios.create({ headers: { Accept: 'application/json', 'X-CSRF-Token': csrfToken } })\n\n return new Promise((resolve, reject) => {\n instance({\n method: \"patch\",\n url: \"/store/cart\",\n params: { location: window.location.pathname },\n data: { \"order\": { \"line_items_attributes\": {\"0\": {\"quantity\": quantity, \"id\": lineItemId } } } }\n }).then(({ data }) => {\n resolve(data)\n }).catch((error) => {\n reject(error)\n })\n })\n }\n\n function createCart(cartForm) {\n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n let instance = axios.create({ headers: { Accept: 'application/json', 'X-CSRF-Token': csrfToken } })\n let data = new FormData(cartForm)\n return new Promise((resolve, reject) => {\n instance({\n method: \"post\",\n url: cartForm.action,\n params: { location: window.location.pathname },\n data: data\n }).then(({ data }) => {\n resolve(data)\n }).catch((error) => {\n reject(error)\n })\n })\n }\n\n function emptyOrder(orderNumber, orderGuestToken) {\n let instance = axios.create({ headers: { \"X-Spree-Order-Token\": orderGuestToken }})\n\n instance(\n {\n method: \"put\",\n url: `/store/api/orders/${orderNumber}/empty`\n }\n ).then(({ data }) => {\n Turbolinks.visit(location.toString())\n }).catch((error) => {\n })\n\n }\n\n function removeItem(lineItemId) {\n const csrfTokenTag = document.querySelector('meta[name=csrf-token]');\n const csrfToken = csrfTokenTag ? csrfTokenTag.content : '';\n let instance = axios.create({ headers: { Accept: 'application/json', 'X-CSRF-Token': csrfToken,}})\n\n return new Promise((resolve, reject) => {\n instance({\n method: \"patch\",\n url: \"/store/cart\",\n params: { location: window.location.pathname },\n data: { \"order\": { \"line_items_attributes\": {\"0\": {\"quantity\": 0, \"id\": lineItemId } } } }\n }).then(({ data }) => {\n resolve(data)\n }).catch((error) => {\n reject(error)\n })\n })\n }\n\n function updateOrder(orderId, orderGuestToken, data) {\n let instance = axios.create({ headers: { \"X-Spree-Order-Token\": orderGuestToken }})\n\n instance(\n {\n method: \"patch\",\n url: `/store/api/orders/${orderId}`,\n data: data\n }\n ).then(({ data }) => {\n if(window.location.pathname == \"/store/cart\") {\n Turbolinks.visit(location.toString())\n return;\n }\n let cartBag = document.querySelector(\".shopping-bag-item-count\")\n cartBag.innerText = data.total_quantity\n }).catch((error) => { })\n }\n\n return {\n updateCart,\n emptyOrder,\n createCart,\n removeItem\n }\n}\n","export function CartUpdatesHandler() {\n function handle(data) {\n updateLineItems(data)\n updateOrderSummary(data)\n updateProductThumbnailControls(data)\n updateShoppingBagCounter(data)\n hideLoadingBar()\n notifyQuantityChange();\n }\n\n function notifyQuantityChange () {\n window.dispatchEvent(new CustomEvent(\"update-quantity\"));\n }\n\n function updateShoppingBagCounter (data) {\n let cartBag = document.querySelector(\".shopping-bag-item-count\")\n cartBag.innerText = data.order.item_count\n }\n\n function updateProductThumbnailControls (data) {\n let productControlsWrappers = document.querySelectorAll(`[data-hook=\"product-controls-${data.product_id}\"]`)\n\n if (productControlsWrappers.length > 0 && data.updated_product_controls) {\n productControlsWrappers.forEach(el => el.innerHTML = data.updated_product_controls)\n }\n }\n\n function updateOrderSummary (data) {\n let orderSummary = document.querySelector(\"[data-hook='order-summary']\")\n orderSummary.innerHTML = data.order_summary\n }\n\n function updateLineItems (data) {\n let lineItemsContent = document.querySelector(\"[data-line-items-list]\")\n lineItemsContent.innerHTML = data.line_items_content\n }\n\n function hideLoadingBar () {\n let progress = document.querySelector(\"#progress\")\n progress.classList.remove(\"loading\")\n }\n\n return {\n handle,\n }\n}\n","export function DeliveryAddress() {\n function showPopover() {\n let searchInput = document.querySelector(\".pac-target-input\")\n let deliveryAddress = document.cookie.match(new RegExp('(^| )temp_delivery_address=([^;]+)'))\n\n if(!deliveryAddress && searchInput.dataset.address == 'Find your address') {\n $('#deliver-to-wrapper').popover('show');\n searchInput.focus();\n }\n }\n\n return {\n showPopover,\n }\n}","export function PopoverHandler() {\n function showPopover(popover) {\n $(popover).popover(\"show\")\n\n setTimeout(() => {\n $(popover).popover(\"hide\")\n }, 2000)\n }\n\n return {\n showPopover,\n }\n}"],"sourceRoot":""}