@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
78 lines (77 loc) • 2.84 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
var vue = require("vue");
var dom = require("../../_utils/dom.js");
const useDraggable = ({
modalRef,
wrapperRef,
draggable,
alignCenter
}) => {
const isDragging = vue.ref(false);
const startMouse = vue.ref([0, 0]);
const initialPosition = vue.ref([0, 0]);
const position = vue.ref();
const minPosition = vue.ref([0, 0]);
const maxPosition = vue.ref([0, 0]);
const getInitialPosition = () => {
var _a, _b, _c;
if (wrapperRef.value && modalRef.value) {
const { top: wrapperTop, left: wrapperLeft } = wrapperRef.value.getBoundingClientRect();
const { clientWidth: wrapperWidth, clientHeight: wrapperHeight } = wrapperRef.value;
const { top, left, width, height } = modalRef.value.getBoundingClientRect();
const offsetTop = alignCenter.value ? 0 : (_a = modalRef.value) == null ? void 0 : _a.offsetTop;
const initialX = left - wrapperLeft;
const initialY = top - wrapperTop - offsetTop;
if (initialX !== ((_b = initialPosition.value) == null ? void 0 : _b[0]) || initialY !== ((_c = initialPosition.value) == null ? void 0 : _c[1])) {
initialPosition.value = [initialX, initialY];
}
const maxX = wrapperWidth > width ? wrapperWidth - width : 0;
const maxY = wrapperHeight > height ? wrapperHeight - height - offsetTop : 0;
if (maxX !== maxPosition.value[0] || maxY !== maxPosition.value[1]) {
maxPosition.value = [maxX, maxY];
}
if (offsetTop) {
minPosition.value = [0, 0 - offsetTop];
}
}
};
const handleMoveDown = (ev) => {
if (draggable.value) {
ev.preventDefault();
isDragging.value = true;
getInitialPosition();
startMouse.value = [ev.x, ev.y];
dom.on(window, "mousemove", handleMouseMove);
dom.on(window, "mouseup", handleMouseUp);
dom.on(window, "contextmenu", handleMouseUp);
}
};
const handleMouseMove = (ev) => {
if (isDragging.value) {
const diffX = ev.x - startMouse.value[0];
const diffY = ev.y - startMouse.value[1];
let x = initialPosition.value[0] + diffX;
let y = initialPosition.value[1] + diffY;
if (x < minPosition.value[0])
x = minPosition.value[0];
if (x > maxPosition.value[0])
x = maxPosition.value[0];
if (y < minPosition.value[1])
y = minPosition.value[1];
if (y > maxPosition.value[1])
y = maxPosition.value[1];
position.value = [x, y];
}
};
const handleMouseUp = () => {
isDragging.value = false;
dom.off(window, "mousemove", handleMouseMove);
dom.off(window, "mouseup", handleMouseUp);
};
return {
position,
handleMoveDown
};
};
exports.useDraggable = useDraggable;