index.mjs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { isFunction } from "../../utils/types.mjs";
  2. //#region ../../packages/directives/repeat-click/index.ts
  3. const REPEAT_INTERVAL = 100;
  4. const REPEAT_DELAY = 600;
  5. const SCOPE = "_RepeatClick";
  6. const vRepeatClick = {
  7. beforeMount(el, binding) {
  8. const value = binding.value;
  9. const { interval = 100, delay = 600 } = isFunction(value) ? {} : value;
  10. let intervalId;
  11. let delayId;
  12. const handler = () => isFunction(value) ? value() : value.handler();
  13. const clear = () => {
  14. if (delayId) {
  15. clearTimeout(delayId);
  16. delayId = void 0;
  17. }
  18. if (intervalId) {
  19. clearInterval(intervalId);
  20. intervalId = void 0;
  21. }
  22. };
  23. const start = (evt) => {
  24. if (evt.button !== 0) return;
  25. clear();
  26. handler();
  27. document.addEventListener("mouseup", clear, {
  28. once: true,
  29. capture: true
  30. });
  31. delayId = setTimeout(() => {
  32. intervalId = setInterval(() => {
  33. handler();
  34. }, interval);
  35. }, delay);
  36. };
  37. el[SCOPE] = {
  38. start,
  39. clear
  40. };
  41. el.addEventListener("mousedown", start);
  42. },
  43. unmounted(el) {
  44. if (!el[SCOPE]) return;
  45. const { start, clear } = el[SCOPE];
  46. if (start) el.removeEventListener("mousedown", start);
  47. if (clear) {
  48. clear();
  49. document.removeEventListener("mouseup", clear, true);
  50. }
  51. el[SCOPE] = null;
  52. }
  53. };
  54. //#endregion
  55. export { REPEAT_DELAY, REPEAT_INTERVAL, vRepeatClick };
  56. //# sourceMappingURL=index.mjs.map