vue-hooks-plus
Version:
Vue hooks library
90 lines (89 loc) • 3.47 kB
JavaScript
const domTarget = require("../utils/domTarget");
const useEffectWithTarget = require("../utils/useEffectWithTarget");
const vue = require("vue");
const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
const useEffectWithTarget__default = /* @__PURE__ */ _interopDefaultLegacy(useEffectWithTarget);
const useDrop = (target, options = {}) => {
const optionsRef = vue.ref(options);
const dragEnterTarget = vue.ref();
useEffectWithTarget__default.default(
() => {
const targetElement = domTarget.getTargetElement(target);
if (!(targetElement == null ? void 0 : targetElement.addEventListener)) {
return;
}
const onData = (dataTransfer, event) => {
const uri = dataTransfer.getData("text/uri-list");
const dom = dataTransfer.getData("custom");
if (dom && optionsRef.value.onDom) {
let data = dom;
try {
data = JSON.parse(dom);
} catch (e) {
data = dom;
}
optionsRef.value.onDom(data, event);
return;
}
if (uri && optionsRef.value.onUri) {
optionsRef.value.onUri(uri, event);
return;
}
if (dataTransfer.files && dataTransfer.files.length && optionsRef.value.onFiles) {
optionsRef.value.onFiles(Array.from(dataTransfer.files), event);
return;
}
if (dataTransfer.items && dataTransfer.items.length && optionsRef.value.onText) {
dataTransfer.items[0].getAsString((text) => {
optionsRef.value.onText(text, event);
});
}
};
const onDragEnter = (event) => {
var _a, _b;
event.preventDefault();
event.stopPropagation();
dragEnterTarget.value = event.target;
(_b = (_a = optionsRef.value).onDragEnter) == null ? void 0 : _b.call(_a, event);
};
const onDragOver = (event) => {
var _a, _b;
event.preventDefault();
(_b = (_a = optionsRef.value).onDragOver) == null ? void 0 : _b.call(_a, event);
};
const onDragLeave = (event) => {
var _a, _b;
if (event.target === dragEnterTarget.value) {
(_b = (_a = optionsRef.value).onDragLeave) == null ? void 0 : _b.call(_a, event);
}
};
const onDrop = (event) => {
var _a, _b;
event.preventDefault();
onData(event.dataTransfer, event);
(_b = (_a = optionsRef.value).onDrop) == null ? void 0 : _b.call(_a, event);
};
const onPaste = (event) => {
var _a, _b;
onData(event.clipboardData, event);
(_b = (_a = optionsRef.value).onPaste) == null ? void 0 : _b.call(_a, event);
};
targetElement.addEventListener("dragenter", onDragEnter);
targetElement.addEventListener("dragover", onDragOver);
targetElement.addEventListener("dragleave", onDragLeave);
targetElement.addEventListener("drop", onDrop);
targetElement.addEventListener("paste", onPaste);
return () => {
targetElement.removeEventListener("dragenter", onDragEnter);
targetElement.removeEventListener("dragover", onDragOver);
targetElement.removeEventListener("dragleave", onDragLeave);
targetElement.removeEventListener("drop", onDrop);
targetElement.removeEventListener("paste", onPaste);
};
},
[],
target
);
};
module.exports = useDrop;
;