import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState, } from 'react'; import { useStyles } from './styles/customFileUploadStyles'; import { Box, Button, CircularProgress, Grid, InputLabel, Modal, Typography, } from '@mui/material'; import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch'; import Dropzone from 'react-dropzone'; import SaveAltIcon from '@mui/icons-material/SaveAlt'; import RemoveRedEyeOutlinedIcon from '@mui/icons-material/RemoveRedEyeOutlined'; import RemoveOutlinedIcon from '@mui/icons-material/RemoveOutlined'; import AddOutlinedIcon from '@mui/icons-material/AddOutlined'; import ZoomOutOutlinedIcon from '@mui/icons-material/ZoomOutOutlined'; import CloseIcon from '@mui/icons-material/Close'; import downloadIcon from '../assets/images/icon/download.svg'; import { pushNotification } from '../utils/notification'; import { FILE_TYPE, NOTIFICATION } from '../constants'; import uploadIcon from '../assets/images/icon/upload.svg'; import PdfIcon from '../assets/images/icon/pdf.png'; import DocIcon from '../assets/images/icon/doc.png'; import { fileUpload } from '../services/file.upload.services'; import { IMAGE_LOCATION_BASE_URL } from '../common/envVariables'; const CustomFileUpload = forwardRef(function CustomFileUpload( { documentName, label, saveFileName, onUploadDone, maxFileSizeInMb, maxFiles, uploadedFileUrl, errorMessage, isDisabled = false, }, ref ) { const classes = useStyles(); const imageRef = useRef(null); const fileInputRef = useRef(null); const [image, setImage] = useState(null); const [isLoading, setIsLoading] = useState(false); const [openPreview, setOpenPreview] = useState(false); const [imageName, setImageName] = useState( uploadedFileUrl ? uploadedFileUrl.split('/').pop() : '' ); const [fileExtension, setFileExtension] = useState( uploadedFileUrl ? uploadedFileUrl.split('.').pop() : '' ); const [oldUploadedFileUrl, setOldUploadedFileUrl] = useState( uploadedFileUrl ? uploadedFileUrl : '' ); useImperativeHandle(ref, () => ({ focus: () => { if (fileInputRef.current) { fileInputRef.current.focus(); } }, scrollIntoView: (...args) => { if (fileInputRef.current) { fileInputRef.current.scrollIntoView(...args); } }, })); useEffect(() => { const makeFullUrlIfNeeded = (url) => { // Return early if url is undefined or empty if (!url) { setOldUploadedFileUrl(''); setFileExtension(''); setImageName(''); return; } const isHttp = url.startsWith('http://') || url.startsWith('https://'); if (!isHttp) { setOldUploadedFileUrl(`${IMAGE_LOCATION_BASE_URL}${url}`); setFileExtension(url.split('.').pop() || ''); setImageName(url.split('/').pop() || ''); return; } const urlObject = new URL(url); const fileName = urlObject.pathname.split('/').pop(); setImageName(fileName); setFileExtension(fileName.split('.').pop()); setOldUploadedFileUrl(url); return url; }; makeFullUrlIfNeeded(uploadedFileUrl); }, [uploadedFileUrl]); const handleClearImage = () => { setImage(null); setImageName(''); setFileExtension(''); setOldUploadedFileUrl(''); onUploadDone(documentName, ''); }; const handleFileUpload = async (value) => { if (!value) { return; } let formData = new FormData(); formData.append('file', value); formData.append('fileName', value?.name); try { setIsLoading(true); const data = await fileUpload(formData); onUploadDone(documentName, data?.data?.data?.Key); return; } catch (error) { // console.error(error); pushNotification('Error while uploading file', NOTIFICATION.ERROR); } finally { setIsLoading(false); } }; const handleDrop = async (acceptedFiles) => { const file = acceptedFiles[0]; await handleFileUpload(file); setImage(file); setImageName(file.name); setOldUploadedFileUrl(''); setFileExtension(''); }; const handelRejection = (rejectedFiles) => { rejectedFiles.forEach((rejection) => { pushNotification( `${rejection?.file?.name} : ${rejection?.errors?.[0]?.message}`, NOTIFICATION.ERROR ); }); }; const handlePreview = () => { setOpenPreview(true); }; const handleClose = () => { setOpenPreview(false); }; const handleDownload = () => { if (image) { const imageUrl = URL.createObjectURL(image); const anchor = document.createElement('a'); anchor.href = imageUrl; anchor.download = saveFileName || imageName || 'Image'; anchor.click(); } if (oldUploadedFileUrl) { const imageUrl = oldUploadedFileUrl; const anchor = document.createElement('a'); anchor.href = imageUrl; anchor.download = saveFileName || imageName || 'Image'; anchor.click(); } }; const Controls = ({ zoomIn, zoomOut, resetTransform }) => ( <> ); const FileUploadComponent = ({ isLoading, fileUrl, fileExtension, maxFileSizeInMb, handlePreview, handleDownload, classes, }) => ( <> {isLoading ? ( ) : ( <> {fileUrl ? ( <> {fileExtension === 'pdf' ? ( Uploaded file ) : fileExtension === 'doc' || fileExtension === 'docx' || fileExtension === 'vnd.openxmlformats-officedocument.wordprocessingml.document' || fileExtension === 'msword' ? ( Uploaded file ) : ( Uploaded file )} ) : ( <> Drag and drop file here, or click add Allowed file types are jpeg, png, pdf, svg, doc to a maximum size of {maxFileSizeInMb} MB )} )} {errorMessage && ( {errorMessage} )} ); const PreviewComponent = ({ fileUrl, fileExtension, handleDownload, classes, }) => ( <> {fileExtension === 'pdf' ? ( <> Uploaded file ) : fileExtension === 'doc' || fileExtension === 'docx' || fileExtension === 'vnd.openxmlformats-officedocument.wordprocessingml.document' || fileExtension === 'msword' ? ( <> Uploaded file ) : ( {(utils) => ( Uploaded file )} )} ); return ( <> {label} {(image || oldUploadedFileUrl) && (
{!isDisabled && ( )}
)}
{imageName} {!oldUploadedFileUrl ? ( <> ) : ( <> )} ); }); export default CustomFileUpload;