{"version":3,"file":"index-05f53555.js","sources":["../../../../src/scripts/helpers/keycodes.ts","../../../../src/scripts/coveo/components/request-a-quote-modal/index.tsx"],"sourcesContent":["export const ESCAPE = 'Escape';\n","import React, { useState, useRef, useEffect } from 'react';\n\nimport {\n  RequestAQuoteFormProps,\n  ModalProps\n} from '../../components/request-a-quote-form/types';\nimport { ESCAPE } from '../../../helpers/keycodes';\nimport RequestAQuoteForm from '../request-a-quote-form';\nimport { ExtendedWindowType } from '../../engine';\nimport { FocusTrap, createFocusTrap } from 'focus-trap';\nimport {\n  disableBodyScroll,\n  clearAllBodyScrollLocks,\n  BodyScrollOptions\n} from 'body-scroll-lock';\n\nconst ContractorRequestAForm: React.FC<RequestAQuoteFormProps> = ({\n  ...props\n}) => {\n  const [open, setOpen] = useState(false);\n  const [contractorData, setContractorData] = useState<ModalProps | null>(null);\n  const [listener, setListener] = useState(false);\n  const [focusTrap, setFocusTrap] = useState<FocusTrap | null>(null);\n  const modal = useRef(null);\n\n  const handleOpenModal = (_contractorData: ModalProps) => {\n    setContractorData(_contractorData);\n    setOpen(true);\n    const global = window as ExtendedWindowType;\n\n    global.dataLayer?.push({\n      event: 'modal_interaction',\n      event_category: 'modals',\n      event_action: 'view',\n      event_attributes: {\n        contractor_id: _contractorData?.id,\n        contractor_name: _contractorData?.contractorName,\n        contractor_certificates_count: _contractorData?.numberOfCertificates,\n        contractor_rating: _contractorData?.rating,\n        contractor_reviews_count: _contractorData?.numberOfReviews,\n        contractor_certificate_name: _contractorData?.certificateName,\n        contractor_type: _contractorData?.type\n      }\n    });\n\n    global.dataLayer?.push({\n      event: 'request_quote_form_view',\n      event_category: 'find a contractor',\n      event_action: 'request a quote form view',\n      event_attributes: {\n        contractor_id: _contractorData?.id,\n        contractor_name: _contractorData?.contractorName,\n        contractor_certificates_count: _contractorData?.numberOfCertificates,\n        contractor_rating: _contractorData?.rating,\n        contractor_reviews_count: _contractorData?.numberOfReviews,\n        contractor_certificate_name: _contractorData?.certificateName,\n        contractor_type: _contractorData?.type,\n        form_name: 'request a quote form'\n      }\n    });\n  };\n\n  useEffect(() => {\n    if (modal.current) {\n      const options = {\n        reserveScrollBarGap: true,\n        allowTouchMove: (el: HTMLElement) => {\n          return el.closest('.modal__content') !== null;\n        }\n      } as BodyScrollOptions;\n\n      const trap = createFocusTrap(modal.current, {\n        clickOutsideDeactivates: true,\n        returnFocusOnDeactivate: true,\n        onActivate() {\n          disableBodyScroll(document.body, options);\n          document.body.style.overflow = 'hidden';\n        },\n        onDeactivate() {\n          clearAllBodyScrollLocks();\n          document.body.style.removeProperty('overflow');\n        }\n      });\n\n      setFocusTrap(trap);\n\n      (modal.current as HTMLDialogElement).addEventListener('close', () => {\n        setOpen(false);\n        const global = window as ExtendedWindowType;\n\n        global.dataLayer?.push({\n          event: 'modal_interaction',\n          event_category: 'modals',\n          event_action: 'close',\n          event_attributes: {\n            contractor_id: contractorData?.id,\n            contractor_name: contractorData?.contractorName,\n            contractor_certificates_count: contractorData?.numberOfCertificates,\n            contractor_rating: contractorData?.rating,\n            contractor_reviews_count: contractorData?.numberOfReviews,\n            contractor_certificate_name: contractorData?.certificateName,\n            contractor_type: contractorData?.type\n          }\n        });\n      });\n    }\n\n    window.addEventListener('keydown', handleEsc);\n\n    if (!listener) {\n      window.addEventListener('openRequestAQuoteModal', e =>\n        handleOpenModal((e as CustomEvent).detail as ModalProps)\n      );\n      setListener(true);\n    }\n    return () => {\n      if (modal.current) {\n        (modal.current as HTMLDialogElement).removeEventListener('close', () =>\n          setOpen(false)\n        );\n      }\n\n      window.removeEventListener('keydown', handleEsc);\n\n      if (listener) {\n        window.removeEventListener('openRequestAQuoteModal', e =>\n          handleOpenModal((e as CustomEvent).detail as ModalProps)\n        );\n        setListener(false);\n      }\n    };\n  }, [modal.current]);\n\n  useEffect(() => {\n    if (modal.current) {\n      if (open) {\n        (modal.current as HTMLDialogElement).show();\n        focusTrap?.activate();\n      } else {\n        setContractorData(null);\n        focusTrap?.deactivate();\n      }\n    }\n  }, [open]);\n\n  const handleClose = (\n    e: React.MouseEvent<HTMLDivElement> | React.MouseEvent<HTMLButtonElement>\n  ) => {\n    if (\n      (e.target as Element).classList.contains('modal__backdrop') ||\n      (e.target as Element).classList.contains('modal__close-button')\n    ) {\n      if (modal.current) {\n        (window as ExtendedWindowType).dataLayer?.push({\n          event: 'request_quote_abandon',\n          event_category: 'find a contractor',\n          event_action: 'form abandoned',\n          event_attributes: {\n            contractor_id: contractorData?.id,\n            contractor_name: contractorData?.contractorName,\n            contractor_certificates_count: contractorData?.numberOfCertificates,\n            contractor_rating: contractorData?.rating,\n            contractor_reviews_count: contractorData?.numberOfReviews,\n            contractor_certificate_name: contractorData?.certificateName,\n            contractor_type: contractorData?.type,\n            form_name: 'request a quote',\n            form_type: 'contractor locator'\n          }\n        });\n        setOpen(false);\n        setContractorData(null);\n        (modal.current as HTMLDialogElement).close();\n      }\n    }\n  };\n\n  const handleEsc = (e: KeyboardEvent) => {\n    if (e.key === ESCAPE) {\n      if (modal.current) {\n        setOpen(false);\n        (modal.current as HTMLDialogElement).close();\n      }\n    }\n  };\n\n  return (\n    <div\n      className=\"modal__contractor\"\n      style={!open ? { display: 'none' } : undefined}\n    >\n      <div\n        className=\"modal__backdrop\"\n        role=\"presentation\"\n        onClick={handleClose}\n      >\n        {' '}\n      </div>\n      <dialog ref={modal} className=\"modal\">\n        <div className=\"modal__content\">\n          <button\n            className=\"modal__close-button\"\n            aria-label=\"close\"\n            title=\"close\"\n            onClick={handleClose}\n          ></button>\n          {contractorData && (\n            <RequestAQuoteForm\n              {...props}\n              modal={contractorData as ModalProps}\n            ></RequestAQuoteForm>\n          )}\n        </div>\n      </dialog>\n    </div>\n  );\n};\n\nexport default ContractorRequestAForm;\n"],"names":["ESCAPE","ContractorRequestAForm","props","open","setOpen","useState","contractorData","setContractorData","listener","setListener","focusTrap","setFocusTrap","modal","useRef","handleOpenModal","_contractorData","global","_a","_b","useEffect","options","el","trap","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","handleEsc","handleClose","React","RequestAQuoteForm"],"mappings":"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"}