{"version":3,"mappings":"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","names":["DocumentsCart","cartLabel","downloadLabel","shareLabel","clearLabel","removeLabel","zipFileName","shareUrl","id","useId","urlDocuments","getUrlParamValue","links","secureStorage","DOCUMENT_LINKS_STORAGE_KEY","linksArray","expanded","setExpanded","useState","documents","setDocuments","focusTrap","setFocusTrap","jsZipModule","setJsZipModule","panelRef","useRef","moduleRef","handleTriggerClick","module","updateDocuments","useEffect","DOCUMENT_LISTING_EVENTS","options","el","trap","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","urlDocumentsArray","decodeUri","handleRemove","event","parent","title","extension","indexToRemove","item","newLinksArray","handleClearAll","handleDownload","button","handleShare","mailText","text","error","React","index","createDataLayerString"],"sources":["../../../../src/scripts/react-components/document-cart/index.tsx"],"sourcesContent":["import React, { useState, useRef, useId, useEffect } from 'react';\nimport {\n  DOCUMENT_LISTING_EVENTS,\n  DOCUMENT_LINKS_STORAGE_KEY\n} from '../document-listing/constants';\nimport { FocusTrap, createFocusTrap } from 'focus-trap';\nimport {\n  disableBodyScroll,\n  clearAllBodyScrollLocks,\n  BodyScrollOptions\n} from 'body-scroll-lock';\nimport { decodeUri, getUrlParamValue } from '../../helpers/queryString';\nimport { createDataLayerString } from '../../helpers/helpers';\nimport { secureStorage } from '../../helpers/global-storage';\nimport { ExtendedWindowType } from '../../helpers/global-types';\n\ntype Document = {\n  url: string;\n  extension: string;\n  title: string;\n  type: string;\n};\n\ntype DocumentsCartProps = {\n  cartLabel: string;\n  downloadLabel: string;\n  shareLabel: string;\n  clearLabel: string;\n  removeLabel: string;\n  zipFileName: string;\n  shareUrl: string;\n};\n\nfunction DocumentsCart({\n  cartLabel,\n  downloadLabel,\n  shareLabel,\n  clearLabel,\n  removeLabel,\n  zipFileName,\n  shareUrl\n}: DocumentsCartProps) {\n  const id = useId();\n\n  const urlDocuments = getUrlParamValue('documents');\n\n  const links = secureStorage.get(DOCUMENT_LINKS_STORAGE_KEY);\n  const linksArray = links ? (JSON.parse(links) as Document[]) : [];\n\n  const [expanded, setExpanded] = useState(false);\n  const [documents, setDocuments] = useState(linksArray);\n  const [focusTrap, setFocusTrap] = useState<FocusTrap | null>(null);\n  const [jsZipModule, setJsZipModule] = useState<{\n    createAndDownloadDocumentsZip: (\n      documents: Document[],\n      zipFileName: string,\n      downloadButton?: HTMLButtonElement\n    ) => void;\n  }>();\n\n  const panelRef = useRef<HTMLDivElement>(null);\n  const moduleRef = useRef<HTMLDivElement>(null);\n\n  const handleTriggerClick = () => {\n    if (!jsZipModule) {\n      const importComponent = async () => {\n        const module = await import('../../helpers/zip');\n        setJsZipModule(module);\n      };\n\n      importComponent();\n    }\n\n    if (!expanded) {\n      focusTrap?.activate();\n    } else {\n      focusTrap?.deactivate();\n    }\n    setExpanded(!expanded);\n  };\n\n  const updateDocuments = () => {\n    const links = secureStorage.get(DOCUMENT_LINKS_STORAGE_KEY);\n    const linksArray = links ? (JSON.parse(links) as Document[]) : [];\n    setDocuments(linksArray);\n  };\n\n  useEffect(() => {\n    window.addEventListener(\n      DOCUMENT_LISTING_EVENTS.updateCart,\n      updateDocuments\n    );\n\n    if (moduleRef.current) {\n      const options = {\n        reserveScrollBarGap: true,\n        allowTouchMove: (el: HTMLElement) => {\n          return el.closest('.document-cart__panel') !== null;\n        }\n      } as BodyScrollOptions;\n\n      const trap = createFocusTrap(moduleRef.current, {\n        clickOutsideDeactivates: true,\n        returnFocusOnDeactivate: true,\n        onActivate() {\n          disableBodyScroll(document.body, options);\n          setExpanded(true);\n        },\n        onDeactivate() {\n          clearAllBodyScrollLocks();\n          setExpanded(false);\n        }\n      });\n\n      setFocusTrap(trap);\n    }\n\n    if (urlDocuments) {\n      const urlDocumentsArray = JSON.parse(\n        decodeUri(urlDocuments)\n      ) as Document[];\n\n      setDocuments(urlDocumentsArray);\n      secureStorage.set(\n        DOCUMENT_LINKS_STORAGE_KEY,\n        JSON.stringify(urlDocumentsArray)\n      );\n    }\n\n    return () => {\n      window.removeEventListener(\n        DOCUMENT_LISTING_EVENTS.updateCart,\n        updateDocuments\n      );\n    };\n  }, []);\n\n  useEffect(() => {\n    if (moduleRef.current) {\n      if (documents.length < 1) {\n        focusTrap?.deactivate();\n        setExpanded(false);\n        moduleRef.current.style.setProperty('visibility', 'hidden');\n      } else {\n        moduleRef.current.style.removeProperty('visibility');\n      }\n    }\n  }, [documents]);\n\n  const handleRemove = (\n    event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n  ) => {\n    event.preventDefault();\n\n    const target = event.target as HTMLButtonElement;\n    const parent = target.closest('.document-cart__item') as HTMLLIElement;\n    const title = parent.querySelector(\n      '.document-cart__title'\n    ) as HTMLHeadingElement;\n    const extension = parent.querySelector(\n      '.document-cart__extension'\n    ) as HTMLParagraphElement;\n\n    const links = secureStorage.get(DOCUMENT_LINKS_STORAGE_KEY);\n    const linksArray = links ? (JSON.parse(links) as Document[]) : [];\n\n    const indexToRemove = linksArray.findIndex(\n      item =>\n        item.title === title.textContent &&\n        item.extension === extension.textContent\n    );\n\n    const newLinksArray = [\n      ...linksArray.slice(0, indexToRemove),\n      ...linksArray.slice(indexToRemove + 1)\n    ];\n\n    secureStorage.set(\n      DOCUMENT_LINKS_STORAGE_KEY,\n      JSON.stringify(newLinksArray)\n    );\n\n    setDocuments(newLinksArray);\n\n    window.dispatchEvent(new CustomEvent(DOCUMENT_LISTING_EVENTS.updateItem));\n  };\n\n  const handleClearAll = () => {\n    localStorage.removeItem(DOCUMENT_LINKS_STORAGE_KEY);\n    setDocuments([]);\n    setExpanded(false);\n    window.dispatchEvent(new CustomEvent(DOCUMENT_LISTING_EVENTS.updateItem));\n  };\n\n  const handleDownload = async (\n    event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n  ) => {\n    const button = event.currentTarget;\n\n    (window as ExtendedWindowType).dataLayer.push({\n      event: 'file_downloads',\n      event_category: 'file downloads',\n      event_action: '',\n      event_label: '',\n      event_attributes: {\n        custom_file_name: zipFileName,\n        document_type: 'zip'\n      }\n    });\n\n    jsZipModule?.createAndDownloadDocumentsZip(documents, zipFileName, button);\n  };\n\n  const handleShare = () => {\n    const links = secureStorage.get(DOCUMENT_LINKS_STORAGE_KEY);\n    const linksObj = JSON.parse(links as string);\n\n    const mailText = linksObj.reduce(\n      (\n        text: string,\n        item: { title: string; extension: string; url: string }\n      ) => {\n        text += `${item.title}.${item.extension}: ${item.url}  \\n`;\n        return text;\n      },\n      ''\n    );\n\n    if (navigator.share) {\n      navigator\n        .share({\n          url: shareUrl,\n          text: mailText,\n          title: 'GAF Documents'\n        })\n        .catch(error => console.error('Error sharing', error));\n    } else {\n      console.log('Web Share API not supported.');\n    }\n  };\n\n  return (\n    <div\n      className={`document-cart__wrapper ${\n        expanded ? 'document-cart__wrapper--expanded' : ''\n      }`}\n    >\n      <div className=\"document-cart__inner\" ref={moduleRef}>\n        <button\n          className=\"document-cart__trigger\"\n          aria-expanded={expanded}\n          id={`trigger-${id}`}\n          aria-controls={`panel-${id}`}\n          onClick={handleTriggerClick}\n        >\n          <span className=\"document-cart__number\">\n            {documents.length} <span className=\"sr-only\">Documents</span>\n          </span>\n          <h2 className=\"document-cart__label\">{cartLabel}</h2>\n        </button>\n        <div\n          className=\"document-cart__panel\"\n          id={`panel-${id}`}\n          role=\"region\"\n          aria-labelledby={`trigger-${id}`}\n          aria-hidden={!expanded}\n          ref={panelRef}\n        >\n          {documents.length > 0 && (\n            <ul className=\"document-cart__list\">\n              {documents.map((item, index) => (\n                <li key={index} className=\"document-cart__item\">\n                  <div className=\"document-cart__header\">\n                    <h3 className=\"document-cart__title\">{item.title}</h3>\n                    <button\n                      data-layer={createDataLayerString([\n                        {\n                          event: 'remove_document',\n                          event_category: 'bulk downloads',\n                          event_action: 'remove document',\n                          event_attributes: {\n                            custom_file_name: item.title,\n                            custom_file_extension: item.extension,\n                            document_type: item.type,\n                            document_package_name: null\n                          }\n                        }\n                      ])}\n                      type=\"button\"\n                      className=\"document-cart__remove link--inline\"\n                      onClick={handleRemove}\n                    >\n                      {removeLabel}\n                    </button>\n                  </div>\n                  <p className=\"document-cart__info\">\n                    {item.type} |{' '}\n                    <span className=\"document-cart__extension\">\n                      {item.extension}\n                    </span>\n                  </p>\n                </li>\n              ))}\n            </ul>\n          )}\n          <div className=\"document-cart__footer\">\n            <button\n              type=\"button\"\n              className=\"btn btn--secondary document-cart__download\"\n              onClick={handleDownload}\n            >\n              {downloadLabel}\n              <svg className=\"primary\" role=\"presentation\">\n                <use xlinkHref=\"#icon-download\" />\n              </svg>\n            </button>\n            <button\n              type=\"button\"\n              className=\"btn btn--secondary document-cart__share\"\n              onClick={handleShare}\n            >\n              {shareLabel}\n              <svg className=\"primary\" role=\"presentation\">\n                <use xlinkHref=\"#icon-share\" />\n              </svg>\n            </button>\n            <button\n              type=\"button\"\n              className=\"document-cart__clear link--inline\"\n              onClick={handleClearAll}\n            >\n              {clearLabel}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default DocumentsCart;\n"],"file":"Areas/GAF/scripts/index-ca9e555d.js"}