rv-window-scroller
Version:
Window scroller component for react-virtualized and react-window
97 lines (81 loc) • 2.91 kB
JavaScript
;
'no babel-plugin-flow-react-proptypes';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.registerScrollListener = registerScrollListener;
exports.unregisterScrollListener = unregisterScrollListener;
var _requestAnimationTimeout = require("./requestAnimationTimeout");
var mountedInstances = [];
var originalBodyPointerEvents = null;
var disablePointerEventsTimeoutId = null;
var registeredScrollListeners = new WeakMap();
function enablePointerEventsIfDisabled() {
if (disablePointerEventsTimeoutId) {
disablePointerEventsTimeoutId = null;
if (document.body && originalBodyPointerEvents != null) {
document.body.style.pointerEvents = originalBodyPointerEvents;
}
originalBodyPointerEvents = null;
}
}
function enablePointerEventsAfterDelayCallback() {
enablePointerEventsIfDisabled();
mountedInstances.forEach(function (instance) {
return instance.__resetIsScrolling();
});
}
function enablePointerEventsAfterDelay() {
if (disablePointerEventsTimeoutId) {
(0, _requestAnimationTimeout.cancelAnimationTimeout)(disablePointerEventsTimeoutId);
}
var maximumTimeout = 0;
mountedInstances.forEach(function (instance) {
maximumTimeout = Math.max(maximumTimeout, instance.props.scrollingResetTimeInterval);
});
disablePointerEventsTimeoutId = (0, _requestAnimationTimeout.requestAnimationTimeout)(enablePointerEventsAfterDelayCallback, maximumTimeout);
}
function onScrollWindow(event
/*: Event*/
) {
if (event.currentTarget === window && originalBodyPointerEvents == null && document.body) {
originalBodyPointerEvents = document.body.style.pointerEvents;
document.body.style.pointerEvents = 'none';
}
enablePointerEventsAfterDelay();
mountedInstances.forEach(function (instance) {
if (instance.props.scrollElement === event.currentTarget) {
instance.__handleWindowScrollEvent();
}
});
}
function registerScrollListener(component
/*: WindowScroller*/
, element
/*: Element*/
) {
if ( // !mountedInstances.some(instance => instance.props.scrollElement === element)
!registeredScrollListeners.has(element)) {
element.addEventListener('scroll', onScrollWindow);
registeredScrollListeners.set(element, onScrollWindow);
}
mountedInstances.push(component);
}
function unregisterScrollListener(component
/*: WindowScroller*/
, element
/*: Element*/
) {
mountedInstances = mountedInstances.filter(function (instance) {
return instance !== component;
});
if (!mountedInstances.length) {
element.removeEventListener('scroll', onScrollWindow);
element.removeEventListener('scroll', registeredScrollListeners.get(element));
registeredScrollListeners["delete"](element);
if (disablePointerEventsTimeoutId) {
(0, _requestAnimationTimeout.cancelAnimationTimeout)(disablePointerEventsTimeoutId);
enablePointerEventsIfDisabled();
}
}
}