Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 2662 | Rev 3257 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

/* eslint-disable react/prop-types */
import React, { useState, useCallback, useEffect } from "react";
import { useDropzone } from "react-dropzone";
import { shareModalTypes } from "../../redux/share-modal/shareModal.types";
import FormErrorFeedback from "../form-error-feedback/FormErrorFeedback";
const areEqual = (prevProps, nextProps) => {
  return prevProps.settedFile === nextProps.settedFile ? true : false;
};

const DropzoneComponent = (props) => {
  const { modalType, onUploaded, settedFile, recomendationText } = props;

  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 = () => {
    switch (modalType) {
      case shareModalTypes.IMAGE:
        return "image/jpeg, image/png, image/jpg";
      case shareModalTypes.FILE:
        return "application/pdf";
      case shareModalTypes.VIDEO:
        return "video/mp4, video/mpeg, video/webm";
      case shareModalTypes.CHAT:
        return "video/mp4, video/mpeg, video/webm, application/pdf, image/jpeg, image/png, image/jpg";
      default:
        return null;
    }
  };

  const {
    getRootProps,
    getInputProps,
    acceptedFiles,
    fileRejections,
  } = useDropzone({
    accept: acceptedMimeTypes(),
    multiple: false,
    onDrop: (acceptedFiles) => {
      onUploaded(acceptedFiles[0]);
      setFiles(acceptedFiles.map((file) => file));
    },
    onDropRejected,
    onDropAccepted: () => {
      setErrors([]);
    },
    maxFiles: 1,
  });
  const thumbStyle = {
    display: "inline-flex",
    borderRadius: "2px",
    border: "1px solid #eaeaea",
    marginBottom: "8px",
    marginRight: "8px",
    width: "150px",
    height: "150px",
    padding: "4px",
    boxSizing: "border-box",
    position: "relative",
    zIndex: "100",
  };
  const thumbInnerStyle = {
    display: "flex",
    minWidth: 0,
    overflow: "hidden",
    marginRight: "1.5rem",
  };
  const imgStyle = {
    display: "block",
    width: "auto",
    height: "100%",
    objectFit: "contain",
  };

  const onDeleteFileHandler = (index) => {
    const newFiles = files.filter((_, id) => id !== index);
    onUploaded("");
    setFiles(newFiles);
  };

  const CloseButtonContainer = {
    width: "20px",
    height: "20px",
    position: "absolute",
    top: "5px",
    right: "0px",
    cursor: "pointer",
    zIndex: "200",
  };

  const filePreviewTest = (file, id) => {
    console.log(file)
    console.log(id)
    console.log(shareModalTypes)
    switch (modalType) {
      case shareModalTypes.IMAGE:
        return (
          <div style={thumbStyle} key={file.name}>
            <div style={thumbInnerStyle}>
              <img src={URL.createObjectURL(file)} style={imgStyle} />
            </div>
            <div
              style={CloseButtonContainer}
              onClick={() => onDeleteFileHandler(id)}
            >
              <img
                src="/css/icons/x-circle-fill.svg"
                alt="close-button"
                style={{ width: "100%", height: "100%" }}
              />
            </div>
          </div>
        );
      case shareModalTypes.FILE:
        return (
          <div
            style={{ ...thumbStyle, width: "90%", height: "auto", margin: 'auto' }}
            key={file.name}
          >
            <div style={thumbInnerStyle}>
              <object
                data={URL.createObjectURL(file)}
                type="application/pdf"
                width="400"
                height="200"
              ></object>
            </div>
            <div
              style={CloseButtonContainer}
              onClick={() => onDeleteFileHandler(id)}
            >
              <img
                src="/css/icons/x-circle-fill.svg"
                alt="close-button"
                style={{ width: "100%", height: "100%" }}
              />
            </div>
          </div>
        );
      case shareModalTypes.VIDEO:
        return (
          <div
            style={{ ...thumbStyle, width: "auto", height: "auto" }}
            key={file.name}
          >
            <div style={thumbInnerStyle}>
              <video
                src={URL.createObjectURL(file)}
                width="400"
                height="300"
                controls
                autoPlay
                muted
              ></video>
            </div>
            <div
              style={CloseButtonContainer}
              onClick={() => onDeleteFileHandler(id)}
            >
              <img
                src="/css/icons/x-circle-fill.svg"
                alt="close-button"
                style={{ width: "100%", height: "100%" }}
              />
            </div>
          </div>
        );
      case shareModalTypes.CHAT:
        switch (file.type) {
          case "video/mp4":
          case "video/mpeg":
          case "video/webm":
            return (
              <div
                style={{ ...thumbStyle, width: "90%", height: "auto", margin: 'auto' }}
                key={file.name}
              >
                <div style={thumbInnerStyle}>
                  <video
                    src={URL.createObjectURL(file)}
                    width="400"
                    height="300"
                    controls
                    autoPlay
                    muted
                  ></video>
                </div>
                <div
                  style={CloseButtonContainer}
                  onClick={() => onDeleteFileHandler(id)}
                >
                  <img
                    src="/css/icons/x-circle-fill.svg"
                    alt="close-button"
                    style={{ width: "100%", height: "100%" }}
                  />
                </div>
              </div>
            );
          case "image/jpeg":
          case "image/png":
          case "image/jpg":
            return (
              <div style={thumbStyle} key={file.name}>
                <div style={thumbInnerStyle}>
                  <img src={URL.createObjectURL(file)} style={imgStyle} />
                </div>
                <div
                  style={CloseButtonContainer}
                  onClick={() => onDeleteFileHandler(id)}
                >
                  <img
                    src="/css/icons/x-circle-fill.svg"
                    alt="close-button"
                    style={{ width: "100%", height: "100%" }}
                  />
                </div>
              </div>
            );
          case "application/pdf":
            return (
              <div
                style={{ ...thumbStyle, width: "90%", height: "auto", margin: 'auto' }}
                key={file.name}
              >
                <div style={thumbInnerStyle}>
                  <object
                    data={URL.createObjectURL(file)}
                    type="application/pdf"
                    width="400"
                    height="200"
                  ></object>
                </div>
                <div
                  style={CloseButtonContainer}
                  onClick={() => onDeleteFileHandler(id)}
                >
                  <img
                    src="/css/icons/x-circle-fill.svg"
                    alt="close-button"
                    style={{ width: "100%", height: "100%" }}
                  />
                </div>
              </div>
            );
          default:
            break;
        }
        break;
      default:
        break;
    }
  };

  const thumbsContainerStyle = {
    display: "flex",
    flexDirection: "row",
    flexWrap: "wrap",
    marginTop: 16,
    position: "relative",
    justifyContent: "center",
  };

  const baseStyle = {
    display: "flex",
    flexDirection: "column",
    alignItems: "center",
    padding: "2rem 0",
    borderWidth: 2,
    borderRadius: 2,
    borderColor: "#eeeeee",
    borderStyle: "dashed",
    backgroundColor: "#fafafa",
    color: "#bdbdbd",
    outline: "none",
    transition: "border .24s ease-in-out",
    marginTop: "1rem",
    cursor: "pointer",
  };

  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, id) => filePreviewTest(file, id))
          }
        </div>
        {errors.map((error, index) => (
          <FormErrorFeedback key={index}>{error}</FormErrorFeedback>
        ))}
      </aside>
    </div>
  );
};

export default React.memo(DropzoneComponent, areEqual);