Rev 7426 | Rev 15269 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState, useCallback, useEffect } from "react";
import { useDropzone } from "react-dropzone";
import { baseStyle, imgStyle, thumbsContainerStyle } from "../../assets/styles/js-styles/Dropzone";
import FilePreview from "./FilePreview";
const DropzoneComponent = React.memo(({
modalType,
onUploaded,
settedFile,
recomendationText
}) => {
const [errors, setErrors] = useState([]);
const [files, setFiles] = useState([]);
const onDropRejected = useCallback((rejectedFiles) => {
rejectedFiles.map((fileRejection) => {
switch (fileRejection.errors[0].code) {
case "too-many-files":
setErrors([...errors, "solo puedes agregar 1 archivo"]);
break;
case "file-invalid-type":
setErrors([...errors, "por favor seleccione un archivo valido"]);
break;
default:
setErrors(errors);
break;
}
});
}, []);
useEffect(() => {
if (settedFile) setFiles([settedFile]);
}, [settedFile]);
const acceptedMimeTypes = {
IMAGE: "image/jpeg, image/png, image/jpg",
FILE: "application/pdf",
VIDEO: "video/mp4, video/mpeg, video/webm",
CHAT: "video/mp4, video/mpeg, video/webm, application/pdf, image/jpeg, image/png, image/jpg"
}
const { getRootProps, getInputProps, acceptedFiles } = useDropzone({
accept: acceptedMimeTypes[modalType],
multiple: false,
onDrop: (accepted) => {
onUploaded(accepted[0]);
setFiles(accepted[0]);
},
onDropRejected,
onDropAccepted: () => {
setErrors([]);
},
maxFiles: 1,
})
const onDeleteFileHandler = (id) => {
onUploaded('');
setFiles(files.filter(file => file !== id));
};
const filePreviewOptions = (modalType, file) => {
const options = {
IMAGE: <img src={URL.createObjectURL(file)} style={imgStyle} />,
FILE: <object data={URL.createObjectURL(file)} type="application/pdf" width="400" height="200" />,
VIDEO: <video src={URL.createObjectURL(file)} width="400" height="300" controls autoPlay muted />
}
return options[modalType]
}
return (
<div>
{
!files.length
&&
<div {...getRootProps({ className: "dropzone", style: baseStyle })}>
<input {...getInputProps()} />
<p>Arrastra el archivo aqui, o haga click para seleccionar</p>
{recomendationText}
</div>
}
<aside>
<div style={thumbsContainerStyle}>
{
files.map((file, index) =>
<FilePreview
onDeleteFileHandler={() => onDeleteFileHandler(file)}
key={index}
>
{filePreviewOptions(modalType, file)}
</FilePreview>
)
}
</div>
</aside>
</div>
);
});
export default DropzoneComponent;