@shoelace-style/shoelace
Version:
A forward-thinking library of web components.
57 lines (56 loc) • 1.86 kB
JavaScript
// src/internal/scrollend-polyfill.ts
var debounce = (fn, delay) => {
let timerId = 0;
return function(...args) {
window.clearTimeout(timerId);
timerId = window.setTimeout(() => {
fn.call(this, ...args);
}, delay);
};
};
var decorate = (proto, method, decorateFn) => {
const superFn = proto[method];
proto[method] = function(...args) {
superFn.call(this, ...args);
decorateFn.call(this, superFn, ...args);
};
};
var isSupported = "onscrollend" in window;
if (!isSupported) {
const pointers = /* @__PURE__ */ new Set();
const scrollHandlers = /* @__PURE__ */ new WeakMap();
const handlePointerDown = (event) => {
for (const touch of event.changedTouches) {
pointers.add(touch.identifier);
}
};
const handlePointerUp = (event) => {
for (const touch of event.changedTouches) {
pointers.delete(touch.identifier);
}
};
document.addEventListener("touchstart", handlePointerDown, true);
document.addEventListener("touchend", handlePointerUp, true);
document.addEventListener("touchcancel", handlePointerUp, true);
decorate(EventTarget.prototype, "addEventListener", function(addEventListener, type) {
if (type !== "scrollend")
return;
const handleScrollEnd = debounce(() => {
if (!pointers.size) {
this.dispatchEvent(new Event("scrollend"));
} else {
handleScrollEnd();
}
}, 100);
addEventListener.call(this, "scroll", handleScrollEnd, { passive: true });
scrollHandlers.set(this, handleScrollEnd);
});
decorate(EventTarget.prototype, "removeEventListener", function(removeEventListener, type) {
if (type !== "scrollend")
return;
const scrollHandler = scrollHandlers.get(this);
if (scrollHandler) {
removeEventListener.call(this, "scroll", scrollHandler, { passive: true });
}
});
}