{"version":3,"file":"index-03891ede.js","sources":["../../../../src/scripts/react-components/quiz-form/quiz-progress.tsx","../../../../src/scripts/react-components/quiz-form/address-field.tsx","../../../../src/scripts/react-components/quiz-form/numeric-field.tsx","../../../../src/scripts/react-components/quiz-form/radio-field.tsx","../../../../src/scripts/react-components/quiz-form/area-field.tsx","../../../../src/scripts/react-components/quiz-form/before-results-question.tsx","../../../../src/scripts/react-components/quiz-form/consent.tsx","../../../../src/scripts/react-components/quiz-form/quiz-form.tsx","../../../../src/scripts/react-components/quiz-form/index.tsx"],"sourcesContent":["import React from 'react';\n\ntype QuizProgressProps = {\n currentQuestion: number;\n progressLabel: string;\n numberOfQuestions: number;\n};\n\nconst QUIZ_PROGRESS_PLACEHOLDERS = Object.freeze({\n current: '{{current}}',\n total: '{{total}}'\n});\n\nconst QuizProgress = ({\n currentQuestion,\n progressLabel,\n numberOfQuestions\n}: QuizProgressProps) => {\n return (\n <div className=\"quiz-progress\">\n <p className=\"quiz-progress__label\">\n {progressLabel\n .replace(\n QUIZ_PROGRESS_PLACEHOLDERS.current,\n currentQuestion.toString()\n )\n .replace(\n QUIZ_PROGRESS_PLACEHOLDERS.total,\n numberOfQuestions.toString()\n )}\n </p>\n <div className=\"quiz-progress__bar\">\n <div\n className=\"quiz-progress__bar-inner\"\n style={{\n inlineSize: `${(currentQuestion / numberOfQuestions) * 100}%`\n }}\n ></div>\n </div>\n </div>\n );\n};\n\nexport default QuizProgress;\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport {\n getLocationDataFromAddress,\n updateGeolocationDataProperties\n} from '../../helpers/geolocation';\nimport { COST_ESTIMATE_FIELD_NAMES } from '../quiz-results/helpers';\nimport { GeolocationType } from '../../helpers/global-storage';\nimport { ExtendedWindowType } from '../../helpers/global-types';\n\ntype AdressFieldProps = {\n fieldName: string;\n fieldLabel?: string;\n fieldTooltip?: string;\n fieldPlaceholder?: string;\n errorMessage?: string;\n defaultValue?: string;\n returnStep: () => void;\n setDisabled: (disabled: boolean) => void;\n setLocationData?: (data: GeolocationType) => void;\n handleFormDataLayer: (e: React.ChangeEvent<HTMLInputElement> | Event) => void;\n};\n\nconst AddressField = ({\n fieldLabel,\n fieldTooltip,\n fieldPlaceholder,\n errorMessage,\n fieldName,\n defaultValue,\n setDisabled,\n setLocationData,\n returnStep,\n handleFormDataLayer\n}: AdressFieldProps) => {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const inputContainerRef = useRef<HTMLDivElement>(null);\n const [validated, setValidated] = useState(false);\n const [validatedAddress, setValidatedAddress] = useState('');\n const [loading, setLoading] = useState(false);\n const interval = useRef<NodeJS.Timer>();\n const zipInputRef = useRef<HTMLInputElement>(null);\n const zipCountryCodeRef = useRef<HTMLInputElement>(null);\n const cityRef = useRef<HTMLInputElement>(null);\n const stateRef = useRef<HTMLInputElement>(null);\n const streetRef = useRef<HTMLInputElement>(null);\n const secondStreetRef = useRef<HTMLInputElement>(null);\n\n const fillInAddress = (autocomplete: google.maps.places.Autocomplete) => {\n const place = autocomplete.getPlace();\n\n if (place?.geometry) {\n const inputValue = (inputRef.current as HTMLInputElement).value;\n\n setValidated(true);\n setDisabled(false);\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 const state = place.address_components?.find(component => {\n return component.types.includes('administrative_area_level_1');\n })?.short_name;\n\n const city = place.address_components?.find(component => {\n return component.types.includes('locality');\n })?.long_name;\n\n const street = place.address_components?.find(component => {\n return component.types.includes('route');\n })?.long_name;\n\n const secondStreet = place.address_components?.find(component => {\n return component.types.includes('subpremise');\n })?.long_name;\n\n const streetNumber = place.address_components?.find(component => {\n return component.types.includes('street_number');\n })?.long_name;\n\n (zipInputRef.current as HTMLInputElement).value = zip ? zip : '';\n (zipCountryCodeRef.current as HTMLInputElement).value = country\n ? country\n : '';\n (cityRef.current as HTMLInputElement).value = city ? city : '';\n (stateRef.current as HTMLInputElement).value = state ? state : '';\n (streetRef.current as HTMLInputElement).value = `${\n streetNumber ? `${streetNumber} ` : ''\n }${street ? `${street}` : ''}`;\n (secondStreetRef.current as HTMLInputElement).value = secondStreet\n ? secondStreet\n : '';\n\n //make sure to validate the same fields in for init autocomplete\n if (\n zip &&\n latitude &&\n longitude &&\n street &&\n streetNumber &&\n (country || city || state || secondStreet)\n ) {\n setValidatedAddress(inputValue);\n\n (inputContainerRef.current as HTMLDivElement).classList.remove(\n 'field--error'\n );\n } else {\n setDisabled(true);\n }\n\n if (setLocationData && typeof setLocationData === 'function') {\n setLocationData({\n address: inputValue,\n zip: zip as string,\n country: country as string,\n latitude: latitude as number,\n longitude: longitude as number,\n state: state as string,\n city: city as string,\n street: street as string,\n secondStreet: secondStreet as string\n });\n }\n\n (window as ExtendedWindowType).dataLayer.push({\n event: 'typeahead',\n event_category: 'typeahead',\n event_action: 'click',\n event_label: 'address'\n });\n } else {\n setValidated(false);\n setDisabled(true);\n }\n };\n\n const initAutoComplete = async () => {\n const autocomplete = new window.google.maps.places.Autocomplete(\n inputRef.current as HTMLInputElement,\n {\n componentRestrictions: { country: ['us'] },\n fields: ['formatted_address', 'address_components', 'geometry'],\n types: ['postal_code', 'route', 'locality']\n }\n );\n\n autocomplete.addListener('place_changed', () =>\n fillInAddress(autocomplete)\n );\n\n if (defaultValue) {\n const {\n zip,\n country,\n latitude,\n longitude,\n city,\n state,\n street,\n streetNumber,\n secondStreet\n } = await getLocationDataFromAddress(defaultValue);\n\n if (\n zip &&\n latitude &&\n longitude &&\n street &&\n streetNumber &&\n (country || city || state || secondStreet)\n ) {\n (zipInputRef.current as HTMLInputElement).value = zip ? zip : '';\n (zipCountryCodeRef.current as HTMLInputElement).value = country\n ? country\n : '';\n (cityRef.current as HTMLInputElement).value = city ? city : '';\n (stateRef.current as HTMLInputElement).value = state ? state : '';\n (streetRef.current as HTMLInputElement).value = `${\n streetNumber ? `${streetNumber} ` : ''\n }${street ? `${street}` : ''}`;\n (secondStreetRef.current as HTMLInputElement).value = secondStreet\n ? secondStreet\n : '';\n\n updateGeolocationDataProperties({\n address: defaultValue,\n zip,\n country,\n latitude,\n longitude\n });\n\n if (setLocationData && typeof setLocationData === 'function') {\n setLocationData({\n address: defaultValue,\n zip: zip as string,\n country: country as string,\n latitude: latitude as number,\n longitude: longitude as number,\n state: state as string,\n city: city as string,\n street: street as string,\n secondStreet: secondStreet as string\n });\n }\n } else {\n returnStep();\n (inputContainerRef.current as HTMLDivElement).classList.add(\n 'field--error'\n );\n setValidated(false);\n setDisabled(true);\n }\n } else {\n returnStep();\n (inputContainerRef.current as HTMLDivElement).classList.add(\n 'field--error'\n );\n setValidated(false);\n setDisabled(true);\n }\n };\n\n const handleAddressInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n const input = e.target as HTMLInputElement;\n interval.current = setInterval(() => {\n if (\n (document.querySelector('.pac-container') as HTMLElement)?.style\n .display !== 'none'\n ) {\n if (interval.current) {\n clearInterval(interval.current as NodeJS.Timer);\n }\n setLoading(false);\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 if (\n (validated && input.value !== validatedAddress) ||\n (input.value.length > 0 && input.value !== validatedAddress)\n ) {\n (inputContainerRef.current as HTMLDivElement).classList.add(\n 'field--error'\n );\n setValidated(false);\n setDisabled(true);\n } else if (input.value.length === 0) {\n (inputContainerRef.current as HTMLDivElement).classList.remove(\n 'field--error'\n );\n setValidated(false);\n setDisabled(true);\n } else {\n (inputContainerRef.current as HTMLDivElement).classList.remove(\n 'field--error'\n );\n\n if (validated) {\n setDisabled(false);\n }\n }\n };\n\n useEffect(() => {\n const input = inputRef.current as HTMLInputElement;\n const inputContainer = inputContainerRef.current as HTMLDivElement;\n if (input && inputContainer) {\n initAutoComplete();\n\n if (input.value.length === 0) {\n inputContainer.classList.remove('field--error');\n }\n }\n }, [inputRef]);\n\n return (\n <div\n ref={inputContainerRef}\n data-module=\"input\"\n className={`field quiz-form__field ${\n fieldTooltip ? 'field--tooltip' : ''\n }`}\n >\n <label className=\"field__label\" htmlFor={`address-field-${id}`}>\n {fieldLabel}\n {fieldTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">{fieldTooltip}</div>\n </button>\n )}\n </label>\n <div className=\"field__input-wrapper\">\n <input\n ref={inputRef}\n className=\"field__input\"\n id={`address-field-${id}`}\n name={fieldName}\n placeholder={fieldPlaceholder}\n required={true}\n defaultValue={defaultValue}\n onInput={handleAddressInput}\n onChange={e => {\n (document.querySelector('.pac-container') as HTMLElement)?.style\n .display === 'none'\n ? setLoading(true)\n : setLoading(false);\n handleFormDataLayer(e);\n }}\n />\n {loading && <span rel=\"presentation\" className=\"field__loading\"></span>}\n </div>\n\n <input\n type=\"hidden\"\n ref={zipInputRef}\n name={COST_ESTIMATE_FIELD_NAMES.zip}\n />\n <input\n type=\"hidden\"\n ref={zipCountryCodeRef}\n name={COST_ESTIMATE_FIELD_NAMES.country}\n />\n <input\n type=\"hidden\"\n ref={stateRef}\n name={COST_ESTIMATE_FIELD_NAMES.state}\n />\n <input\n type=\"hidden\"\n ref={cityRef}\n name={COST_ESTIMATE_FIELD_NAMES.city}\n />\n <input\n type=\"hidden\"\n ref={streetRef}\n name={COST_ESTIMATE_FIELD_NAMES.street}\n />\n\n <input\n type=\"hidden\"\n ref={secondStreetRef}\n name={COST_ESTIMATE_FIELD_NAMES.secondStreet}\n />\n <span className=\"field__error-msg\">{errorMessage}</span>\n </div>\n );\n};\n\nexport default AddressField;\n","import React, { useId, useRef } from 'react';\n\nexport type NumericFieldProps = {\n fieldName: string;\n fieldLabel?: string;\n fieldTooltip?: string;\n fieldPlaceholder?: string;\n unitsLabel?: string;\n errorMessage?: string;\n setDisabled: (disabled: boolean) => void;\n};\n\nconst NumericField = ({\n fieldName,\n fieldLabel,\n fieldTooltip,\n fieldPlaceholder,\n unitsLabel,\n errorMessage,\n setDisabled\n}: NumericFieldProps) => {\n const id = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const inputContainerRef = useRef<HTMLDivElement>(null);\n\n const handleAddressInput = () => {\n const inputValue = (inputRef.current as HTMLInputElement).value.trim();\n //remove , and accept only integers\n const inputValueWithoutComma = inputValue.replace(/,/g, '');\n const inputValueWithoutDot = inputValueWithoutComma.replace(/\\./g, '');\n\n //remove any non-numeric character from inputValueWithoutDot\n const validatedInput = inputValueWithoutDot.replace(/\\D/g, '');\n\n (inputRef.current as HTMLInputElement).value = validatedInput;\n\n if (validatedInput.length > 0) {\n (inputRef.current as HTMLInputElement)\n ?.closest('.field')\n ?.classList.add('quiz-form__field--filled');\n } else {\n (inputRef.current as HTMLInputElement)\n ?.closest('.field')\n ?.classList.remove('quiz-form__field--filled');\n }\n\n const inputNumber = Number(validatedInput);\n\n if (inputValueWithoutDot && inputNumber > 0 && inputNumber < 1000000) {\n (inputContainerRef.current as HTMLDivElement).classList.remove(\n 'field--error'\n );\n setDisabled(false);\n } else {\n (inputContainerRef.current as HTMLDivElement).classList.add(\n 'field--error'\n );\n setDisabled(true);\n }\n };\n\n return (\n <div\n ref={inputContainerRef}\n data-module=\"input\"\n className={`field ${\n fieldTooltip ? 'field--tooltip' : ''\n } quiz-form__field`}\n >\n <label className=\"field__label\" htmlFor={`numeric-field-${id}`}>\n {fieldLabel}\n {fieldTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">{fieldTooltip}</div>\n </button>\n )}\n </label>\n <div className=\"quiz-form__field-wrapper\">\n <input\n ref={inputRef}\n className=\"field__input\"\n id={`numeric-field-${id}`}\n name={fieldName}\n placeholder={fieldPlaceholder}\n required={true}\n onInput={handleAddressInput}\n />\n <span className=\"quiz-form__units\">{unitsLabel}</span>\n </div>\n <span className=\"field__error-msg\">{errorMessage}</span>\n </div>\n );\n};\n\nexport default NumericField;\n","import React, { useEffect, useId, useState } from 'react';\n\ntype RadioFieldProps = {\n fieldName: string;\n values?: {\n label: string;\n value: string | number;\n image?: string;\n imageAlt?: string;\n isImage?: boolean;\n }[];\n setDisabled: (disabled: boolean) => void;\n};\n\nexport const RadioField = ({\n fieldName,\n values,\n setDisabled\n}: RadioFieldProps) => {\n const id = useId();\n const [selectedValue, setSelectedValue] = useState('');\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n const handleInputChage = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSelectedValue(event.target.value);\n setDisabled(false);\n };\n\n useEffect(() => {\n if (containerRef.current && values) {\n containerRef.current.style.setProperty(\n '--columns',\n `${values.length > 4 ? 4 : values.length}`\n );\n }\n }, [values]);\n\n return (\n <div className=\"radio-field\" ref={containerRef}>\n {values?.map((value, index) => (\n <div\n key={index}\n className={`radio-field__card ${\n selectedValue === value.value.toString()\n ? 'radio-field__card--active'\n : ''\n }`}\n >\n {value.image && (\n <picture\n className={`radio-field__picture ${\n value.isImage ? 'radio-field__picture--image' : ''\n }`}\n >\n <img src={value.image} alt={value.imageAlt} width=\"80\" height=\"80\"/>\n </picture>\n )}\n <label className=\"radio-field__label\" htmlFor={`${id}-${index}`}>\n {value.label}\n </label>\n <input\n className=\"field__radio-input radio-field__input\"\n type=\"radio\"\n name={fieldName}\n id={`${id}-${index}`}\n value={value.value}\n required={true}\n onChange={handleInputChage}\n />\n </div>\n ))}\n </div>\n );\n};\n\nexport default RadioField;\n","import React, { useId, useState } from 'react';\n\ntype AreaFieldProps = {\n fieldName: string;\n fieldLabel?: string;\n fieldPlaceholder?: string;\n errorMessage?: string;\n defaultValue?: string;\n especialCharacters?: string;\n setDisabled: (disabled: boolean) => void;\n showSkip: (disabled: boolean) => void;\n};\n\nexport const AreaField = ({\n fieldLabel,\n fieldPlaceholder,\n errorMessage,\n fieldName,\n defaultValue,\n setDisabled,\n showSkip,\n especialCharacters\n}: AreaFieldProps) => {\n const id = useId();\n const [showError, setShowError] = useState(false);\n const [matchingCharacters, setMatchingCharacters] = useState<string[]>([]);\n\n const handleInputChage = (event: React.ChangeEvent<HTMLTextAreaElement>) => {\n const input = event.target;\n\n setShowError(false);\n\n if (input.value.length > 3) {\n showSkip(false);\n\n const regexPattern = `[${(especialCharacters as string).replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}]`;\n const regex = new RegExp(regexPattern, 'g');\n\n const inputMatchingCharacters = input.value.match(regex) || [];\n\n setMatchingCharacters(inputMatchingCharacters);\n\n if (inputMatchingCharacters.length > 0 || input.value.length > 250) {\n setDisabled(true);\n setShowError(true);\n } else {\n setDisabled(false);\n }\n } else {\n showSkip(true);\n }\n };\n\n return (\n <div className=\"area-field\">\n <label className=\"sr-only\" htmlFor={id}>\n {fieldLabel}\n </label>\n <textarea\n name={fieldName}\n id={id}\n defaultValue={defaultValue}\n placeholder={fieldPlaceholder}\n onInput={handleInputChage}\n ></textarea>\n <span\n className=\"field__error-msg\"\n style={{ display: `${showError ? 'block' : 'none'}` }}\n >\n {errorMessage} {matchingCharacters.join(', ')}\n </span>\n </div>\n );\n};\n\nexport default AreaField;\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport {\n USER_PROFILE_KEYS,\n getUserProfile\n} from '../../helpers/global-storage';\nimport { formatPhoneNumberAndValidate } from '../../helpers/transform';\nimport {\n buildContext,\n ContextPayload,\n loadAdvancedSearchQueryActions,\n Result,\n ResultList,\n ResultListState,\n SearchEngine\n} from '@coveo/headless';\nimport { getLatLongFromZip } from '../../helpers/geolocation';\nimport { ExtendedWindowType } from '../../helpers/global-types';\n\nexport type BeforeResultsQuestionProps = {\n title: string;\n titleTooltip?: string;\n nameLabel: string;\n nameTooltip?: string;\n namePlaceholder?: string;\n nameErrorMessage: string;\n lastNameLabel: string;\n lastNameTooltip?: string;\n lastNamePlaceholder?: string;\n lastNameErrorMessage: string;\n phoneLabel?: string;\n phoneTooltip?: string;\n phonePlaceholder?: string;\n phoneErrorMessage?: string;\n emailLabel: string;\n emailTooltip?: string;\n emailPlaceholder?: string;\n emailErrorMessage: string;\n termsLabel: string;\n termsContent: string;\n engine?: SearchEngine;\n controller?: ResultList;\n zipCode?: string;\n countryCode?: string;\n fieldsObject?: {\n image: string;\n imageAlt: string;\n contractorId: string;\n contractorType: string;\n contractorDBA: string;\n contractorName: string;\n rating: string;\n range: string;\n reviews: string;\n city: string;\n state: string;\n certifications: string;\n phone: string;\n link: string;\n type: string;\n latitudeField: string;\n longitudeField: string;\n distance: string;\n distanceInMiles: string;\n zipCode: string;\n };\n coveoContext?: string;\n defaultQuery?: string;\n isReady?: boolean;\n setResults?: (results: Result[]) => void;\n setNextButtonDisabled?: (disabled: boolean) => void;\n};\n\nconst BeforeResultsQuestion = ({\n nameLabel,\n nameTooltip,\n namePlaceholder,\n nameErrorMessage,\n lastNameLabel,\n lastNameTooltip,\n lastNamePlaceholder,\n lastNameErrorMessage,\n phoneLabel,\n phoneTooltip,\n phonePlaceholder,\n phoneErrorMessage,\n emailLabel,\n emailTooltip,\n emailPlaceholder,\n emailErrorMessage,\n termsLabel,\n termsContent,\n engine,\n controller,\n zipCode,\n countryCode,\n fieldsObject,\n coveoContext,\n defaultQuery,\n isReady = false,\n setResults,\n setNextButtonDisabled\n}: BeforeResultsQuestionProps) => {\n const id = useId();\n const nameRef = useRef<HTMLInputElement>(null);\n const lastNameRef = useRef<HTMLInputElement>(null);\n const emailRef = useRef<HTMLInputElement>(null);\n const phoneRef = useRef<HTMLInputElement>(null);\n const termsRef = useRef<HTMLInputElement>(null);\n\n const hasCoveoContractor =\n coveoContext && defaultQuery && engine && controller && fieldsObject;\n\n const [state, setState] = hasCoveoContractor\n ? useState(controller.state)\n : useState({});\n\n const userData = getUserProfile();\n\n const validateField = (input: HTMLInputElement) => {\n const parent = input.closest('.field');\n\n if (input.type === 'tel') {\n const isValid = formatPhoneNumberAndValidate(input);\n if (isValid) {\n parent?.classList.remove('field--error');\n return true;\n } else {\n parent?.classList.add('field--error');\n return false;\n }\n } else {\n if (input.checkValidity()) {\n parent?.classList.remove('field--error');\n return true;\n } else {\n const parent = input.closest('.field');\n parent?.classList.add('field--error');\n return false;\n }\n }\n };\n\n const validateFields = () => {\n const phone = phoneRef.current as HTMLInputElement;\n\n let missingFields = phone ? 4 : 3;\n\n if (validateField(nameRef.current as HTMLInputElement)) missingFields--;\n\n if (validateField(lastNameRef.current as HTMLInputElement)) missingFields--;\n\n if (validateField(emailRef.current as HTMLInputElement)) missingFields--;\n\n if (phone && validateField(phoneRef.current as HTMLInputElement))\n missingFields--;\n\n if (missingFields === 0 && termsRef.current?.checked) {\n setNextButtonDisabled?.(false);\n } else {\n setNextButtonDisabled?.(true);\n }\n };\n\n const handleInputChage = (e: React.ChangeEvent<HTMLInputElement>) => {\n const target = e.target as HTMLInputElement;\n const parent = target.closest('.field');\n parent?.classList.add('field--touched');\n\n validateFields();\n };\n\n const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n // Only allow numbers on phone input\n if (e.currentTarget.type !== 'tel') return;\n if (e.key === 'Backspace' || e.key === 'Enter' || e.key === 'Tab') return;\n const isNumeric = /^[0-9]+$/.test(e.key);\n if (!isNumeric) {\n e.preventDefault();\n }\n };\n\n const renderInput = (\n ref: React.RefObject<HTMLInputElement>,\n index: number,\n label: string,\n errorMessage: string,\n name: string,\n placeholder?: string,\n tooltip?: string,\n type?: string,\n defaultValue?: string\n ) => {\n let pattern;\n\n if (type === 'email') pattern = '[^@\\\\s]+@[^@\\\\s]+\\\\.[^@\\\\s]+';\n if (type === 'text')\n pattern = '^[a-zA-ZÀ-ÖØ-öø-ÿ]+(?: [a-zA-ZÀ-ÖØ-öø-ÿ]+)?$';\n if (type === 'tel') pattern = '[0-9]*';\n\n return (\n <div\n data-module=\"input\"\n className={`field field--required ${tooltip ? 'field--tooltip' : ''}`}\n >\n <label className=\"field__label \" htmlFor={`${index}${id}`}>\n {label}\n {tooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">{tooltip}</div>\n </button>\n )}\n </label>\n <input\n ref={ref}\n className=\"field__input\"\n id={`${index}${id}`}\n name={name}\n placeholder={placeholder}\n required={true}\n type={type}\n onInput={handleInputChage}\n onKeyDown={handleKeyPress}\n defaultValue={defaultValue}\n pattern={pattern}\n />\n <span className=\"field__error-msg\">{errorMessage}</span>\n </div>\n );\n };\n\n const executeAdvancedSearch = () => {\n if (hasCoveoContractor) {\n const context = buildContext(engine);\n context?.set(JSON.parse(coveoContext) as ContextPayload);\n if (defaultQuery) {\n const advancedQuerySearchActionCreator =\n loadAdvancedSearchQueryActions(engine);\n\n engine?.dispatch(\n advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n aq: defaultQuery\n })\n );\n }\n\n engine.executeFirstSearch();\n }\n };\n\n const initDistanceCalculator = async () => {\n if (hasCoveoContractor) {\n let lat: number | undefined;\n let lng: number | undefined;\n\n const zip = zipCode;\n const country = countryCode;\n\n if (zip && country) {\n const response = await getLatLongFromZip(zip, country);\n lat = response?.latitude;\n lng = response?.longitude;\n }\n\n if (lat !== undefined && lng !== undefined) {\n const global = window as ExtendedWindowType;\n\n global.preProcessRequest = (body: string) => {\n const newBody = JSON.parse(body.toString());\n newBody.queryFunctions = [\n {\n fieldName: `@${fieldsObject.distanceInMiles}`,\n function: `dist(@${fieldsObject.latitudeField}, @${fieldsObject.longitudeField}, ${lat}, ${lng})*0.000621371`\n }\n ];\n return JSON.stringify(newBody);\n };\n }\n\n executeAdvancedSearch();\n }\n };\n\n useEffect(() => {\n if (hasCoveoContractor) {\n if (isReady) {\n controller.subscribe(() => setState(controller.state));\n initDistanceCalculator();\n }\n }\n }, [isReady]);\n\n useEffect(() => {\n if (hasCoveoContractor) {\n const resultListState = state as ResultListState;\n\n if (resultListState.firstSearchExecuted) {\n let selectedResults: Result[] = [];\n\n if (resultListState.results?.length > 0) {\n const temp = [...resultListState.results];\n const randomResults = temp.sort(() => 0.5 - Math.random());\n\n selectedResults = randomResults.slice(0, 3);\n }\n\n setResults?.(selectedResults);\n }\n }\n }, [state]);\n\n return (\n <div className=\"before-results-question\">\n <div className=\"before-results-question__wrapper\">\n <div className=\"before-results-question__row\">\n {renderInput(\n nameRef,\n 1,\n nameLabel,\n nameErrorMessage,\n USER_PROFILE_KEYS.userName,\n namePlaceholder,\n nameTooltip,\n 'text',\n userData?.[USER_PROFILE_KEYS.userName]\n )}\n {renderInput(\n lastNameRef,\n 2,\n lastNameLabel,\n lastNameErrorMessage,\n USER_PROFILE_KEYS.userLastName,\n lastNamePlaceholder,\n lastNameTooltip,\n 'text',\n userData?.[USER_PROFILE_KEYS.userLastName]\n )}\n </div>\n <div className=\"before-results-question__row\">\n {renderInput(\n emailRef,\n 3,\n emailLabel,\n emailErrorMessage,\n USER_PROFILE_KEYS.userEmail,\n emailPlaceholder,\n emailTooltip,\n 'email',\n userData?.[USER_PROFILE_KEYS.userEmail]\n )}\n {phoneLabel &&\n renderInput(\n phoneRef,\n 4,\n phoneLabel,\n phoneErrorMessage || '',\n USER_PROFILE_KEYS.userPhone,\n phonePlaceholder,\n phoneTooltip,\n 'tel',\n userData?.[USER_PROFILE_KEYS.userPhone]\n )}\n </div>\n </div>\n <div className=\"field field--checkbox\">\n <input\n ref={termsRef}\n className=\"field__checkbox-input\"\n type=\"checkbox\"\n name={`terms`}\n id={`checkbox-${id}`}\n onChange={validateFields}\n />\n <div className=\"field__checkbox-label-wrapper rtf\">\n <div>\n <label className=\"field__checkbox-label\" htmlFor={`checkbox-${id}`}>\n {termsLabel}\n </label>\n </div>\n <div\n dangerouslySetInnerHTML={{\n __html: termsContent\n }}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default BeforeResultsQuestion;\n","import React, { useEffect } from 'react';\nimport { Result } from '@coveo/headless';\nimport Stars from '../../coveo/components/request-a-quote-form/stars';\n\nexport type ConsentProps = {\n results: Result[];\n consentCopy: string;\n numberOfQuestions: number;\n selectedContractors: Result[];\n setSelectedContractors: (contractors: Result[]) => void;\n setNextButtonDisabled?: (disabled: boolean, index?: number) => void;\n};\n\nconst Consent = ({\n results,\n consentCopy,\n numberOfQuestions,\n setNextButtonDisabled,\n selectedContractors,\n setSelectedContractors\n}: ConsentProps) => {\n const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { id, checked } = event.target;\n\n const contractor = results.find(result => result.uniqueId === id);\n\n if (contractor) {\n if (checked) {\n setSelectedContractors([...selectedContractors, contractor]);\n } else {\n setSelectedContractors(\n selectedContractors.filter(\n selectedContractor => selectedContractor.uniqueId !== id\n )\n );\n }\n }\n };\n\n useEffect(() => {\n if (selectedContractors.length > 0) {\n setNextButtonDisabled?.(false, numberOfQuestions - 1);\n } else {\n setNextButtonDisabled?.(true, numberOfQuestions - 1);\n }\n }, [selectedContractors]);\n\n useEffect(() => {\n setSelectedContractors([]);\n }, [results]);\n\n return (\n <div className=\"quiz-form__consent-question\">\n <div className=\"quiz-form__consent-contractors\">\n {results?.map(result => (\n <div\n key={result.uniqueId}\n className=\"request-a-quote__content-reviews-checkbox field field--checkbox\"\n >\n <input\n className=\"field__checkbox-input\"\n type=\"checkbox\"\n name=\"contractors\"\n id={result.uniqueId}\n onChange={handleCheckboxChange}\n />\n <div className=\"field__checkbox-label-wrapper\">\n <label\n className=\"field__checkbox-label\"\n htmlFor={result.uniqueId}\n >\n {result.title}\n <span className=\"request-a-quote__content-reviews-city\">{`${result.raw['gaf_f_city']}, ${result.raw['gaf_f_state_code']}`}</span>\n <Stars\n rating={result.raw['gaf_rating'] as number}\n numberOfReviews={\n result.raw['gaf_number_of_reviews'] as string\n }\n />\n </label>\n </div>\n </div>\n ))}\n </div>\n <div\n className=\"rtf quiz-form__consent-copy\"\n dangerouslySetInnerHTML={{\n __html: consentCopy\n }}\n ></div>\n </div>\n );\n};\n\nexport default Consent;\n","import React, { useState, useRef, useEffect } from 'react';\nimport QuizProgress from './quiz-progress';\nimport AddressField from './address-field';\nimport NumericField from './numeric-field';\nimport RadioField from './radio-field';\nimport CheckboxField from './checkbox-field';\nimport AreaField from './area-field';\nimport BeforeResultsQuestion, {\n BeforeResultsQuestionProps\n} from './before-results-question';\nimport {\n USER_PROFILE_FIELDS,\n USER_PROFILE_KEYS,\n getUserProfile,\n updateUserProfile,\n GeolocationType\n} from '../../helpers/global-storage';\nimport {\n COST_ESTIMATE_FIELD_NAMES,\n QUIZ_ANSWER_NAMES,\n QUIZ_RESULT_NAMES,\n SHINGLE_FIELD_NAMES,\n UTM_FIELD_NAME,\n calculateCostEstimateResults,\n contractorResultsType\n} from '../quiz-results/helpers';\nimport { useGoogleReCaptcha } from 'react-google-recaptcha-v3';\nimport { CostEstimateResponse } from '../quiz-results/cost-estimates-response';\nimport {\n getAddressFromGeolocation,\n updateGeolocationDataProperties\n} from '../../helpers/geolocation';\nimport { secureStorage } from '../../helpers/global-storage';\nimport { ExtendedWindowType } from '../../helpers/global-types';\nimport Consent from './consent';\nimport { PreprocessRequest } from '@coveo/headless/dist/definitions/api/preprocess-request';\nimport {\n buildResultList,\n buildResultsPerPage,\n buildSearchEngine,\n Result\n} from '@coveo/headless';\n\nexport type QuizFormProps = {\n quizProgressLabel: string;\n quizName: string;\n quizType: string;\n questions: string;\n backButtonText: string;\n nextButtonText: string;\n skipButtonText: string;\n endButtonText: string;\n agreeButton: string;\n beforeResultsQuestion: string;\n redirectUrl: string;\n reCaptchaSiteKey: string;\n costEstimateEndpoint: string;\n costEstimatePercentage: number;\n costEstimateHeaderToken: string;\n endpoint: string;\n contractorCoveo: string;\n contractorSearchFields: string;\n coveoContext: string;\n defaultQuery: string;\n contractorMatchPageSize: string;\n consentQuestion?: string;\n};\n\nexport type Question = {\n title: string;\n titleTooltip?: string;\n type: string;\n fieldName: string;\n fieldLabel?: string;\n fieldTooltip?: string;\n fieldPlaceholder?: string;\n unitsLabel?: string;\n errorMessage?: string;\n defaultValue?: string;\n especialCharacters?: string;\n values?: {\n label: string;\n value: string | number;\n image?: string;\n imageAlt?: string;\n isImage?: boolean;\n }[];\n setLocationData?: (data: GeolocationType) => void;\n};\n\nlet completedSteps: boolean[] = [];\nlet isFilled = false;\nlet fromUrl = false;\nlet userAddress = '';\n\nexport const QUIZ_FORM_TYPES = Object.freeze({\n cosEstimate: 'cost-estimate',\n contractor: 'contractor',\n shingle: 'shingle'\n});\n\n//get address form url params\nconst urlParams = new URLSearchParams(window.location.search);\nconst address = urlParams.get('address');\n\nif (address) {\n userAddress = address;\n fromUrl = true;\n //delete address from url\n urlParams.delete('address');\n const newUrl = `${window.location.pathname}?${urlParams.toString()}`;\n window.history.replaceState({}, document.title, newUrl);\n} else {\n const addressData = getAddressFromGeolocation();\n\n if (addressData) {\n userAddress = addressData;\n }\n}\n\nconst ZIP_CODE_PLACEHOLDER = '{zipCode}';\n\nconst QuizForm = ({\n quizProgressLabel,\n quizName,\n quizType,\n questions,\n backButtonText,\n nextButtonText,\n skipButtonText,\n agreeButton,\n endButtonText,\n beforeResultsQuestion,\n redirectUrl,\n costEstimateEndpoint,\n costEstimatePercentage,\n costEstimateHeaderToken,\n endpoint,\n contractorCoveo,\n contractorSearchFields,\n coveoContext,\n contractorMatchPageSize,\n consentQuestion,\n defaultQuery\n}: QuizFormProps) => {\n const quizQuestions = JSON.parse(questions) as Question[];\n const quizBeforeResultsQuestion = JSON.parse(\n beforeResultsQuestion\n ) as BeforeResultsQuestionProps;\n const numberOfQuestions =\n quizType === QUIZ_FORM_TYPES.contractor\n ? quizQuestions.length + 2\n : quizQuestions.length + 1;\n const [currentQuestion, setCurrentQuestion] = useState(fromUrl ? 2 : 1);\n const [autoFocus, setAutoFocus] = useState(false);\n const [nextButtonDisabled, setNextButtonDisabled] = useState(true);\n const [backButtonDisabled, setBackButtonDisabled] = useState(false);\n const [showSkipButton, setShowSkipButton] = useState(true);\n const [questionType, setQuestionType] = useState(quizQuestions[0].type);\n const [submitError, setSubmitError] = useState('');\n const [location, setLocationData] = useState<GeolocationType>();\n const formRef = useRef<HTMLFormElement>(null);\n const moduleRef = useRef<HTMLDivElement>(null);\n const { executeRecaptcha } = useGoogleReCaptcha();\n const [utmValues, setUtmValues] = useState<string>('');\n\n //coveo setup for contractor\n const [isReady, setIsReady] = useState(false);\n const [coveoResults, setCoveoResults] = useState<Result[]>([]);\n const [selectedContractorResult, setSelectedContractorResult] =\n React.useState<Result[]>([]);\n\n if (!isFilled) {\n completedSteps = Array(numberOfQuestions).fill(false);\n isFilled = true;\n\n if (userAddress) {\n completedSteps[0] = true;\n\n if (!fromUrl) setNextButtonDisabled(false);\n }\n }\n\n const questionTypes = {\n address: AddressField,\n area: AreaField,\n numeric: NumericField,\n radio: RadioField,\n checkbox: CheckboxField\n };\n\n const updateDisabled = (disabled: boolean, index?: number) => {\n if (index) {\n completedSteps[index] = !disabled;\n } else {\n const temp = completedSteps.map((step, index) =>\n index === currentQuestion - 1 ? !disabled : step\n );\n completedSteps = temp;\n }\n\n setNextButtonDisabled(disabled);\n };\n\n const getQuestionContent = (question: Question) => {\n const QuestionType =\n questionTypes[question.type as keyof typeof questionTypes];\n\n if (question.type === 'address') {\n question.defaultValue = userAddress;\n question.setLocationData = setLocationData;\n }\n\n return QuestionType ? (\n <QuestionType\n {...question}\n returnStep={handleReturnStep}\n setDisabled={updateDisabled}\n showSkip={setShowSkipButton}\n handleFormDataLayer={handleFormStartDataLayer}\n />\n ) : null;\n };\n\n //contractor coveo config\n\n const consentQuestionData = consentQuestion\n ? JSON.parse(consentQuestion)\n : {};\n let contractorFields, contractorEngine, contractorListController;\n\n if (quizType === QUIZ_FORM_TYPES.contractor) {\n const contractorCoveoConfig = JSON.parse(contractorCoveo);\n contractorFields = JSON.parse(contractorSearchFields);\n const contractorFieldsToInclude = Object.values(\n contractorFields\n ) as string[];\n\n const global = window as ExtendedWindowType;\n\n const preprocessRequest: PreprocessRequest = (request, clientOrigin) => {\n if (global.preProcessRequest) {\n if (clientOrigin === 'searchApiFetch' && request.body) {\n const body = global.preProcessRequest(request.body.toString());\n request.body = body;\n }\n }\n\n return request;\n };\n\n const contractorConfig = {\n organizationId: contractorCoveoConfig.OrganizationId,\n accessToken: contractorCoveoConfig.ApiKey,\n searchHub: contractorCoveoConfig.SearchHubPipeline,\n pipeline: contractorCoveoConfig.SearchHubPipeline,\n preprocessRequest\n };\n\n contractorEngine = buildSearchEngine({\n configuration: contractorConfig\n });\n\n buildResultsPerPage(contractorEngine, {\n initialState: { numberOfResults: Number(contractorMatchPageSize) }\n });\n\n contractorListController = buildResultList(contractorEngine, {\n options: {\n fieldsToInclude: contractorFieldsToInclude\n }\n });\n }\n\n //return to this step if address is not complete\n const handleReturnStep = () => {\n if (currentQuestion === 1) return;\n completedSteps[0] = false;\n setNextButtonDisabled(true);\n setCurrentQuestion(currentQuestion - 1);\n };\n\n const handleBackButtonClick = () => {\n if (completedSteps[currentQuestion - 2] === true) {\n setNextButtonDisabled(false);\n }\n\n if (numberOfQuestions !== currentQuestion) {\n setQuestionType(quizQuestions[currentQuestion - 2].type);\n }\n\n setCurrentQuestion(currentQuestion - 1);\n };\n\n const handleNextButtonClick = () => {\n if (completedSteps[currentQuestion] === false) {\n setNextButtonDisabled(true);\n } else {\n setNextButtonDisabled(false);\n }\n\n if (currentQuestion < quizQuestions.length) {\n setQuestionType(quizQuestions[currentQuestion].type);\n } else {\n setQuestionType('radio');\n }\n\n if (quizType === QUIZ_FORM_TYPES.contractor) {\n if (\n currentQuestion === numberOfQuestions - 1 &&\n coveoResults.length < 1\n ) {\n const now = new Date();\n const expirationTime = 1000 * 60 * 60 * 24 * 30; // 30 days\n\n const resultsToStore: contractorResultsType = {\n zipCode: 'undefined',\n latitude: 0,\n longitude: 0,\n results: selectedContractorResult,\n expirationDate: now.getTime() + expirationTime\n };\n\n secureStorage.set(\n QUIZ_RESULT_NAMES.contractor,\n JSON.stringify(resultsToStore)\n );\n setIsReady(true);\n } else {\n setCurrentQuestion(currentQuestion + 1);\n }\n } else {\n //defaul for shingle and cost estimate\n setCurrentQuestion(currentQuestion + 1);\n }\n };\n\n const handleFormSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n };\n\n const handleFinish = async () => {\n if (formRef.current) {\n setSubmitError('');\n setNextButtonDisabled(true);\n setBackButtonDisabled(true);\n\n const formData = new FormData(formRef.current);\n const now = new Date();\n const expirationTime = 1000 * 60 * 60 * 24 * 30; // 30 days\n\n if (utmValues) {\n formData.append(UTM_FIELD_NAME, utmValues);\n }\n\n if (quizType === QUIZ_FORM_TYPES.cosEstimate) {\n const objectToStore = {\n zip: formData.get(COST_ESTIMATE_FIELD_NAMES.zip),\n homeSquareFootage: Number(\n formData.get(COST_ESTIMATE_FIELD_NAMES.homeSquareFootage)\n ),\n numberOfStories: Number(\n formData.get(COST_ESTIMATE_FIELD_NAMES.numberOfStories)\n ),\n garageValue: Number(\n formData.get(COST_ESTIMATE_FIELD_NAMES.garageValue)\n ),\n roofSlopeValue: Number(\n formData.get(COST_ESTIMATE_FIELD_NAMES.roofSlopeValue)\n ),\n roofComplexityValue: Number(\n formData.get(COST_ESTIMATE_FIELD_NAMES.roofComplexityValue)\n ),\n expirationDate: now.getTime() + expirationTime,\n [UTM_FIELD_NAME]: formData.get(UTM_FIELD_NAME)\n };\n\n secureStorage.set(\n QUIZ_ANSWER_NAMES.costEstimates,\n JSON.stringify(objectToStore)\n );\n\n const homeSquareFootage = formData.get(\n COST_ESTIMATE_FIELD_NAMES.homeSquareFootage\n );\n const numberOfStories = formData.get(\n COST_ESTIMATE_FIELD_NAMES.numberOfStories\n );\n const garageValue = formData.get(COST_ESTIMATE_FIELD_NAMES.garageValue);\n const roofSlopeValue = formData.get(\n COST_ESTIMATE_FIELD_NAMES.roofSlopeValue\n );\n const roofComplexityValue = formData.get(\n COST_ESTIMATE_FIELD_NAMES.roofComplexityValue\n );\n const zip = formData.get(COST_ESTIMATE_FIELD_NAMES.zip);\n\n let fetchConfig = {};\n\n if (costEstimateHeaderToken) {\n fetchConfig = {\n headers: {\n Authorization: costEstimateHeaderToken\n }\n };\n }\n\n if (\n homeSquareFootage !== null &&\n numberOfStories !== null &&\n garageValue !== null &&\n roofSlopeValue !== null &&\n roofComplexityValue !== null &&\n zip !== null\n ) {\n const response = await fetch(\n costEstimateEndpoint.replace(ZIP_CODE_PLACEHOLDER, zip as string),\n fetchConfig\n );\n\n const { data } = (await response.json()) as CostEstimateResponse;\n\n const territoryPricePerSquareInUSD = data?.Territories?.find(\n territory => territory.PricePerSquareInUSD !== null\n )?.PricePerSquareInUSD;\n\n if (territoryPricePerSquareInUSD && costEstimatePercentage) {\n const results = calculateCostEstimateResults(\n Number(homeSquareFootage),\n Number(numberOfStories),\n Number(garageValue),\n Number(roofSlopeValue),\n Number(roofComplexityValue),\n territoryPricePerSquareInUSD,\n costEstimatePercentage\n );\n\n formData.append(\n COST_ESTIMATE_FIELD_NAMES.estimateLower,\n results.lowestCost.toString()\n );\n formData.append(\n COST_ESTIMATE_FIELD_NAMES.estimateAverage,\n results.averageCost.toString()\n );\n formData.append(\n COST_ESTIMATE_FIELD_NAMES.estimateUpper,\n results.highestCost.toString()\n );\n }\n }\n\n //Delete unnecessary fields for eloqua payload\n formData.delete(COST_ESTIMATE_FIELD_NAMES.homeSquareFootage);\n formData.delete(COST_ESTIMATE_FIELD_NAMES.numberOfStories);\n formData.delete(COST_ESTIMATE_FIELD_NAMES.garageValue);\n formData.delete(COST_ESTIMATE_FIELD_NAMES.roofSlopeValue);\n formData.delete(COST_ESTIMATE_FIELD_NAMES.roofComplexityValue);\n }\n\n const captchaToken = await executeRecaptcha?.('quiz');\n\n if (quizType === QUIZ_FORM_TYPES.shingle) {\n const objectToStore = {\n userZipCode: formData.get(SHINGLE_FIELD_NAMES.zipCode),\n shingleFeatures: formData.getAll(SHINGLE_FIELD_NAMES.shingleFeatures),\n [UTM_FIELD_NAME]: formData.get(UTM_FIELD_NAME)\n };\n\n const shingleFeatureValues = quizQuestions\n .find(\n question =>\n question.fieldName === SHINGLE_FIELD_NAMES.shingleFeatures\n )\n ?.values?.map(value => value.value);\n\n //form data to json\n formData.delete(SHINGLE_FIELD_NAMES.shingleFeatures);\n formData.append(\n SHINGLE_FIELD_NAMES.shingleFeatures,\n JSON.stringify(objectToStore.shingleFeatures)\n );\n\n //create an object with form data\n const formDataObject = Object.fromEntries(formData.entries());\n\n const newObjectToStore = {\n ...formDataObject,\n ...objectToStore,\n shingleFeatureValues,\n expirationDate: now.getTime() + expirationTime,\n token: captchaToken\n };\n\n const skipIndex = newObjectToStore.shingleFeatures.indexOf('skip');\n\n if (skipIndex > -1) {\n newObjectToStore.shingleFeatures.splice(skipIndex, 1);\n }\n\n secureStorage.set(\n QUIZ_ANSWER_NAMES.shingle,\n JSON.stringify(newObjectToStore)\n );\n }\n\n let userProfileObject = getUserProfile();\n\n for (const data of formData) {\n const name = data[0];\n const value = data[1];\n\n if (\n USER_PROFILE_FIELDS.includes(\n USER_PROFILE_KEYS[name as keyof typeof USER_PROFILE_KEYS]\n )\n ) {\n userProfileObject = {\n ...userProfileObject,\n [USER_PROFILE_KEYS[name as keyof typeof USER_PROFILE_KEYS]]: value\n };\n }\n }\n\n formData.append('token', captchaToken as string);\n\n const formDataObject = Object.fromEntries(formData.entries());\n\n let fetchConfig: {\n headers?: {\n 'Content-Type': string;\n };\n body: string;\n } = {\n body: JSON.stringify(formData)\n };\n\n //save information for endpoint call on response page\n if (quizType === QUIZ_FORM_TYPES.contractor) {\n const fields = JSON.parse(contractorSearchFields);\n\n const contractors = selectedContractorResult.map(\n result => result.raw[fields.contractorId]\n );\n\n fetchConfig = {\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ ...formDataObject, contractors })\n };\n }\n\n window\n .fetch(endpoint, {\n method: 'post',\n ...fetchConfig\n })\n .then(response => {\n if (response.status === 200) {\n updateGeolocationDataProperties(location as GeolocationType);\n updateUserProfile(userProfileObject);\n if (quizType === QUIZ_FORM_TYPES.contractor) {\n secureStorage.remove(QUIZ_RESULT_NAMES.contractor);\n\n if (location?.zip && location.latitude && location.longitude) {\n const now = new Date();\n const expirationTime = 1000 * 60 * 60 * 24 * 30; // 30 days\n\n const resultsToStore: contractorResultsType = {\n zipCode: location.zip,\n latitude: location.latitude,\n longitude: location.longitude,\n results: selectedContractorResult,\n expirationDate: now.getTime() + expirationTime\n };\n\n secureStorage.set(\n QUIZ_RESULT_NAMES.contractor,\n JSON.stringify(resultsToStore)\n );\n }\n }\n if (quizType === QUIZ_FORM_TYPES.shingle) {\n localStorage.removeItem(QUIZ_RESULT_NAMES.shingle);\n }\n window.location.href = redirectUrl;\n }\n })\n .finally(() => {\n setBackButtonDisabled(false);\n setNextButtonDisabled(false);\n });\n }\n };\n\n useEffect(() => {\n if (formRef.current) {\n if (autoFocus) {\n setTimeout(() => {\n const firstActiveRadio = formRef.current?.querySelector(\n '.quiz-form__step--active .radio-field__card--active input'\n ) as HTMLInputElement;\n\n if (firstActiveRadio) {\n firstActiveRadio.focus();\n return;\n }\n\n const firstActiveInput = formRef.current?.querySelector(\n '.quiz-form__step--active input'\n ) as HTMLInputElement;\n\n firstActiveInput?.focus();\n }, 100);\n\n if (moduleRef.current) {\n const parent = moduleRef.current.parentElement;\n if (parent) {\n parent.style.scrollMarginTop = 'var(--header-block-size, 0)';\n parent.scrollIntoView();\n } else {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n });\n }\n }\n } else {\n setAutoFocus(true);\n }\n }\n }, [currentQuestion]);\n\n const handleFormStartDataLayer = (\n e: Event | React.ChangeEvent<HTMLInputElement>\n ) => {\n if (\n (window as ExtendedWindowType).dataLayer.findIndex(\n layer => layer.event === 'form_start'\n ) !== -1\n )\n return;\n\n (window as ExtendedWindowType).dataLayer.push({\n event: 'form_start',\n event_category: 'form',\n event_action: 'start',\n event_label: '',\n event_attributes: {\n form_name: quizName,\n form_type: quizType,\n input_label: (e?.target as HTMLInputElement)?.name\n }\n });\n };\n\n useEffect(() => {\n if (formRef.current) {\n formRef.current.addEventListener('change', e =>\n handleFormStartDataLayer(e)\n );\n }\n\n return () => {\n if (formRef.current) {\n formRef.current.removeEventListener('change', e =>\n handleFormStartDataLayer(e)\n );\n }\n };\n }, [formRef.current]);\n\n useEffect(() => {\n if (currentQuestion === numberOfQuestions - 1) {\n if (coveoResults.length > 0) {\n setCurrentQuestion(currentQuestion + 1);\n } else {\n window.location.href = redirectUrl;\n }\n }\n }, [coveoResults]);\n\n useEffect(() => {\n setIsReady(false);\n setCoveoResults([]);\n }, [location?.zip]);\n\n useEffect(() => {\n if (urlParams.has('utm_source')) {\n const allParams = Array.from(urlParams.entries())\n .map(([key, value]) => `${key}=${value}`)\n .join('&');\n setUtmValues(allParams);\n }\n }, []);\n\n return (\n <div\n className={`quiz-form container quiz-form--${questionType}`}\n ref={moduleRef}\n >\n <QuizProgress\n currentQuestion={currentQuestion}\n progressLabel={quizProgressLabel}\n numberOfQuestions={numberOfQuestions}\n />\n <h1 className=\"quiz-form__title\">{quizName}</h1>\n <form onSubmit={handleFormSubmit} ref={formRef}>\n {quizQuestions.map((question, index) => (\n <div\n key={index}\n className={`quiz-form__step ${\n currentQuestion === index + 1 ? 'quiz-form__step--active' : ''\n }`}\n >\n <h2 className=\"quiz-form__subheading\">\n <span dangerouslySetInnerHTML={{ __html: question.title }} />\n {question.titleTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">\n {question.titleTooltip}\n </div>\n </button>\n )}\n </h2>\n {getQuestionContent(question)}\n </div>\n ))}\n {quizType === QUIZ_FORM_TYPES.contractor && (\n <div\n className={`quiz-form__step ${\n currentQuestion === numberOfQuestions - 1\n ? 'quiz-form__step--active'\n : ''\n }`}\n >\n <h2 className=\"quiz-form__subheading\">\n <span\n dangerouslySetInnerHTML={{\n __html: quizBeforeResultsQuestion.title\n }}\n />\n {quizBeforeResultsQuestion.titleTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">\n {quizBeforeResultsQuestion.titleTooltip}\n </div>\n </button>\n )}\n </h2>\n <BeforeResultsQuestion\n {...quizBeforeResultsQuestion}\n setNextButtonDisabled={updateDisabled}\n controller={contractorListController}\n fieldsObject={contractorFields}\n engine={contractorEngine}\n coveoContext={coveoContext}\n defaultQuery={defaultQuery}\n isReady={isReady}\n zipCode={location?.zip}\n countryCode={location?.country}\n setResults={setCoveoResults}\n />\n </div>\n )}\n <div\n className={`quiz-form__step ${\n currentQuestion === numberOfQuestions\n ? 'quiz-form__step--active'\n : ''\n }`}\n >\n <h2 className=\"quiz-form__subheading\">\n <span\n dangerouslySetInnerHTML={{\n __html:\n quizType === QUIZ_FORM_TYPES.contractor\n ? consentQuestionData?.title\n : quizBeforeResultsQuestion.title\n }}\n />\n <>\n {quizType === QUIZ_FORM_TYPES.contractor ? (\n <>\n {consentQuestionData.titleTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">\n {consentQuestionData.titleTooltip}\n </div>\n </button>\n )}\n </>\n ) : (\n <>\n {quizBeforeResultsQuestion.titleTooltip && (\n <button className=\"field__tooltip\" title=\"tooltip\">\n <div className=\"field__tooltip-box\">\n {quizBeforeResultsQuestion.titleTooltip}\n </div>\n </button>\n )}\n </>\n )}\n </>\n </h2>\n {quizType === QUIZ_FORM_TYPES.contractor ? (\n <>\n {coveoResults.length > 0 && (\n <Consent\n consentCopy={consentQuestionData?.consentCopy}\n setNextButtonDisabled={updateDisabled}\n results={coveoResults}\n numberOfQuestions={numberOfQuestions}\n selectedContractors={selectedContractorResult}\n setSelectedContractors={setSelectedContractorResult}\n />\n )}\n </>\n ) : (\n <BeforeResultsQuestion\n {...quizBeforeResultsQuestion}\n setNextButtonDisabled={updateDisabled}\n />\n )}\n </div>\n </form>\n {submitError && (\n <span className=\"error-message__error\">{submitError}</span>\n )}\n <div className=\"quiz-form__buttons\">\n <button\n className={`btn btn--primary quiz-form__btn ${\n currentQuestion === 1 ? 'disabled' : ''\n }`}\n onClick={handleBackButtonClick}\n disabled={currentQuestion === 1 || backButtonDisabled}\n >\n <svg>\n <use xlinkHref=\"#chevron-left\" />\n </svg>\n {backButtonText}\n </button>\n {currentQuestion < numberOfQuestions &&\n quizQuestions[currentQuestion - 1]?.type !== 'area' && (\n <button\n className=\"btn btn--secondary quiz-form__btn\"\n onClick={handleNextButtonClick}\n disabled={nextButtonDisabled}\n >\n {quizType === QUIZ_FORM_TYPES.contractor &&\n currentQuestion === numberOfQuestions - 1\n ? endButtonText\n : nextButtonText}\n <svg>\n <use xlinkHref=\"#chevron-right\" />\n </svg>\n </button>\n )}\n {currentQuestion < numberOfQuestions &&\n quizQuestions[currentQuestion - 1]?.type === 'area' && (\n <button\n className=\"btn btn--primary quiz-form__btn a\"\n onClick={handleNextButtonClick}\n disabled={!showSkipButton && nextButtonDisabled}\n >\n {showSkipButton ? skipButtonText : nextButtonText}\n <svg>\n <use xlinkHref=\"#chevron-right\" />\n </svg>\n </button>\n )}\n {currentQuestion === numberOfQuestions && (\n <button\n className=\"btn btn--primary quiz-form__btn\"\n onClick={handleFinish}\n disabled={nextButtonDisabled}\n >\n {quizType === QUIZ_FORM_TYPES.contractor\n ? agreeButton\n : endButtonText}\n <svg>\n <use xlinkHref=\"#chevron-right\" />\n </svg>\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default QuizForm;\n","import React from 'react';\nimport QuizForm, { QuizFormProps } from './quiz-form';\nimport { GoogleReCaptchaProvider } from 'react-google-recaptcha-v3';\n\nconst Quiz = (props: QuizFormProps) => {\n return (\n <GoogleReCaptchaProvider\n reCaptchaKey={props.reCaptchaSiteKey}\n useEnterprise={true}\n >\n <QuizForm {...props} />\n </GoogleReCaptchaProvider>\n );\n};\n\nexport default Quiz;\n"],"names":["QUIZ_PROGRESS_PLACEHOLDERS","QuizProgress","currentQuestion","progressLabel","numberOfQuestions","React","AddressField","fieldLabel","fieldTooltip","fieldPlaceholder","errorMessage","fieldName","defaultValue","setDisabled","setLocationData","returnStep","handleFormDataLayer","id","useId","inputRef","useRef","inputContainerRef","validated","setValidated","useState","validatedAddress","setValidatedAddress","loading","setLoading","interval","zipInputRef","zipCountryCodeRef","cityRef","stateRef","streetRef","secondStreetRef","fillInAddress","autocomplete","place","inputValue","zip","_b","_a","component","country","_d","_c","latitude","_f","_e","longitude","_h","_g","state","_j","_i","city","_l","_k","street","_n","_m","secondStreet","_p","_o","streetNumber","_r","_q","initAutoComplete","getLocationDataFromAddress","updateGeolocationDataProperties","handleAddressInput","e","input","dataLayer","useEffect","inputContainer","COST_ESTIMATE_FIELD_NAMES","NumericField","unitsLabel","inputValueWithoutDot","validatedInput","inputNumber","RadioField","values","selectedValue","setSelectedValue","containerRef","handleInputChage","event","value","index","AreaField","showSkip","especialCharacters","showError","setShowError","matchingCharacters","setMatchingCharacters","regexPattern","regex","inputMatchingCharacters","BeforeResultsQuestion","nameLabel","nameTooltip","namePlaceholder","nameErrorMessage","lastNameLabel","lastNameTooltip","lastNamePlaceholder","lastNameErrorMessage","phoneLabel","phoneTooltip","phonePlaceholder","phoneErrorMessage","emailLabel","emailTooltip","emailPlaceholder","emailErrorMessage","termsLabel","termsContent","engine","controller","zipCode","countryCode","fieldsObject","coveoContext","defaultQuery","isReady","setResults","setNextButtonDisabled","nameRef","lastNameRef","emailRef","phoneRef","termsRef","hasCoveoContractor","setState","userData","getUserProfile","validateField","parent","formatPhoneNumberAndValidate","validateFields","phone","missingFields","handleKeyPress","renderInput","ref","label","name","placeholder","tooltip","type","pattern","executeAdvancedSearch","context","buildContext","advancedQuerySearchActionCreator","loadAdvancedSearchQueryActions","initDistanceCalculator","lat","lng","response","getLatLongFromZip","global","body","newBody","resultListState","selectedResults","USER_PROFILE_KEYS","Consent","results","consentCopy","selectedContractors","setSelectedContractors","handleCheckboxChange","checked","contractor","result","selectedContractor","Stars","completedSteps","isFilled","fromUrl","userAddress","QUIZ_FORM_TYPES","urlParams","address","newUrl","addressData","getAddressFromGeolocation","ZIP_CODE_PLACEHOLDER","QuizForm","quizProgressLabel","quizName","quizType","questions","backButtonText","nextButtonText","skipButtonText","agreeButton","endButtonText","beforeResultsQuestion","redirectUrl","costEstimateEndpoint","costEstimatePercentage","costEstimateHeaderToken","endpoint","contractorCoveo","contractorSearchFields","contractorMatchPageSize","consentQuestion","quizQuestions","quizBeforeResultsQuestion","setCurrentQuestion","autoFocus","setAutoFocus","nextButtonDisabled","backButtonDisabled","setBackButtonDisabled","showSkipButton","setShowSkipButton","questionType","setQuestionType","submitError","setSubmitError","location","formRef","moduleRef","executeRecaptcha","useGoogleReCaptcha","utmValues","setUtmValues","setIsReady","coveoResults","setCoveoResults","selectedContractorResult","setSelectedContractorResult","questionTypes","CheckboxField","updateDisabled","disabled","step","getQuestionContent","question","QuestionType","handleReturnStep","handleFormStartDataLayer","consentQuestionData","contractorFields","contractorEngine","contractorListController","contractorCoveoConfig","contractorFieldsToInclude","preprocessRequest","request","clientOrigin","contractorConfig","buildSearchEngine","buildResultsPerPage","buildResultList","handleBackButtonClick","handleNextButtonClick","now","expirationTime","resultsToStore","secureStorage","QUIZ_RESULT_NAMES","handleFormSubmit","handleFinish","formData","UTM_FIELD_NAME","objectToStore","QUIZ_ANSWER_NAMES","homeSquareFootage","numberOfStories","garageValue","roofSlopeValue","roofComplexityValue","fetchConfig","data","territoryPricePerSquareInUSD","territory","calculateCostEstimateResults","captchaToken","SHINGLE_FIELD_NAMES","shingleFeatureValues","newObjectToStore","skipIndex","userProfileObject","USER_PROFILE_FIELDS","formDataObject","fields","contractors","updateUserProfile","firstActiveRadio","firstActiveInput","layer","allParams","key","Quiz","props","GoogleReCaptchaProvider"],"mappings":"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"}