UNPKG

vue-hooks-plus

Version:
98 lines (97 loc) 3.38 kB
"use strict"; 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;