vue-hooks-plus
Version:
Vue hooks library
98 lines (97 loc) • 3.38 kB
JavaScript
const domTarget = require("../utils/domTarget");
const vue = require("vue");
const useEffectWithTarget = require("../utils/useEffectWithTarget");
const _interopDefaultLegacy = (e) => e && typeof e === "object" && "default" in e ? e : { default: e };
const useEffectWithTarget__default = /* @__PURE__ */ _interopDefaultLegacy(useEffectWithTarget);
const getSupportedMouseEvents = () => {
const hasPointEvent = "PointerEvent" in window;
if (hasPointEvent) {
return {
mouseDown: "pointerdown",
mouseUp: "pointerup",
mouseMove: "pointermove"
};
}
const isTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
if (isTouch) {
return {
mouseDown: "touchstart",
mouseUp: "touchend",
mouseMove: "touchmove"
};
}
return {
mouseDown: "mousedown",
mouseUp: "mouseup",
mouseMove: "mousemove"
};
};
const useLongPress = (target, options = {}) => {
var _a, _b;
const DEFAULT_DELAY_TIME = 500;
const DEFAULT_UPDATE_TIME = 100;
const isPressing = vue.ref(false);
const pressingTime = vue.ref(0);
let pressingTimer;
let timeoutTimer;
const eventOptions = {
capture: (_a = options == null ? void 0 : options.modifiers) == null ? void 0 : _a.capture,
once: (_b = options == null ? void 0 : options.modifiers) == null ? void 0 : _b.once
};
useEffectWithTarget__default.default(
() => {
var _a2;
const targetElement = domTarget.getTargetElement(target);
if (!targetElement) {
return;
}
const { mouseDown, mouseUp, mouseMove } = getSupportedMouseEvents();
function clear() {
if (timeoutTimer) {
clearTimeout(timeoutTimer);
timeoutTimer = void 0;
}
if (pressingTimer) {
clearInterval(pressingTimer);
pressingTimer = void 0;
}
pressingTime.value = 0;
isPressing.value = false;
}
function onDown(ev) {
var _a3, _b2, _c;
if (((_a3 = options.modifiers) == null ? void 0 : _a3.self) && ev.target !== targetElement)
return;
clear();
if ((_b2 = options.modifiers) == null ? void 0 : _b2.prevent)
ev.preventDefault();
if ((_c = options.modifiers) == null ? void 0 : _c.stop)
ev.stopPropagation();
timeoutTimer = setTimeout(() => {
isPressing.value = true;
pressingTimer = setInterval(() => {
pressingTime.value += options.minUpdateTime || DEFAULT_UPDATE_TIME;
}, options.minUpdateTime || DEFAULT_UPDATE_TIME);
}, options.delay || DEFAULT_DELAY_TIME);
}
targetElement.addEventListener(mouseDown, onDown, eventOptions);
targetElement.addEventListener(mouseUp, clear, eventOptions);
if ((_a2 = options.cancelOnMove) != null ? _a2 : true) {
targetElement.addEventListener(mouseMove, clear, eventOptions);
}
return () => {
var _a3;
targetElement.removeEventListener(mouseDown, onDown);
targetElement.removeEventListener(mouseUp, clear);
if ((_a3 = options.cancelOnMove) != null ? _a3 : true) {
targetElement.removeEventListener(mouseMove, clear);
}
};
},
[],
target
);
return { isPressing: vue.readonly(isPressing), pressingTime: vue.readonly(pressingTime) };
};
module.exports = useLongPress;
;