@prefect9/ui
Version:
UI React components
76 lines (75 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
require("core-js/modules/es.array.includes.js");
require("core-js/modules/es.string.includes.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _isType = require("@prefect9/is-type");
function DragDropFilesObserver() {
if (!this) throw new Error('Make DragDropFilesObserver as new object');
if (this.constructor !== DragDropFilesObserver) throw new Error('Invalid DragDropFilesObserver this variable');
const result = this;
let destructed = false;
const dragHandlers = [];
let dragged = false;
let nowDragged = false;
const setDrag = newDrag => {
nowDragged = newDrag;
if (dragged === nowDragged) return;
dragged = nowDragged;
if (dragHandlers.length) for (let dragHandler of dragHandlers) dragHandler(nowDragged);
};
const dragStartHandler = e => {
e.preventDefault();
if (destructed) return;
const types = e.dataTransfer.types;
if (!types.includes('Files')) return;
setDrag(true);
};
window.addEventListener('dragenter', dragStartHandler);
window.addEventListener('dragover', dragStartHandler);
const dragEndHandler = e => {
e.preventDefault();
if (destructed) return;
const seed = "".concat(Math.random());
nowDragged = seed;
setTimeout(() => {
if (destructed) return;
if (nowDragged !== seed) return;
setDrag(false);
}, 100);
};
window.addEventListener('dragleave', dragEndHandler);
result.onDrag = handler => {
if (destructed) throw new Error('Observer already destructed');
if (!(0, _isType.isFunc)(handler)) throw new Error('Handler must be function');
handler(dragged);
dragHandlers.push(handler);
};
const dropHandlers = [];
const dropHandler = e => {
e.preventDefault();
if (destructed) return;
setDrag(false);
const files = e.dataTransfer.files;
if (!files.length) return;
if (dropHandlers.length) for (let dropHandler of dropHandlers) dropHandler(files);
};
window.addEventListener('drop', dropHandler);
result.onDrop = handler => {
if (destructed) throw new Error('Observer already destructed');
if (!(0, _isType.isFunc)(handler)) throw new Error('Handler must be function');
dropHandlers.push(handler);
};
result.destruct = () => {
window.removeEventListener('dragenter', dragStartHandler);
window.removeEventListener('dragover', dragStartHandler);
window.removeEventListener('dragleave', dragEndHandler);
window.removeEventListener('drop', dropHandler);
setDrag(false);
destructed = true;
};
}
var _default = exports.default = DragDropFilesObserver;