crane-cloud/frontend

View on GitHub
src/components/DropZone/index.jsx

Summary

Maintainability
A
0 mins
Test Coverage
F
54%
import React, { useState, useEffect } from "react";
import { useDropzone } from "react-dropzone";
import styles from "./Dropzone.module.css";
import { ReactComponent as Drop } from "../../assets/images/drop.svg";

const Dropzone = ({ handleDrop }) => {
  const [files, setFiles] = useState([]);

  const { getRootProps, getInputProps } = useDropzone({
    accept: ".zip",
    onDrop: (acceptedFiles) => {
      handleDrop(acceptedFiles);
      setFiles(
        acceptedFiles.map((file) =>
          Object.assign(file, {
            preview: URL.createObjectURL(file),
          })
        )
      );
    },
  });

  useEffect(
    () => () => {
      // Make sure to revoke the data uris to avoid memory leaks
      files.forEach((file) => URL.revokeObjectURL(file.preview));
    },
    [files]
  );

  return (
    <div {...getRootProps()}>
      <input {...getInputProps()} />
      {!files.length ? (
        <>
          <div>
            <Drop className={styles.UploadIconSmall} />
            <p className={styles.DropzonePlaceholder}>
              Drag and drop your zipped folder or click here to select files
            </p>
          </div>
        </>
      ) : (
        <>
          {files.map((file,index) => (
            <p key={index} className={styles.DropzonePlaceholder}>{file.name}</p>
          ))}
        </>
      )}
    </div>
  );
};

export default Dropzone;