{"version":3,"file":"index-33a628ec.js","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 JSZip from 'jszip';\nimport { downloadZip } from '../../helpers/zip';\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 '../..';\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(null);\n\n const panelRef = useRef(null);\n const moduleRef = useRef(null);\n\n const handleTriggerClick = () => {\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\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\n ) => {\n const zip = new JSZip();\n const button = event.currentTarget;\n button.disabled = true;\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 for (const file of documents) {\n if (file.url) {\n const response = await fetch(file.url);\n if (response.status === 200) {\n const blob = await response?.blob();\n if (blob) {\n zip.file(`${file.title}.${file.extension}`, blob);\n }\n }\n }\n }\n\n downloadZip(zip, 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 \n
\n \n \n {documents.length} Documents\n \n

{cartLabel}

\n \n \n {documents.length > 0 && (\n
    \n {documents.map((item, index) => (\n
  • \n
    \n

    {item.title}

    \n \n {removeLabel}\n \n
    \n

    \n {item.type} |{' '}\n \n {item.extension}\n \n

    \n
  • \n ))}\n
\n )}\n
\n \n {downloadLabel}\n \n \n \n \n \n {shareLabel}\n \n \n \n \n \n {clearLabel}\n \n
\n
\n \n \n );\n}\n\nexport default DocumentsCart;\n"],"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","panelRef","useRef","moduleRef","handleTriggerClick","updateDocuments","useEffect","DOCUMENT_LISTING_EVENTS","options","el","trap","createFocusTrap","disableBodyScroll","clearAllBodyScrollLocks","urlDocumentsArray","decodeUri","handleRemove","event","parent","title","extension","indexToRemove","item","newLinksArray","handleClearAll","handleDownload","zip","JSZip","button","file","response","blob","downloadZip","handleShare","mailText","text","error","React","index","createDataLayerString"],"mappings":"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"}