react-use
Version:
Collection of React Hooks
80 lines (79 loc) • 3.01 kB
JavaScript
import { __spreadArrays } from "tslib";
import * as React from 'react';
import useMountedState from './useMountedState';
var useState = React.useState, useMemo = React.useMemo, useCallback = React.useCallback, useEffect = React.useEffect;
var noop = function () { };
/*
const defaultState: DropAreaState = {
over: false,
};
*/
var createProcess = function (options, mounted) { return function (dataTransfer, event) {
var uri = dataTransfer.getData('text/uri-list');
if (uri) {
(options.onUri || noop)(uri, event);
return;
}
if (dataTransfer.files && dataTransfer.files.length) {
(options.onFiles || noop)(Array.from(dataTransfer.files), event);
return;
}
if (dataTransfer.items && dataTransfer.items.length) {
dataTransfer.items[0].getAsString(function (text) {
if (mounted) {
(options.onText || noop)(text, event);
}
});
}
}; };
var useDrop = function (options, args) {
if (options === void 0) { options = {}; }
if (args === void 0) { args = []; }
var onFiles = options.onFiles, onText = options.onText, onUri = options.onUri;
var isMounted = useMountedState();
var _a = useState(false), over = _a[0], setOverRaw = _a[1];
var setOver = useCallback(setOverRaw, []);
var process = useMemo(function () { return createProcess(options, isMounted()); }, [onFiles, onText, onUri]);
useEffect(function () {
var onDragOver = function (event) {
event.preventDefault();
setOver(true);
};
var onDragEnter = function (event) {
event.preventDefault();
setOver(true);
};
var onDragLeave = function () {
setOver(false);
};
var onDragExit = function () {
setOver(false);
};
var onDrop = function (event) {
event.preventDefault();
setOver(false);
process(event.dataTransfer, event);
};
var onPaste = function (event) {
process(event.clipboardData, event);
};
document.addEventListener('dragover', onDragOver);
document.addEventListener('dragenter', onDragEnter);
document.addEventListener('dragleave', onDragLeave);
document.addEventListener('dragexit', onDragExit);
document.addEventListener('drop', onDrop);
if (onText) {
document.addEventListener('paste', onPaste);
}
return function () {
document.removeEventListener('dragover', onDragOver);
document.removeEventListener('dragenter', onDragEnter);
document.removeEventListener('dragleave', onDragLeave);
document.removeEventListener('dragexit', onDragExit);
document.removeEventListener('drop', onDrop);
document.removeEventListener('paste', onPaste);
};
}, __spreadArrays([process], args));
return { over: over };
};
export default useDrop;