{"version":3,"file":"Attachments.mjs","names":["React","useCallback","useState","apiMutate","Box","AmbientCard","DragDropFileUpload","LinearProgress","List","ListItem","IconButton","ConfigService","DownloadIcon","ChromeCloseIcon","DeleteIcon","useTranslation","useHandleAxiosSnackbar","Divider","AttachmentAction","FluentDialog","FluentIconButton","AmbientAutoComplete","removeDuplicateFiles","incomingFiles","existingFiles","uniqueFiles","duplicateFiles","forEach","newFile","exists","some","existingFile","name","fileName","push","Attachments","allowedExtensions","MAX_FILE_SIZE_MB","filePreview","setFilePreview","currentAttachments","setCurrentAttachments","attachmentTypes","attachmentType","setAttachmentType","attachmentProgress","setAttachmentProgress","previousAttachments","setPreviousAttachments","attachmentDialogOpen","setAttachmentDialogOpen","attachmentToDelete","setAttachmentToDelete","attachmentToDeleteIndex","setAttachmentToDeleteIndex","attachmentAction","setAttachmentAction","None","handleErrorSnackbar","handleSuccessSnackbar","t","initiateAttachmentAction","action","file","index","handleAttachmentDeleteClick","Delete","handleAttachmentRemoveClick","Remove","handleCloseAttachmentDialog","removeAttachmentFromList","attachments","setAttachments","prev","filter","item","i","defaultValue","deleteAttachment","filePayload","isDeleted","productV1ApiUrl","transactionAttachmentId","method","data","error","console","handleDownloadFile","response","url","link","document","createElement","href","download","body","appendChild","click","removeChild","e","handleAddFiles","files","Array","from","validFiles","invalidFiles","ext","split","pop","toLowerCase","sizeInMB","size","includes","maxSize","allExistingFiles","length","errors","join","duplicateNames","map","f","fileNames","handleAttachmentTypeSelect","renderCurrentAttachments","display","justifyContent","renderPreviousAttachments","renderConfirmationContent","isDeleteAction","option","pageList","count"],"sources":["../../src/uploader/Attachments.jsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport { apiMutate } from '../utilities';\nimport { Box } from '../UI';\nimport { AmbientCard } from '../UI/surfaces/cards/AmbientCard';\nimport { DragDropFileUpload } from './DragDropFileUpload';\nimport { LinearProgress } from '../UI';\nimport { List, ListItem, IconButton } from '@material-ui/core';\nimport { ConfigService } from '../configService/index';\nimport {\n  DownloadIcon,\n  ChromeCloseIcon,\n  DeleteIcon\n} from '@fluentui/react-icons';\nimport { useTranslation } from 'react-i18next';\nimport { useHandleAxiosSnackbar } from '../utilities';\nimport { Divider } from '@material-ui/core';\nimport { AttachmentAction } from './enums/systemEnums';\nimport { FluentDialog } from '../UI';\nimport { FluentIconButton } from '../UI/inputs/buttons';\nimport './Attachments.css';\nimport { AmbientAutoComplete } from '../UI/inputs/textField';\n\nconst removeDuplicateFiles = (incomingFiles, existingFiles) => {\n  const uniqueFiles = [];\n  const duplicateFiles = [];\n\n  incomingFiles.forEach((newFile) => {\n    const exists = existingFiles.some(\n      (existingFile) =>\n        existingFile.name === newFile.name ||\n        existingFile.fileName === newFile.name\n    );\n\n    if (exists) {\n      duplicateFiles.push(newFile);\n    } else {\n      uniqueFiles.push(newFile);\n    }\n  });\n\n  return { uniqueFiles, duplicateFiles };\n};\n\nexport const Attachments = ({\n  allowedExtensions,\n  MAX_FILE_SIZE_MB,\n  filePreview,\n  setFilePreview,\n  currentAttachments,\n  setCurrentAttachments,\n  attachmentTypes,\n  attachmentType,\n  setAttachmentType,\n  attachmentProgress,\n  setAttachmentProgress,\n  previousAttachments,\n  setPreviousAttachments\n}) => {\n  const [attachmentDialogOpen, setAttachmentDialogOpen] = useState(false);\n  const [attachmentToDelete, setAttachmentToDelete] = useState(null);\n  const [attachmentToDeleteIndex, setAttachmentToDeleteIndex] = useState(0);\n  const [attachmentAction, setAttachmentAction] = useState(\n    AttachmentAction.None\n  );\n\n  const { handleErrorSnackbar, handleSuccessSnackbar } =\n    useHandleAxiosSnackbar();\n  const { t } = useTranslation();\n\n  const initiateAttachmentAction = useCallback((action, file, index) => {\n    setAttachmentAction(action);\n    setAttachmentToDelete(file);\n    setAttachmentToDeleteIndex(index);\n    setAttachmentDialogOpen(true);\n  }, []);\n\n  const handleAttachmentDeleteClick = useCallback(\n    (file, index) => {\n      initiateAttachmentAction(AttachmentAction.Delete, file, index);\n    },\n    [initiateAttachmentAction]\n  );\n\n  const handleAttachmentRemoveClick = useCallback(\n    (file, index) => {\n      initiateAttachmentAction(AttachmentAction.Remove, file, index);\n    },\n    [initiateAttachmentAction]\n  );\n\n  const handleCloseAttachmentDialog = useCallback(() => {\n    setAttachmentAction(AttachmentAction.None);\n    setAttachmentToDelete({});\n    setAttachmentDialogOpen(false);\n  }, []);\n\n  const removeAttachmentFromList = useCallback(\n    (attachments, setAttachments) => {\n      setAttachments((prev) =>\n        prev.filter((item, i) => i !== attachmentToDeleteIndex)\n      );\n      handleSuccessSnackbar(\n        t('uploader.attachments.removedSuccess', {\n          defaultValue: 'Attachment Removed Successfully'\n        })\n      );\n      handleCloseAttachmentDialog();\n    },\n    [\n      attachmentToDeleteIndex,\n      handleSuccessSnackbar,\n      handleCloseAttachmentDialog,\n      t\n    ]\n  );\n\n  const deleteAttachment = useCallback(async () => {\n    try {\n      setAttachmentProgress(true);\n      const filePayload = { ...attachmentToDelete, isDeleted: true };\n\n      await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpTransactionAttachment/${attachmentToDelete.transactionAttachmentId}`,\n        {\n          method: 'put',\n          data: filePayload\n        }\n      );\n      removeAttachmentFromList(previousAttachments, setPreviousAttachments);\n    } catch (error) {\n      handleErrorSnackbar(\n        t('uploader.attachments.deleteFailedTitle', {\n          defaultValue: 'Failed to delete attachment'\n        }),\n        t('uploader.attachments.deleteFailedMessage', {\n          defaultValue:\n            'We encountered a system error while trying to delete the file. Please try again.'\n        })\n      );\n      console.error(error);\n    } finally {\n      setAttachmentProgress(false);\n      setAttachmentDialogOpen(false);\n    }\n  }, [\n    attachmentToDelete,\n    removeAttachmentFromList,\n    previousAttachments,\n    setPreviousAttachments,\n    setAttachmentProgress,\n    handleErrorSnackbar,\n    t\n  ]);\n\n  const handleDownloadFile = useCallback(async (file) => {\n    try {\n      const response = await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpTransactionAttachment/${file.transactionAttachmentId}/udpDriveFile/download`,\n        {}\n      );\n      const url = response.data.link;\n      const link = document.createElement('a');\n      link.href = url;\n      link.download = file.fileName ?? file.name;\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n    } catch (e) {\n      console.error('Download failed', e);\n    }\n  }, []);\n\n  const handleAddFiles = useCallback(\n    async (files) => {\n      const incomingFiles = Array.from(files);\n      const validFiles = [];\n      const invalidFiles = [];\n\n      incomingFiles.forEach((file) => {\n        const ext = file.name.split('.').pop().toLowerCase();\n        const sizeInMB = file.size / (1024 * 1024);\n\n        if (!allowedExtensions.includes(ext)) {\n          invalidFiles.push(\n            t('uploader.attachments.invalidFileType', {\n              defaultValue: '{{fileName}} (Invalid file type)',\n              fileName: file.name\n            })\n          );\n        } else if (sizeInMB > MAX_FILE_SIZE_MB) {\n          invalidFiles.push(\n            t('uploader.attachments.fileExceedsSize', {\n              defaultValue: '{{fileName}} (Exceeds {{maxSize}} MB)',\n              fileName: file.name,\n              maxSize: MAX_FILE_SIZE_MB\n            })\n          );\n        } else {\n          validFiles.push(file);\n        }\n      });\n\n      const allExistingFiles = [...previousAttachments, ...currentAttachments];\n      const { uniqueFiles, duplicateFiles } = removeDuplicateFiles(\n        validFiles,\n        allExistingFiles\n      );\n\n      if (uniqueFiles.length > 0) {\n        setCurrentAttachments((prev) => [...prev, ...uniqueFiles]);\n      }\n\n      if (invalidFiles.length > 0) {\n        handleErrorSnackbar(\n          t('uploader.attachments.filesNotAddedTitle', {\n            defaultValue: 'Files not added'\n          }),\n          t('uploader.attachments.filesNotAddedMessage', {\n            defaultValue: 'The following files had errors:\\n{{errors}}',\n            errors: invalidFiles.join('\\n')\n          })\n        );\n        setFilePreview(true);\n      }\n\n      if (duplicateFiles.length > 0) {\n        const duplicateNames = duplicateFiles.map((f) => f.name).join(', ');\n        handleErrorSnackbar(\n          t('uploader.attachments.duplicatesSkippedTitle', {\n            defaultValue: 'Duplicates skipped'\n          }),\n          t('uploader.attachments.duplicatesSkippedMessage', {\n            defaultValue:\n              'The following files already exist and were not added: {{fileNames}}',\n            fileNames: duplicateNames\n          })\n        );\n      }\n    },\n    [\n      allowedExtensions,\n      MAX_FILE_SIZE_MB,\n      previousAttachments,\n      currentAttachments,\n      setCurrentAttachments,\n      handleErrorSnackbar,\n      setFilePreview,\n      t\n    ]\n  );\n\n  const handleAttachmentTypeSelect = useCallback(\n    (attachmentType) => {\n      setAttachmentType(attachmentType);\n    },\n    [setAttachmentType]\n  );\n\n  const renderCurrentAttachments = () => {\n    return currentAttachments.map((file, index) => (\n      <React.Fragment key={index}>\n        {index > 0 && <Divider component='li' />}\n        <ListItem\n          className='list-separator-item'\n          style={{ display: 'flex', justifyContent: 'space-between' }}\n        >\n          <Box>{file.fileName ? file.fileName : file.name}</Box>\n          <Box>\n            <IconButton\n              size='small'\n              onClick={() => handleAttachmentRemoveClick(file, index)}\n            >\n              <DeleteIcon />\n            </IconButton>\n          </Box>\n        </ListItem>\n      </React.Fragment>\n    ));\n  };\n\n  const renderPreviousAttachments = () => {\n    return previousAttachments.map((file, index) => (\n      <ListItem\n        key={index}\n        style={{ display: 'flex', justifyContent: 'space-between' }}\n      >\n        <Box>{file.fileName ?? file.name}</Box>\n        <Box>\n          <IconButton\n            size='small'\n            onClick={() => handleAttachmentDeleteClick(file, index)}\n          >\n            <DeleteIcon />\n          </IconButton>\n          <IconButton size='small' onClick={() => handleDownloadFile(file)}>\n            <DownloadIcon />\n          </IconButton>\n        </Box>\n      </ListItem>\n    ));\n  };\n\n  const renderConfirmationContent = () => {\n    const isDeleteAction = attachmentAction === AttachmentAction.Delete;\n    const fileName = attachmentToDelete?.fileName ?? attachmentToDelete?.name;\n\n    return (\n      <>\n        <p className={'deleteSubTitle'}>\n          {isDeleteAction\n            ? t('uploader.attachments.confirmDelete', {\n                defaultValue:\n                  'Are you sure you want to delete this attachment -'\n              })\n            : t('uploader.attachments.confirmRemove', {\n                defaultValue:\n                  'Are you sure you want to remove this attachment -'\n              })}{' '}\n          <strong>{`\"${fileName}\"`}</strong>?\n        </p>\n        {isDeleteAction && (\n          <p>\n            {t('uploader.attachments.cannotBeUndone', {\n              defaultValue: 'This action cannot be undone.'\n            })}\n          </p>\n        )}\n      </>\n    );\n  };\n\n  return (\n    <>\n      <div className='card-wrapper'>\n        {attachmentProgress && (\n          <div className='linear-progress'>\n            <LinearProgress />\n          </div>\n        )}\n        <AmbientCard\n          fullWidth={true}\n          title={t('uploader.attachments.addNewTitle', {\n            defaultValue: 'Add New Attachments'\n          })}\n          variant='secondary'\n          subtitle={t('uploader.attachments.addNewSubtitle', {\n            defaultValue: 'These files will be included with the submittal(s)'\n          })}\n        >\n          <DragDropFileUpload\n            title={t('uploader.attachments.dragDropTitle', {\n              defaultValue: 'Drag and drop files here or click to browse'\n            })}\n            handleUploadFile={handleAddFiles}\n            hideSelectFileButton={false}\n            hideFilePreview={!filePreview}\n            minHeight='200px'\n            maxHeight='400px'\n            multiple={true}\n          />\n          <AmbientAutoComplete\n            variant='outlined'\n            isMultiple={false}\n            value={attachmentType}\n            getOptionLabelFunction={(option) => option.name}\n            onChange={handleAttachmentTypeSelect}\n            options={attachmentTypes?.pageList}\n            label={t('uploader.attachments.selectType', {\n              defaultValue: 'Select Attachment Type'\n            })}\n            required\n          />\n        </AmbientCard>\n        {currentAttachments?.length > 0 && (\n          <AmbientCard\n            fullWidth={true}\n            title={t('uploader.attachments.currentTitle', {\n              defaultValue: 'Current Attachments'\n            })}\n            subtitle={\n              currentAttachments.length === 1\n                ? t('uploader.attachments.filesAttachedOne', {\n                    defaultValue: '{{count}} file attached',\n                    count: currentAttachments.length\n                  })\n                : t('uploader.attachments.filesAttachedOther', {\n                    defaultValue: '{{count}} files attached',\n                    count: currentAttachments.length\n                  })\n            }\n          >\n            <List>{renderCurrentAttachments()}</List>\n          </AmbientCard>\n        )}\n        {previousAttachments.length > 0 && (\n          <AmbientCard\n            fullWidth={true}\n            title={t('uploader.attachments.previousTitle', {\n              defaultValue: 'Previous Attachments'\n            })}\n          >\n            <List>{renderPreviousAttachments()}</List>\n          </AmbientCard>\n        )}\n      </div>\n\n      <FluentDialog\n        title={\n          <div className={'deleteTitle'}>\n            <span>\n              {attachmentAction === AttachmentAction.Delete\n                ? t('uploader.attachments.deleteDialogTitle', {\n                    defaultValue: 'Delete Attachment'\n                  })\n                : t('uploader.attachments.removeDialogTitle', {\n                    defaultValue: 'Remove Attachment'\n                  })}\n            </span>\n            <FluentIconButton\n              aria-label={t('common.close', { defaultValue: 'Close' })}\n              icon={ChromeCloseIcon}\n              onClick={handleCloseAttachmentDialog}\n            />\n          </div>\n        }\n        message={renderConfirmationContent()}\n        labelOne={\n          attachmentAction === AttachmentAction.Delete\n            ? t('common.delete', { defaultValue: 'Delete' })\n            : t('common.remove', { defaultValue: 'Remove' })\n        }\n        actionOne={\n          attachmentAction === AttachmentAction.Delete\n            ? deleteAttachment\n            : () =>\n                removeAttachmentFromList(\n                  currentAttachments,\n                  setCurrentAttachments\n                )\n        }\n        labelTwo={t('common.cancel', { defaultValue: 'Cancel' })}\n        actionTwo={handleCloseAttachmentDialog}\n        open={attachmentDialogOpen}\n        handleClose={handleCloseAttachmentDialog}\n        fullWidth\n      />\n    </>\n  );\n};\n"],"mappings":"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"}