Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
87 lines
2.8 KiB
Plaintext
87 lines
2.8 KiB
Plaintext
'use client';
|
|
|
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
import React from 'react';
|
|
import './index.scss';
|
|
const handleDragOver = e => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
};
|
|
const baseClass = 'dropzone';
|
|
export function Dropzone({
|
|
children,
|
|
className,
|
|
disabled = false,
|
|
dropzoneStyle = 'default',
|
|
multipleFiles,
|
|
onChange
|
|
}) {
|
|
const dropRef = React.useRef(null);
|
|
const [dragging, setDragging] = React.useState(false);
|
|
const addFiles = React.useCallback(files => {
|
|
if (!multipleFiles && files.length > 1) {
|
|
const dataTransfer = new DataTransfer();
|
|
dataTransfer.items.add(files[0]);
|
|
onChange(dataTransfer.files);
|
|
} else {
|
|
onChange(files);
|
|
}
|
|
}, [multipleFiles, onChange]);
|
|
const handlePaste = React.useCallback(e => {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
if (e.clipboardData.files && e.clipboardData.files.length > 0) {
|
|
addFiles(e.clipboardData.files);
|
|
}
|
|
}, [addFiles]);
|
|
const handleDragEnter = React.useCallback(e_0 => {
|
|
e_0.preventDefault();
|
|
e_0.stopPropagation();
|
|
setDragging(true);
|
|
}, []);
|
|
const handleDragLeave = React.useCallback(e_1 => {
|
|
e_1.preventDefault();
|
|
e_1.stopPropagation();
|
|
setDragging(false);
|
|
}, []);
|
|
const handleDrop = React.useCallback(e_2 => {
|
|
e_2.preventDefault();
|
|
e_2.stopPropagation();
|
|
setDragging(false);
|
|
if (e_2.dataTransfer.files && e_2.dataTransfer.files.length > 0) {
|
|
addFiles(e_2.dataTransfer.files);
|
|
setDragging(false);
|
|
try {
|
|
e_2.dataTransfer.clearData();
|
|
} catch {
|
|
// Firefox throws NoModificationAllowedError when calling clearData() on a protected DataTransfer during drop events
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/clearData#exceptions
|
|
}
|
|
}
|
|
}, [addFiles]);
|
|
React.useEffect(() => {
|
|
const div = dropRef.current;
|
|
if (div && !disabled) {
|
|
div.addEventListener('dragenter', handleDragEnter);
|
|
div.addEventListener('dragleave', handleDragLeave);
|
|
div.addEventListener('dragover', handleDragOver);
|
|
div.addEventListener('drop', handleDrop);
|
|
div.addEventListener('paste', handlePaste);
|
|
return () => {
|
|
div.removeEventListener('dragenter', handleDragEnter);
|
|
div.removeEventListener('dragleave', handleDragLeave);
|
|
div.removeEventListener('dragover', handleDragOver);
|
|
div.removeEventListener('drop', handleDrop);
|
|
div.removeEventListener('paste', handlePaste);
|
|
};
|
|
}
|
|
return () => null;
|
|
}, [disabled, handleDragEnter, handleDragLeave, handleDrop, handlePaste]);
|
|
const classes = [baseClass, className, dragging ? 'dragging' : '', `dropzoneStyle--${dropzoneStyle}`].filter(Boolean).join(' ');
|
|
return /*#__PURE__*/_jsx("div", {
|
|
className: classes,
|
|
ref: dropRef,
|
|
children: children
|
|
});
|
|
}
|
|
//# sourceMappingURL=index.js.map |