{"version":3,"file":"index-27eee28b.js","sources":["../../../../src/scripts/coveo/modules/city-listing/card.tsx","../../../../src/scripts/coveo/modules/city-listing/templates.tsx","../../../../src/scripts/coveo/modules/city-listing/distance-facet.tsx","../../../../src/scripts/coveo/modules/city-listing/index.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport RatingStars from '../../../react-components/rating-stars';\nimport { disableBodyScroll, clearAllBodyScrollLocks } from 'body-scroll-lock';\nimport type { BodyScrollOptions } from 'body-scroll-lock';\nimport { createDataLayerString, isInDialog } from '../../../helpers/helpers';\nimport { ExtendedWindowType } from '../../engine';\nimport { formatPhoneNumber } from '../../../helpers/transform';\nimport { Result } from '@coveo/headless';\nimport { ResultLink } from '../../components/interactive-result';\n\ntype ContractorCardProps = {\n  index: number;\n  id: string;\n  imgSource: string;\n  imgAlt: string;\n  contractorId: string;\n  contractorType: string;\n  contractorDBA: string;\n  contractorName: string;\n  contractorRating: number;\n  contractorReviews: number;\n  city: string;\n  stateAbbreviation: string;\n  distance: string;\n  certificationsLabel: string;\n  certifications: string[];\n  moreCertificationsLabel: string;\n  viewAllCertificationsLabel: string;\n  certificationImages: {\n    facetName: string;\n    iconUrl: string;\n  }[];\n  quoteLabel: string;\n  phone: string;\n  link: string;\n  countryCode: string;\n  isLead: number;\n  result: Result;\n};\n\nfunction ContractorCard({\n  index,\n  imgSource,\n  imgAlt,\n  contractorId,\n  contractorType,\n  contractorDBA,\n  contractorName,\n  contractorRating,\n  contractorReviews,\n  city,\n  stateAbbreviation,\n  distance,\n  certificationsLabel,\n  certifications,\n  moreCertificationsLabel,\n  viewAllCertificationsLabel,\n  certificationImages,\n  quoteLabel,\n  phone,\n  link,\n  countryCode,\n  isLead,\n  result\n}: ContractorCardProps) {\n  const modal = document.querySelector<HTMLElement>('.certifications-modal');\n  const modalCloseButton = modal?.querySelector<HTMLElement>(\n    '.modal__close-button'\n  );\n\n  const handleClick = () => {\n    const options = {\n      reserveScrollBarGap: true,\n      allowTouchMove: (el: HTMLElement) => {\n        return el.classList.contains('modal');\n      }\n    } as BodyScrollOptions;\n\n    (modal as HTMLDialogElement)?.showModal();\n    disableBodyScroll(modal as HTMLElement, options);\n\n    const global = window as ExtendedWindowType;\n\n    global.dataLayer?.push({\n      event_attributes: {\n        contractor_id: contractorId,\n        contractor_name: contractorName,\n        contractor_certificates_count: certifications?.length || 0,\n        contractor_rating: contractorRating,\n        contractor_reviews_count: contractorReviews,\n        contractor_certificate_name: certifications?.[0] || null,\n        contractor_type: contractorType\n      },\n      event: 'contractor_interaction',\n      event_category: 'contractor interactions',\n      event_action: 'view certifications and awards'\n    });\n  };\n\n  const handleClose = () => {\n    (modal as HTMLDialogElement)?.close();\n    clearAllBodyScrollLocks();\n  };\n\n  const handleRequestAQuote = () => {\n    const modalContractorInfo = {\n      id: contractorId,\n      imageAlt: imgAlt,\n      image: imgSource,\n      contractorDBA: contractorDBA,\n      contractorName: contractorName,\n      rating: contractorRating,\n      numberOfReviews: contractorReviews,\n      city: city,\n      state: stateAbbreviation,\n      distanceinmiles: parseFloat(distance),\n      certificateName: certifications?.[0] || null,\n      numberOfCertificates: certifications?.length || 0,\n      type: contractorType\n    };\n\n    const openRequestAQuoteModal = new CustomEvent('openRequestAQuoteModal', {\n      detail: modalContractorInfo\n    });\n\n    (window as ExtendedWindowType).dataLayer.push({\n      event_attributes: {\n        contractor_id: modalContractorInfo.id,\n        contractor_name: modalContractorInfo.contractorName,\n        contractor_certificate_name: modalContractorInfo.certificateName,\n        contractor_type: modalContractorInfo.type,\n        contractor_reviews_count: modalContractorInfo.numberOfReviews,\n        contractor_rating: modalContractorInfo.rating,\n        contractor_certificates_count: modalContractorInfo.numberOfCertificates\n      },\n      event: 'request_quote_button',\n      event_category: 'find a contractor',\n      event_action: 'request a quote button',\n      event_label: ''\n    });\n    window.dispatchEvent(openRequestAQuoteModal);\n  };\n\n  useEffect(() => {\n    if (modalCloseButton) {\n      modalCloseButton.addEventListener('click', handleClose);\n    }\n\n    modal?.addEventListener('click', (e: MouseEvent) => {\n      if (e.target === modal && !isInDialog(modal as HTMLDialogElement, e)) {\n        handleClose();\n      }\n    });\n\n    const global = window as ExtendedWindowType;\n\n    global.dataLayer?.push({\n      event: 'contractor_impression',\n      event_category: 'find a contractor',\n      event_action: 'contractor impression',\n      event_attributes: {\n        contractor_id: contractorId,\n        contractor_name: contractorName,\n        contractor_certificate_name: certifications?.[0] || null,\n        contractor_type: contractorType,\n        contractor_reviews_count: contractorReviews,\n        contractor_rating: contractorRating,\n        contractor_certificates_count: certifications?.length || 0,\n        contractor_position: index\n      }\n    });\n\n    return () => {\n      if (modalCloseButton) {\n        modalCloseButton.removeEventListener('click', handleClose);\n      }\n    };\n  }, []);\n\n  const renderCertifications = () => {\n    return (\n      <div className=\"certification-card__certifications\">\n        <div className=\"certification-card__certifications-heading-wrapper\">\n          <h3 className=\"certification-card__certifications-heading\">\n            {certificationsLabel}\n          </h3>\n          <button\n            type=\"button\"\n            className=\"certification-card__certifications-tooltip btn--tooltip btn--tooltip-alt\"\n            title={viewAllCertificationsLabel}\n            onClick={handleClick}\n            data-layer={createDataLayerString([\n              {\n                event: 'modal_view',\n                event_category: 'modal overlay',\n                event_action: 'view',\n                event_attributes: {\n                  modalName: 'certifications'\n                }\n              }\n            ])}\n          >\n            <span className=\"sr-only\">{viewAllCertificationsLabel}</span>\n          </button>\n        </div>\n        {certifications && certifications.length > 0 && (\n          <ul className=\"certification-card__certifications-list\">\n            {certifications.map((certification, index) => (\n              <React.Fragment key={index}>\n                {index < 3 && (\n                  <li className=\"certification-card__certification\">\n                    <img\n                      src={\n                        certificationImages?.find(\n                          item => item.facetName === certification\n                        )?.iconUrl\n                      }\n                      alt=\"\"\n                      role=\"presentation\"\n                      className=\"certification-card__certification-icon\"\n                      width=\"20\"\n                      height=\"20\"\n                      loading=\"lazy\"\n                    />\n                    {certification}\n                  </li>\n                )}\n              </React.Fragment>\n            ))}\n            {certifications.length > 3 && (\n              <li className=\"certification-card__certification\">\n                {`(+${certifications.length - 3} ${moreCertificationsLabel})`}\n              </li>\n            )}\n          </ul>\n        )}\n      </div>\n    );\n  };\n\n  const renderRequestAQuoteButton = () => {\n    if (countryCode === 'CAN') return null;\n\n    if (\n      contractorType !== 'Residential' ||\n      (contractorType === 'Residential' && isLead)\n    ) {\n      return (\n        <button\n          className=\"btn btn--secondary certification-card__quote\"\n          onClick={handleRequestAQuote}\n        >\n          {quoteLabel}\n        </button>\n      );\n    } else {\n      return null;\n    }\n  };\n\n  return (\n    <article className=\"certification-card\">\n      <ResultLink\n        result={result}\n        link={link}\n        ariaLabel={`Go to ${contractorName}`}\n        className=\"certification-card__image-link certification-card__image-link--desktop\"\n        dataLayer={createDataLayerString([\n          {\n            event: 'view_profile_click',\n            event_category: 'contractor interactions',\n            event_action: 'view profile click',\n            event_label: '',\n            event_attributes: {\n              contractor_id: contractorId,\n              contractor_name: contractorName,\n              contractor_certificates_count: certifications?.length || 0,\n              contractor_rating: contractorRating,\n              contractor_reviews_count: contractorReviews,\n              contractor_certificate_name: certifications?.[0] || null,\n              contractor_type: contractorType\n            }\n          }\n        ])}\n      >\n        <picture className=\"picture certification-card__picture\">\n          <img\n            src={imgSource}\n            alt={imgAlt}\n            width={120}\n            height={120}\n            loading=\"lazy\"\n          />\n        </picture>\n      </ResultLink>\n      <div className=\"certification-card__wrapper\">\n        <div className=\"certification-card__content\">\n          <div>\n            <h2 className=\"certification-card__heading\">\n              <ResultLink\n                className=\"link--inline\"\n                target=\"_blank\"\n                link={link}\n                result={result}\n                dataLayer={createDataLayerString([\n                  {\n                    event: 'view_profile_click',\n                    event_category: 'contractor interactions',\n                    event_action: 'view profile click',\n                    event_label: '',\n                    event_attributes: {\n                      contractor_id: contractorId,\n                      contractor_name: contractorName,\n                      contractor_certificates_count:\n                        certifications?.length || 0,\n                      contractor_rating: contractorRating,\n                      contractor_reviews_count: contractorReviews,\n                      contractor_certificate_name: certifications?.[0] || null,\n                      contractor_type: contractorType\n                    }\n                  }\n                ])}\n              >\n                <span>{contractorName}</span>\n              </ResultLink>\n            </h2>\n            {contractorReviews && contractorRating ? (\n              <RatingStars\n                rating={contractorRating}\n                total={contractorReviews}\n              />\n            ) : null}\n            <p className=\"certification-card__city\">\n              {city}, {stateAbbreviation} - {Number(distance).toFixed(1)} mi\n            </p>\n          </div>\n          <div>\n            <ResultLink\n              link={link}\n              result={result}\n              ariaLabel={`Go to ${contractorName}`}\n              className=\"certification-card__image-link certification-card__image-link--mobile\"\n              dataLayer={createDataLayerString([\n                {\n                  event: 'view_profile_click',\n                  event_category: 'find a contractor',\n                  event_action: 'view profile click',\n                  event_label: '',\n                  event_attributes: {\n                    contractor_id: contractorId,\n                    contractor_name: contractorName,\n                    contractor_certificates_count: certifications?.length || 0,\n                    contractor_rating: contractorRating,\n                    contractor_reviews_count: contractorReviews,\n                    contractor_certificate_name: certifications?.[0] || null,\n                    contractor_type: contractorType\n                  }\n                }\n              ])}\n            >\n              <picture className=\"picture certification-card__picture\">\n                <img\n                  src={imgSource}\n                  alt={imgAlt}\n                  width={80}\n                  height={80}\n                  loading=\"lazy\"\n                />\n              </picture>\n            </ResultLink>\n            <div className=\"certification-card__contact certification-card__contact--desktop\">\n              {renderRequestAQuoteButton()}\n              {phone && (\n                <a\n                  href={`tel:${phone}`}\n                  className=\"link--inline link--icon-left certification-card__phone\"\n                  data-layer={createDataLayerString([\n                    {\n                      event_category: 'find a contractor',\n                      event_action: 'call us click phone number',\n                      event_label: '',\n                      event: 'contractor_leads',\n                      event_attributes: {\n                        contractor_id: contractorId,\n                        contractor_name: contractorName,\n                        contractor_certificates_count:\n                          certifications?.length || 0,\n                        contractor_rating: contractorRating,\n                        contractor_reviews_count: contractorReviews,\n                        contractor_type: contractorType,\n                        contractor_certificate_name: certifications?.[0] || null\n                      }\n                    }\n                  ])}\n                >\n                  <span className=\"sr-only\">Phone Number:</span>\n                  {formatPhoneNumber(phone)}\n                  <svg viewBox=\"0 0 13 16\" role=\"presentation\">\n                    <use xlinkHref=\"#red-phone-icon\"></use>\n                  </svg>\n                </a>\n              )}\n            </div>\n          </div>\n        </div>\n        {certifications && certifications.length > 0\n          ? renderCertifications()\n          : null}\n        <div className=\"certification-card__contact certification-card__contact--mobile\">\n          <a\n            href={`tel:${phone}`}\n            className=\"link--inline link--icon-left certification-card__phone\"\n            data-layer={createDataLayerString([\n              {\n                event_category: 'find a contractor',\n                event_action: 'call us click phone number',\n                event_label: '',\n                event: 'call_us_phone_number_click',\n                event_attributes: {\n                  contractor_id: contractorId,\n                  contractor_name: contractorName,\n                  contractor_certificates_count: certifications?.length || 0,\n                  contractor_rating: contractorRating,\n                  contractor_reviews_count: contractorReviews,\n                  contractor_type: contractorType,\n                  contractor_certificate_name: certifications?.[0] || null\n                }\n              }\n            ])}\n          >\n            <span className=\"sr-only\">Phone Number:</span>\n            {formatPhoneNumber(phone)}\n            <svg viewBox=\"0 0 13 16\" role=\"presentation\">\n              <use xlinkHref=\"#red-phone-icon\"></use>\n            </svg>\n          </a>\n          {renderRequestAQuoteButton()}\n        </div>\n      </div>\n    </article>\n  );\n}\n\nexport default ContractorCard;\n","import {\n  buildResultTemplatesManager,\n  ResultTemplate,\n  Result,\n  SearchEngine\n} from '@coveo/headless';\nimport React from 'react';\n\nimport { headlessEngine } from '../../engine';\nimport {\n  fieldsToInclude,\n  fieldsObject,\n  certificationImages,\n  labelsObj\n} from '../../controllers/controller';\n\nimport ContractorCard from './card';\n\ntype ProjectListingResultProps = Result & {\n  UniqueId: string;\n  Uri: string;\n  solutionType: string;\n  title: string;\n  image: string;\n  imageAlt: string;\n  copy: string;\n  index: number;\n};\n\nexport const resultTemplatesManager = buildResultTemplatesManager(\n  headlessEngine as SearchEngine\n);\n\nconst ProjectListingResultTemplate: ResultTemplate = {\n  conditions: [],\n  fields: ['UniqueId', 'Uri', ...fieldsToInclude],\n  content: (result: ProjectListingResultProps) => (\n    <li key={result.UniqueId}>\n      <ContractorCard\n        index={result.index}\n        id={result.UniqueId}\n        contractorId={result.raw[fieldsObject.contractorId] as string}\n        contractorType={result.raw[fieldsObject.contractorType] as string}\n        imgSource={result.raw[fieldsObject.image] as string}\n        imgAlt={result.raw[fieldsObject.imageAlt] as string}\n        contractorDBA={result.raw[fieldsObject.contractorDBA] as string}\n        contractorName={result.raw[fieldsObject.contractorName] as string}\n        contractorRating={result.raw[fieldsObject.rating] as number}\n        contractorReviews={result.raw[fieldsObject.range] as number}\n        city={result.raw[fieldsObject.city] as string}\n        stateAbbreviation={result.raw[fieldsObject.state] as string}\n        distance={result.raw[fieldsObject.distanceInMiles] as string}\n        certificationsLabel={labelsObj.certificationsCardLabel}\n        certifications={result.raw[fieldsObject.certifications] as string[]}\n        moreCertificationsLabel={labelsObj.moreCertificationsLabel}\n        viewAllCertificationsLabel={labelsObj.viewAllCertificationsLabel}\n        certificationImages={certificationImages}\n        quoteLabel={labelsObj.requestAQuoteLabel}\n        phone={result.raw[fieldsObject.phone] as string}\n        link={result.raw[fieldsObject.link] as string}\n        countryCode={result.raw[fieldsObject.countryCode] as string}\n        isLead={result.raw[fieldsObject.isLead] as number}\n        result={result}\n      />\n    </li>\n  )\n};\n\nresultTemplatesManager.registerTemplates(ProjectListingResultTemplate);\n","import React, { useId, useState, useRef, useEffect, useContext } from 'react';\nimport { GeolocationType } from '../../../helpers/global-storage';\nimport { ExtendedWindowType, headlessEngine } from '../../engine';\nimport {\n  loadAdvancedSearchQueryActions,\n  loadSearchActions,\n  loadSearchAnalyticsActions,\n  loadContextActions,\n  ContextPayload,\n  SearchEngine\n} from '@coveo/headless';\nimport { fieldsObject, labelsObj } from '../../controllers/controller';\nimport ZipForm from '../../../react-components/zip-form';\nimport { COVEO_PAGINATION_EVENTS } from '../../components/pagination';\nimport {\n  getUrlParamValue,\n  setUrlParamValue\n} from '../../../helpers/queryString';\nimport {\n  getLatLongFromZip,\n  updateGeolocationDataProperties\n} from '../../../helpers/geolocation';\nimport { MASTHEAD_ZIP_FORM_EVENTS } from '../../../react-components/contractor-locator-listing/helpers';\nimport { getAdvancedQueryParts } from '../../../helpers/transform';\nimport SecondCall from '../../components/second-call-context';\n\nexport const DISTANCE_PLACEHOLDERS = Object.freeze({\n  zipCode: '{{zipCode}}',\n  country: '{{country}}'\n});\n\ntype zipRegexProps = {\n  [key: string]: string;\n};\n\ntype DistanceProps = {\n  title: string;\n  invalidZipMessage: string;\n  endpoint: string;\n  redirectUrl: string;\n  latitudeField: string;\n  longitudeField: string;\n  values: {\n    value: number;\n    label: string;\n    default: string;\n  }[];\n  autofill: boolean;\n  withQueryParams: boolean;\n  shouldRedirect?: boolean;\n  redirect?: string;\n};\n\nconst { dataset } = document.getElementsByClassName(\n  'coveo-listing__data-wrapper'\n)[0] as HTMLElement;\n\nconst geolocation = JSON.parse(\n  dataset.geolocation as string\n) as GeolocationType;\n\nconst zipRegex = dataset.zipRegex\n  ? JSON.parse(dataset.zipRegex)\n  : ({} as zipRegexProps);\n\nconst distanceObj = dataset.distance\n  ? (JSON.parse(dataset.distance) as DistanceProps)\n  : ({} as DistanceProps);\n\nconst advancedQuerySearchActionCreator = loadAdvancedSearchQueryActions(\n  headlessEngine as SearchEngine\n);\n\ntype defaultCountryValueProps = {\n  defaultCountryValue: string;\n  shouldSearch?: boolean;\n};\n\nfunction DistanceFacet({\n  defaultCountryValue,\n  shouldSearch\n}: defaultCountryValueProps) {\n  const id = useId();\n  const zipPlaceholders = {\n    us: labelsObj.usZipPlaceholder,\n    usValue: labelsObj.usValue,\n    ca: labelsObj.caZipPlaceholder,\n    caValue: labelsObj.caValue\n  };\n\n  const distanceFromUrl = getUrlParamValue('distance');\n\n  const defaultDistanceValue =\n    distanceFromUrl || distanceObj.values.find(value => value.default)?.value;\n\n  const distanceRef = useRef<HTMLSelectElement>(null);\n\n  const [zip, setZip] = useState('');\n  const [country, setCountry] = useState('');\n  const [isReady, setIsReady] = useState(false);\n  const [latLong, setLatLong] = useState<{\n    latitude?: number;\n    longitude?: number;\n  }>({});\n  const [shouldFirstSearch, setShouldFirstSearch] = useState(true);\n  const secondCallContext = useContext(SecondCall);\n\n  const executeDistanceFilter = () => {\n    //Add distance and country to advanced query.\n    const distance = distanceRef.current?.value;\n    let newQuery = '';\n    if (!distance) return;\n\n    const previousQuery = (headlessEngine as SearchEngine).state\n      .advancedSearchQueries?.aq;\n    const countryOpt = country.includes('ca')\n      ? labelsObj.caValue\n      : labelsObj.usValue;\n\n    if (previousQuery) {\n      const parts = getAdvancedQueryParts(previousQuery);\n\n      const newParts = parts.map(part => {\n        if (part.includes(`@${fieldsObject.distanceInMiles}`)) {\n          part = `@${fieldsObject.distanceInMiles} <= ${distance}`;\n          return part.trim();\n        }\n        if (part.includes(`@${fieldsObject.countryCode}`)) {\n          part = `@${fieldsObject.countryCode} = ${countryOpt}`;\n          return part.trim();\n        }\n\n        return part.trim();\n      });\n\n      newQuery = newParts.join(' ');\n\n      if (!newQuery.includes(`@${fieldsObject.distanceInMiles}`) && distance) {\n        newQuery = `${previousQuery} AND @${fieldsObject.distanceInMiles} <= ${distance}`;\n      }\n\n      if (!newQuery.includes(`@${fieldsObject.countryCode}`) && countryOpt) {\n        newQuery = `${newQuery} AND @${fieldsObject.countryCode} = ${countryOpt}`;\n      }\n    } else {\n      newQuery = ` @${fieldsObject.distanceInMiles} <= ${distance} AND @${fieldsObject.countryCode} = ${countryOpt}`;\n    }\n\n    (headlessEngine as SearchEngine)?.dispatch(\n      advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n        aq: newQuery\n      })\n    );\n\n    const { logInterfaceLoad, logInterfaceChange } = loadSearchAnalyticsActions(\n      headlessEngine as SearchEngine\n    );\n    const { executeSearch } = loadSearchActions(headlessEngine as SearchEngine);\n\n    if (shouldFirstSearch && shouldSearch) {\n      (headlessEngine as SearchEngine).dispatch(\n        executeSearch(logInterfaceLoad())\n      );\n      setShouldFirstSearch(false);\n    } else if (!shouldFirstSearch) {\n      (headlessEngine as SearchEngine).dispatch(\n        executeSearch(logInterfaceChange())\n      );\n    }\n\n    setUrlParamValue('distance', distance || '');\n  };\n\n  const initZipValue = async () => {\n    setCountry(geolocation.country);\n    setZip(geolocation.zip);\n    setLatLong({\n      latitude: geolocation.latitude,\n      longitude: geolocation.longitude\n    });\n\n    setTimeout(() => {\n      window.dispatchEvent(new Event(MASTHEAD_ZIP_FORM_EVENTS.ready));\n      setIsReady(true);\n    }, 100);\n  };\n\n  const updateDistanceQuery = () => {\n    const { latitude, longitude } = latLong;\n\n    if (latitude && longitude) {\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(@${distanceObj.latitudeField}, @${distanceObj.longitudeField}, ${latitude}, ${longitude})*0.000621371`\n          }\n        ];\n        return JSON.stringify(newBody);\n      };\n      executeDistanceFilter();\n    }\n  };\n\n  useEffect(() => {\n    window.addEventListener('zipFormSubmit', () => {\n      setIsReady(true);\n    });\n    initZipValue();\n  }, []);\n\n  useEffect(() => {\n    if (latLong.latitude && latLong.longitude) {\n      updateDistanceQuery();\n    }\n  }, [latLong]);\n\n  const handleFormSubmit = async (zip: string, country: string) => {\n    const latLong = await getLatLongFromZip(zip, country);\n    updateGeolocationDataProperties({\n      latitude: latLong.latitude,\n      longitude: latLong.longitude,\n      zip,\n      country\n    });\n\n    if (distanceObj.redirectUrl && zip && country) {\n      window.location.href = distanceObj.redirectUrl\n        .replace(DISTANCE_PLACEHOLDERS.zipCode, zip)\n        .replace(DISTANCE_PLACEHOLDERS.country, country);\n    }\n  };\n\n  const handleDistanceChange = () => {\n    window.dispatchEvent(new Event(COVEO_PAGINATION_EVENTS.reset));\n    if (secondCallContext.originalContext !== undefined) {\n      const { setContext } = loadContextActions(headlessEngine as SearchEngine);\n      headlessEngine?.dispatch(\n        setContext({\n          sortingStrategy: secondCallContext.originalContext\n        } as ContextPayload)\n      );\n    }\n    executeDistanceFilter();\n\n    const global = window as ExtendedWindowType;\n\n    global.dataLayer?.push({\n      event: 'contractor_distance_filter_selected',\n      event_category: 'find a contractor',\n      event_action: 'distance filter',\n      event_label: `user selected | ${distanceRef.current?.value} mi`,\n      event_attributes: {\n        zip_code: zip\n      }\n    });\n  };\n\n  return (\n    <section\n      className=\"distance-facet\"\n      aria-labelledby={`distance-facet-heading${id}`}\n    >\n      <h2\n        id={`distance-facet-heading${id}`}\n        className=\"distance-facet__heading\"\n      >\n        {distanceObj.title}\n      </h2>\n      {isReady && (\n        <ZipForm\n          zipPlaceholders={zipPlaceholders}\n          defaultCountryValue={\n            country || defaultCountryValue?.toLowerCase() || 'us'\n          }\n          defaultZipValue={zip}\n          invalidZipMessage={distanceObj.invalidZipMessage}\n          zipRegex={zipRegex}\n          onSubmit={handleFormSubmit}\n        />\n      )}\n      <div className=\"field field--select distance-facet__distance\">\n        <label htmlFor={`select-distance${id}`} className=\"field__label\">\n          Distance\n        </label>\n        <select\n          ref={distanceRef}\n          defaultValue={defaultDistanceValue}\n          name={`select-distance${id}`}\n          id={`select-distance${id}`}\n          className=\"field__select\"\n          onChange={handleDistanceChange}\n        >\n          {distanceObj.values.map((value, index) => (\n            <option key={index} value={value.value}>\n              {value.label}\n            </option>\n          ))}\n        </select>\n      </div>\n    </section>\n  );\n}\n\nexport default DistanceFacet;\n","import React, { useRef, useEffect, useState } from 'react';\nimport {\n  Result,\n  ResultList as ResultListType,\n  SearchEngine,\n  buildFacet,\n  buildNumericFacet,\n  buildNumericRange,\n  ContextPayload,\n  loadAdvancedSearchQueryActions,\n  loadContextActions,\n  loadSearchActions,\n  loadSearchAnalyticsActions,\n  BreadcrumbManager\n} from '@coveo/headless';\nimport { ExtendedWindowType, headlessEngine } from '../../engine';\nimport ResultList from '../../components/result-list';\nimport { resultTemplatesManager } from './templates';\nimport Pagination from '../../components/pagination';\nimport { Sort } from '../../components/sort';\nimport { sortFields } from '../../controllers/sort-criteria';\nimport QuerySummary from '../../components/query-summary';\nimport FacetBreadcrumbs from '../../components/facet-breadcrumbs';\nimport {\n  facets,\n  labelsObj,\n  resultList,\n  fieldsObject,\n  defaultQuery,\n  facetBreadcrumb,\n  resultsPerPage\n} from '../../controllers/controller';\nimport Facet from '../../components/facet';\nimport DistanceFacet, { DISTANCE_PLACEHOLDERS } from './distance-facet';\nimport { getAdvancedQueryParts } from '../../../helpers/transform';\nimport MobileFilters from '../../components/mobile-filters';\nimport { bindUrlManager } from '../../components/url-manager';\nimport ToggleSwitch from '../../../react-components/toggle-switch';\nimport { getStoredGeolocationCountryAndZip } from '../../../helpers/geolocation';\nimport SecondCall from '../../components/second-call-context';\nimport { dispatchPersonaViewEvent } from '../../../helpers/personalize';\n\nconst facetsObj = facets.map(facet => {\n  if (!facet.range) {\n    return {\n      title: facet.title,\n      certificationsLabel: facet.certificationsLabel,\n      controller: buildFacet(headlessEngine as SearchEngine, {\n        options: {\n          field: facet.field,\n          filterFacetCount: true,\n          numberOfValues: 999\n        }\n      }),\n      customOrder: facet.customOrder\n    };\n  } else {\n    return {\n      title: facet.title,\n      rangeLabels:\n        facet.sortCriteria === 'ascending'\n          ? facet.rangeLabels\n          : facet.rangeLabels?.reverse(),\n      rangeStars: facet.rangeStars,\n      controller: buildNumericFacet(headlessEngine as SearchEngine, {\n        options: {\n          field: facet.field,\n          generateAutomaticRanges: false,\n          sortCriteria: facet.sortCriteria ? facet.sortCriteria : 'ascending',\n          currentValues: facet.rangeValues?.map(value =>\n            buildNumericRange({\n              start: value.start,\n              end: value.end,\n              endInclusive: value.endInclusive\n            })\n          )\n        }\n      })\n    };\n  }\n});\n\ntype CityListingProps = {\n  labels: string;\n  switchFacet: string;\n  renderFacets: string;\n  defaultCountryValue: string;\n  limitSecondCall: string;\n};\n\ntype SwitchFacetProps = {\n  field: string;\n  redirectUrl: string;\n  values: Array<{ value: string; label: string; default: boolean }>;\n};\n\ntype SchemaItem = {\n  '@type': string;\n  position: number;\n  item: {\n    '@type': string;\n    name: string;\n    url: string;\n    logo: string;\n    contactPoint: {\n      '@type': string;\n      telephone: string;\n      contactType: string;\n      areaServed: string;\n    };\n  };\n};\n\nconst advancedQuerySearchActionCreator = loadAdvancedSearchQueryActions(\n  headlessEngine as SearchEngine\n);\n\nfunction CityListing({\n  switchFacet,\n  renderFacets,\n  defaultCountryValue,\n  limitSecondCall\n}: CityListingProps) {\n  const switchFacetObj = JSON.parse(switchFacet) as SwitchFacetProps;\n  const defaultSwitchValue = switchFacetObj.values.find(value => value.default);\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const moduleRef = useRef<HTMLDivElement | null>(null);\n  const [resultsState, setResultsState] = useState(\n    (resultList as ResultListType).state\n  );\n\n  const [breadcrumbsState, setBreadcrumbsState] = useState(\n    (facetBreadcrumb as BreadcrumbManager).state\n  );\n\n  const [secondCall, setSecondCall] = useState(false);\n\n  const [originalResults, setOriginalResults] = useState<Result[]>([]);\n  const [filteredResults, setFilteredResults] = useState<Result[]>([]);\n  const [originalContext, setOriginalContext] = useState<undefined | string>(\n    undefined\n  );\n  const [selectedPage, setSelectedPage] = useState<number>(1);\n  const [selectedFacets, setSelectedFacets] = useState<\n    {\n      facetId: string;\n      value: string | { start: number; end: number };\n    }[]\n  >([]);\n  const [promoCards, setPromoCards] = useState('');\n\n  useEffect(() => {\n    dispatchPersonaViewEvent();\n    if (!secondCall) return;\n    setFilteredResults(() => {\n      const facets = selectedFacets;\n      let newFilteredResults = originalResults;\n      facets.forEach(\n        (facet: {\n          facetId: string;\n          value: string | { start: number; end: number };\n        }) => {\n          newFilteredResults = newFilteredResults.filter((result: Result) => {\n            if (\n              result.raw[facet.facetId] &&\n              Array.isArray(result.raw[facet.facetId])\n            ) {\n              return (result.raw[facet.facetId] as string[]).includes(\n                facet.value as string\n              );\n            } else {\n              return (\n                (result.raw[facet.facetId] as number) >=\n                  (facet.value as { start: number; end: number }).start &&\n                (result.raw[facet.facetId] as number) <=\n                  (facet.value as { start: number; end: number }).end\n              );\n            }\n          });\n        }\n      );\n\n      return newFilteredResults;\n    });\n  }, [selectedFacets, originalResults]);\n\n  useEffect(() => {\n    if (headlessEngine) {\n      bindUrlManager(headlessEngine);\n\n      (resultList as ResultListType).subscribe(() => {\n        setResultsState((resultList as ResultListType).state);\n      });\n      (facetBreadcrumb as BreadcrumbManager).subscribe(() =>\n        setBreadcrumbsState((facetBreadcrumb as BreadcrumbManager).state)\n      );\n\n      if (defaultQuery) {\n        const advancedQuerySearchActionCreator =\n          loadAdvancedSearchQueryActions(headlessEngine);\n\n        headlessEngine?.dispatch(\n          advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n            aq: defaultQuery\n          })\n        );\n      }\n    }\n\n    let observer: MutationObserver;\n\n    const targetNode = document.querySelector('.coveo-listing__promo-cards');\n\n    if (targetNode) {\n      const targetInnerHtml = targetNode.innerHTML;\n\n      setPromoCards(targetInnerHtml);\n\n      const config = { attributes: true, childList: true, subtree: true };\n\n      const callback = (mutationList: MutationRecord[]) => {\n        for (const mutation of mutationList) {\n          if (mutation.type === 'childList') {\n            setPromoCards(targetNode.innerHTML);\n          }\n        }\n      };\n\n      observer = new MutationObserver(callback);\n      observer.observe(targetNode, config);\n    }\n\n    return () => {\n      if (observer) observer.disconnect();\n    };\n  }, []);\n\n  const initAdvancedQuery = (value: string) => {\n    let newQuery = '';\n    const previousQuery = (headlessEngine as SearchEngine).state\n      .advancedSearchQueries?.aq;\n\n    if (previousQuery) {\n      const parts = getAdvancedQueryParts(previousQuery);\n      let newParts = parts.map(part => {\n        if (part.includes(`@${switchFacetObj.field}`)) {\n          part = `@${switchFacetObj.field} = ${value}`;\n          return part.trim();\n        }\n\n        return part.trim();\n      });\n\n      newParts = newParts.filter((part, index) => {\n        const nextPart = newParts[index + 1]\n          ? newParts[index + 1].trim()\n          : undefined;\n        return !(part === 'AND' && (nextPart === '' || nextPart === undefined));\n      });\n\n      newQuery = newParts.join(' ');\n    } else {\n      newQuery = `@${switchFacetObj.field.trim()} = ${value.trim()}`;\n    }\n\n    newQuery.toString();\n    if (switchFacetObj.values.length > 0) {\n      (headlessEngine as SearchEngine)?.dispatch(\n        advancedQuerySearchActionCreator.registerAdvancedSearchQueries({\n          aq: newQuery\n        })\n      );\n    }\n  };\n\n  useEffect(() => {\n    if (defaultSwitchValue) {\n      initAdvancedQuery(defaultSwitchValue.value);\n    }\n  }, []);\n\n  const handleSwitchChange = () => {\n    if (moduleRef.current) {\n      const zipValue = moduleRef.current.querySelector<HTMLInputElement>(\n        '.zip-form__zip-input'\n      )?.value;\n      const countryValue = moduleRef.current.querySelector<HTMLSelectElement>(\n        '.zip-form__country-select'\n      )?.value;\n\n      const url = switchFacetObj.redirectUrl\n        .replace(DISTANCE_PLACEHOLDERS.zipCode, zipValue || '')\n        .replace(DISTANCE_PLACEHOLDERS.country, countryValue || '');\n\n      window.location.href = url;\n    }\n  };\n\n  const renderFilters = (isMobile?: boolean) => {\n    return (\n      <div className=\"contractor-listing__facets\">\n        {facetsObj.map((facet, index) => (\n          <Facet\n            key={`${index}-${facet.title}`}\n            controller={facet.controller}\n            title={facet.title}\n            certificationsLabel={facet.certificationsLabel}\n            customOrder={facet.customOrder}\n            defaultExpanded={isMobile ? false : true}\n            rangeLabels={facet.rangeLabels}\n            rangeStarLabels={facet.rangeStars}\n          />\n        ))}\n      </div>\n    );\n  };\n\n  const generateItemList = (results: Result[]) => {\n    const resultList: SchemaItem[] = [];\n\n    results.forEach((result, index) => {\n      resultList.push({\n        '@type': 'ListItem',\n        position: index + 1,\n        item: {\n          '@type': 'Organization',\n          name: result.raw[fieldsObject.contractorName] as string,\n          url: result.raw[fieldsObject.link] as string,\n          logo: result.raw[fieldsObject.image] as string,\n          contactPoint: {\n            '@type': 'ContactPoint',\n            telephone: result.raw[fieldsObject.phone] as string,\n            contactType: 'sales',\n            areaServed: result.raw[fieldsObject.areaServed] as string\n          }\n        }\n      });\n    });\n\n    return resultList;\n  };\n\n  const checkSecondCall = () => {\n    if (breadcrumbsState.hasBreadcrumbs) return;\n\n    const totalResults = headlessEngine?.state.pagination?.totalCountFiltered;\n    if (totalResults === undefined) return;\n\n    const selectedSort = sortFields.find(\n      (sort: {\n        title: string;\n        criterion: { by: string; field: string; order: string };\n      }) => {\n        const headlessEng = headlessEngine as SearchEngine;\n        if (\n          !headlessEng ||\n          !headlessEng.state ||\n          !headlessEng.state.sortCriteria\n        )\n          return;\n        if (sort.criterion.by === 'relevancy') {\n          if (headlessEng?.state.sortCriteria === 'relevancy') {\n            return true;\n          }\n        } else if (sort.criterion.by === 'field') {\n          if (\n            headlessEng?.state?.sortCriteria.includes(sort.criterion.field) &&\n            headlessEng?.state?.sortCriteria.includes(sort.criterion.order)\n          ) {\n            return true;\n          }\n        }\n        return false;\n      }\n    );\n\n    const actualContext = (headlessEngine as SearchEngine).state.context\n      ?.contextValues.sortingStrategy;\n\n    if (selectedSort && selectedSort?.context?.secondaryThreshold > 0) {\n      if (\n        selectedSort.context.secondarySortingStrategy &&\n        actualContext &&\n        actualContext !== selectedSort.context.secondarySortingStrategy &&\n        totalResults < selectedSort.context.secondaryThreshold &&\n        !secondCall\n      ) {\n        const { setContext } = loadContextActions(\n          headlessEngine as SearchEngine\n        );\n        setOriginalContext(selectedSort.context.sortingStrategy);\n        resultsPerPage?.set(parseInt(limitSecondCall) || 20);\n        headlessEngine?.dispatch(\n          setContext({\n            sortingStrategy: selectedSort.context.secondarySortingStrategy\n          } as ContextPayload)\n        );\n        const { executeSearch } = loadSearchActions(\n          headlessEngine as SearchEngine\n        );\n        const { logInterfaceChange } = loadSearchAnalyticsActions(\n          headlessEngine as SearchEngine\n        );\n        headlessEngine?.dispatch(executeSearch(logInterfaceChange()));\n        setSecondCall(true);\n      } else if (\n        actualContext === selectedSort.context.secondarySortingStrategy\n      ) {\n        setSecondCall(true);\n        setOriginalResults(resultsState.results);\n        setFilteredResults(resultsState.results);\n      } else {\n        setSecondCall(false);\n      }\n    }\n  };\n\n  useEffect(() => {\n    if (\n      resultsState.firstSearchExecuted &&\n      resultsState.searchResponseId &&\n      !resultsState.isLoading\n    ) {\n      checkSecondCall();\n      const results = resultsState.results;\n\n      const jsonldScript = document.createElement('script');\n      jsonldScript.setAttribute('type', 'application/ld+json');\n\n      const structuredData = {\n        '@context': 'https://schema.org',\n        '@type': 'ItemList',\n        name: labelsObj.listName,\n        description: labelsObj.listDescription,\n        url: window.location.href,\n        itemListElement: generateItemList(results)\n      };\n\n      const jsonldScripts = document.querySelectorAll(\n        'script[type=\"application/ld+json\"]'\n      );\n\n      jsonldScripts.forEach(script => {\n        if (script.textContent?.includes(`\"@type\":\"ItemList\"`)) script.remove();\n      });\n\n      jsonldScript.textContent = JSON.stringify(structuredData);\n      document.head.appendChild(jsonldScript);\n    }\n\n    if (resultsState.firstSearchExecuted && !resultsState.isLoading) {\n      const searchParams = new URLSearchParams(window.location.search);\n      const storedData = getStoredGeolocationCountryAndZip();\n      (window as ExtendedWindowType).dataLayer.push({\n        event_attributes: {\n          sort_by: getSortFieldLabel(),\n          zip_code: searchParams.get(DISTANCE_PLACEHOLDERS.zipCode)\n            ? searchParams.get(DISTANCE_PLACEHOLDERS.zipCode)\n            : storedData?.zip,\n          zip_code_country: searchParams.get(DISTANCE_PLACEHOLDERS.country)\n            ? searchParams.get(DISTANCE_PLACEHOLDERS.country)\n            : storedData?.country,\n          distance_filter: searchParams.get('distance'),\n          business_type: moduleRef.current?.querySelector(\n            '.toggle-switch__button.active'\n          )?.textContent\n        },\n        event: 'results_viewed',\n        event_category: 'results page viewed',\n        event_action: 'contractor locator',\n        event_label: resultsState.hasResults ? 'success' : 'failure'\n      });\n    }\n  }, [resultsState]);\n\n  const getSortFieldLabel = () => {\n    return sortFields.find(\n      (field: { criterion: { field: string; order: string; by: string } }) => {\n        if (headlessEngine?.state.sortCriteria === 'relevancy') {\n          return field.criterion.by === 'relevancy';\n        }\n        return (\n          headlessEngine?.state?.sortCriteria?.includes(\n            field.criterion.field\n          ) &&\n          headlessEngine?.state?.sortCriteria?.includes(field.criterion.order)\n        );\n      }\n    ).title;\n  };\n\n  const handleClickResult = (e: React.MouseEvent) => {\n    if (\n      (\n        (e.target as HTMLElement)?.parentNode as HTMLElement\n      )?.classList.contains('certification-card__image') ||\n      (\n        (e.target as HTMLElement)?.parentNode as HTMLElement\n      )?.classList.contains('link--inline')\n    ) {\n      const searchParams = new URLSearchParams(window.location.search);\n      const storedData = getStoredGeolocationCountryAndZip();\n      (window as ExtendedWindowType).dataLayer.push({\n        event_attributes: {\n          sort_by: getSortFieldLabel(),\n          zip_code: searchParams.get(DISTANCE_PLACEHOLDERS.zipCode)\n            ? searchParams.get(DISTANCE_PLACEHOLDERS.zipCode)\n            : storedData?.zip,\n          zip_code_country: searchParams.get(DISTANCE_PLACEHOLDERS.country)\n            ? searchParams.get(DISTANCE_PLACEHOLDERS.country)\n            : storedData?.country,\n          distance_filter: searchParams.get('distance'),\n          business_type: moduleRef.current?.querySelector(\n            '.toggle-switch__button.active'\n          )?.textContent\n        },\n        event: 'result_click',\n        event_category: 'result click',\n        event_action: 'contractor locator'\n      });\n    }\n  };\n\n  return (\n    <SecondCall.Provider\n      value={{\n        secondCall,\n        limitValue: parseInt(limitSecondCall),\n        originalContext,\n        setOriginalContext,\n        originalResults,\n        filteredResults,\n        setFilteredResults,\n        selectedPage,\n        setSelectedPage,\n        selectedFacets,\n        setSelectedFacets\n      }}\n    >\n      <div className=\"contractor-listing__wrapper row\" ref={moduleRef}>\n        <div className=\"contractor-listing__left-wrapper\">\n          <DistanceFacet\n            defaultCountryValue={defaultCountryValue}\n            shouldSearch={true}\n          />\n          <ToggleSwitch\n            onValueChange={handleSwitchChange}\n            values={switchFacetObj.values}\n            defaultValue={defaultSwitchValue?.value}\n          />\n          <div\n            className=\"contractor-listing__mobile-filters\"\n            ref={containerRef}\n          >\n            {renderFacets !== 'false' && (\n              <MobileFilters\n                label={labelsObj.mobileFilterBy}\n                containerRef={containerRef}\n                refinementLayer={true}\n              >\n                {renderFilters(true)}\n              </MobileFilters>\n            )}\n          </div>\n          <div className=\"contractor-listing__desktop-filters\">\n            {renderFacets !== 'false' && renderFilters()}\n          </div>\n          <div\n            className=\"contractor-listing__promo-cards contractor-listing__promo-cards--desktop\"\n            dangerouslySetInnerHTML={{ __html: promoCards }}\n          />\n        </div>\n        <div\n          className=\"contractor-listing__right-wrapper\"\n          onMouseDown={handleClickResult}\n        >\n          <div className=\"contractor-listing__history-wrapper\">\n            <div className=\"contractor-listing__summary\">\n              <QuerySummary />\n              <FacetBreadcrumbs\n                clearLabel={labelsObj.clearAll}\n                extraClasses=\"contractor-listing__breadcrumbs--mobile\"\n              />\n            </div>\n            <Sort\n              sortByLabel={labelsObj.sortBy}\n              extraClasses={`contractor-listing__sort ${\n                sortFields.length === 1 ? 'disabled' : ''\n              }`}\n            />\n          </div>\n          <FacetBreadcrumbs\n            clearLabel={labelsObj.clearAll}\n            extraClasses=\"contractor-listing__breadcrumbs--desktop\"\n          />\n          <ResultList\n            controller={resultList as ResultListType}\n            className=\"contractor-listing__results\"\n            resultTemplatesManager={resultTemplatesManager}\n            preventFirstCall={true}\n          />\n          <Pagination />\n          <div\n            className=\"contractor-listing__promo-cards contractor-listing__promo-cards--mobile\"\n            dangerouslySetInnerHTML={{ __html: promoCards }}\n          />\n        </div>\n      </div>\n    </SecondCall.Provider>\n  );\n}\n\nexport default CityListing;\n"],"names":["ContractorCard","index","imgSource","imgAlt","contractorId","contractorType","contractorDBA","contractorName","contractorRating","contractorReviews","city","stateAbbreviation","distance","certificationsLabel","certifications","moreCertificationsLabel","viewAllCertificationsLabel","certificationImages","quoteLabel","phone","link","countryCode","isLead","result","modal","modalCloseButton","handleClick","options","el","disableBodyScroll","_a","handleClose","clearAllBodyScrollLocks","handleRequestAQuote","modalContractorInfo","openRequestAQuoteModal","useEffect","e","isInDialog","renderCertifications","React","createDataLayerString","certification","item","renderRequestAQuoteButton","ResultLink","RatingStars","formatPhoneNumber","resultTemplatesManager","buildResultTemplatesManager","headlessEngine","ProjectListingResultTemplate","fieldsToInclude","fieldsObject","labelsObj","DISTANCE_PLACEHOLDERS","dataset","geolocation","zipRegex","distanceObj","advancedQuerySearchActionCreator","loadAdvancedSearchQueryActions","DistanceFacet","defaultCountryValue","shouldSearch","id","useId","zipPlaceholders","defaultDistanceValue","getUrlParamValue","value","distanceRef","useRef","zip","setZip","useState","country","setCountry","isReady","setIsReady","latLong","setLatLong","shouldFirstSearch","setShouldFirstSearch","secondCallContext","useContext","SecondCall","executeDistanceFilter","newQuery","previousQuery","_b","countryOpt","getAdvancedQueryParts","part","_c","logInterfaceLoad","logInterfaceChange","loadSearchAnalyticsActions","executeSearch","loadSearchActions","setUrlParamValue","initZipValue","MASTHEAD_ZIP_FORM_EVENTS","updateDistanceQuery","latitude","longitude","global","body","newBody","handleFormSubmit","getLatLongFromZip","updateGeolocationDataProperties","handleDistanceChange","COVEO_PAGINATION_EVENTS","setContext","loadContextActions","ZipForm","facetsObj","facets","facet","buildNumericFacet","buildNumericRange","buildFacet","CityListing","switchFacet","renderFacets","limitSecondCall","switchFacetObj","defaultSwitchValue","containerRef","moduleRef","resultsState","setResultsState","resultList","breadcrumbsState","setBreadcrumbsState","facetBreadcrumb","secondCall","setSecondCall","originalResults","setOriginalResults","filteredResults","setFilteredResults","originalContext","setOriginalContext","selectedPage","setSelectedPage","selectedFacets","setSelectedFacets","promoCards","setPromoCards","dispatchPersonaViewEvent","newFilteredResults","bindUrlManager","defaultQuery","observer","targetNode","targetInnerHtml","config","callback","mutationList","mutation","initAdvancedQuery","newParts","nextPart","handleSwitchChange","zipValue","countryValue","url","renderFilters","isMobile","Facet","generateItemList","results","checkSecondCall","totalResults","selectedSort","sortFields","sort","headlessEng","actualContext","_d","_e","resultsPerPage","_f","_g","jsonldScript","structuredData","script","searchParams","storedData","getStoredGeolocationCountryAndZip","getSortFieldLabel","field","handleClickResult","ToggleSwitch","MobileFilters","QuerySummary","FacetBreadcrumbs","Sort","ResultList","Pagination"],"mappings":"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"}