{"version":3,"file":"ventilation-calculator-3bf92875.js","sources":["../../../../src/scripts/modules/ventilation-calculator.ts"],"sourcesContent":["import { Component } from '@verndale/core';\n\nimport {\n getAddressFromGeolocation,\n updateGeolocationDataProperties\n} from '../helpers/geolocation';\nimport { GeolocationType, getUserProfile } from '../helpers/global-storage';\nimport { ExtendedWindowType } from '../helpers/global-types';\nimport { personalizeAddressData } from '../helpers/personalize';\n\nclass VentilationCalculator extends Component {\n private validated: boolean;\n private validatedAddress: string;\n private locationData: GeolocationType | null;\n private updated: boolean;\n private interval: NodeJS.Timer | null = null;\n\n constructor(el: HTMLElement) {\n super(el);\n this.validated = false;\n this.validatedAddress = '';\n this.locationData = null;\n this.updated = false;\n\n this.initAutocomplete();\n }\n\n setupDefaults() {\n this.dom = {\n addressField: this.el.querySelector<HTMLInputElement>(\n '.ventilation-calculator__address'\n ),\n addressInput: this.el.querySelector<HTMLInputElement>(\n '.ventilation-calculator__address .field__input'\n ),\n form: this.el.querySelector<HTMLFormElement>(\n '.ventilation-calculator__form'\n ),\n button: this.el.querySelectorAll<HTMLButtonElement>('.btn[data-layer]')\n };\n }\n\n addListeners() {\n (this.dom.addressInput as HTMLInputElement)?.addEventListener(\n 'input',\n this.handleAddressInput.bind(this)\n );\n\n (this.dom.form as HTMLFormElement)?.addEventListener(\n 'submit',\n this.handleFormSubmit.bind(this)\n );\n }\n\n fillInAddress(autocomplete: google.maps.places.Autocomplete) {\n (window as ExtendedWindowType).dataLayer.push({\n event: 'typeahead',\n event_category: 'typeahead',\n event_action: 'click',\n event_label: 'address'\n });\n\n this.updated = true;\n const place = autocomplete.getPlace();\n\n //get the zip from the address\n const zip = place.address_components?.find(component => {\n return component.types.includes('postal_code');\n })?.long_name;\n\n //get the country from the address\n const country = place.address_components?.find(component => {\n return component.types.includes('country');\n })?.short_name;\n\n //get latitude and longitude from the address\n\n const latitude = place.geometry?.location?.lat();\n const longitude = place.geometry?.location?.lng();\n\n //get remaining info for sitecore personalize\n const streetNumber = place.address_components?.find(item =>\n item.types.includes('street_number')\n );\n const street = place.address_components?.find(item =>\n item.types.includes('route')\n );\n const state = place.address_components?.find(item =>\n item.types.includes('administrative_area_level_1')\n );\n const city = place.address_components?.find(item =>\n item.types.includes('locality')\n );\n const fullStreet = `${streetNumber?.long_name} ${street?.long_name}`;\n\n const sitecorePersonalizeAddress = {\n Street: fullStreet.trim(),\n City: city?.long_name,\n State: state?.short_name,\n Country: country,\n PostalCode: zip,\n Email: getUserProfile()?.email,\n PartitionKey: new Date().getFullYear().toString(),\n RowKey: new Date().getTime().toString()\n };\n\n const { Street, City, State, Country, PostalCode } =\n sitecorePersonalizeAddress;\n\n if (streetNumber && Street && City && State && Country && PostalCode) {\n personalizeAddressData(sitecorePersonalizeAddress);\n }\n\n if (place?.geometry) {\n const inputValue = (this.dom.addressInput as HTMLInputElement).value;\n\n this.validatedAddress = inputValue;\n (this.dom.addressField as HTMLDivElement).classList.remove(\n 'field--error'\n );\n this.validated = true;\n\n this.locationData = {\n zip: zip as string,\n country: country as string,\n latitude,\n longitude,\n address: inputValue\n };\n } else {\n this.validated = false;\n }\n }\n\n initAutocomplete() {\n const address = getAddressFromGeolocation();\n\n if (address) {\n (this.dom.addressInput as HTMLInputElement).value = address;\n }\n\n const addressField = this.dom.addressInput as HTMLInputElement;\n\n const autocomplete = new window.google.maps.places.Autocomplete(\n addressField,\n {\n componentRestrictions: { country: ['us', 'ca'] },\n fields: ['formatted_address', 'address_components', 'geometry'],\n types: ['postal_code', 'route']\n }\n );\n\n autocomplete.addListener(\n 'place_changed',\n this.fillInAddress.bind(this, autocomplete)\n );\n }\n\n handleAddressInput(e: Event) {\n const input = e.target as HTMLInputElement;\n this.interval = setInterval(() => {\n if (\n (document.querySelector('.pac-container') as HTMLElement)?.style\n .display !== 'none'\n ) {\n clearInterval(this.interval as NodeJS.Timer);\n const dataLayer = (window as ExtendedWindowType).dataLayer || [];\n if (dataLayer[dataLayer.length - 1]?.event_action !== 'viewed') {\n (window as ExtendedWindowType).dataLayer.push({\n event: 'typeahead',\n event_category: 'typeahead',\n event_action: 'viewed',\n event_label: 'address'\n });\n }\n }\n }, 500);\n\n if (\n (this.validated && input.value !== this.validatedAddress) ||\n (input.value.length > 0 && input.value !== this.validatedAddress)\n ) {\n (this.dom.addressField as HTMLDivElement).classList.add('field--error');\n this.validated = false;\n } else {\n (this.dom.addressField as HTMLDivElement).classList.remove(\n 'field--error'\n );\n }\n }\n\n handleFormSubmit() {\n const formData = new FormData(this.dom.form as HTMLFormElement);\n (this.dom.button as NodeListOf<HTMLButtonElement>)?.forEach(button => {\n const dataLayer = button.dataset.layer;\n button.dataset.layer = dataLayer?.replace(\n '{result}',\n `\"${formData.get('atticLength')}x${formData.get('atticWidth')}\"`\n );\n });\n\n (window as ExtendedWindowType).dataLayer.push({\n event: 'calculator_results_viewed',\n event_category: 'calculators',\n event_action: 'results viewed',\n event_label: '',\n event_attributes: {\n calculator_name: 'ventilation-calculator',\n calculator_result: ''\n }\n });\n if (this.validated) {\n if (this.updated)\n updateGeolocationDataProperties(this.locationData as GeolocationType);\n }\n }\n}\n\nexport default VentilationCalculator;\n"],"names":["VentilationCalculator","Component","el","__publicField","_a","_b","autocomplete","place","zip","component","country","_d","_c","latitude","_f","_e","longitude","_h","_g","streetNumber","_i","item","street","_j","state","_k","city","_l","sitecorePersonalizeAddress","_m","getUserProfile","Street","City","State","Country","PostalCode","personalizeAddressData","inputValue","address","getAddressFromGeolocation","addressField","e","input","dataLayer","formData","button","updateGeolocationDataProperties"],"mappings":"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"}