{"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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"}