UNPKG

rv-window-scroller

Version:

Window scroller component for react-virtualized and react-window

90 lines (76 loc) 2.72 kB
'no babel-plugin-flow-react-proptypes'; import { requestAnimationTimeout, cancelAnimationTimeout } from './requestAnimationTimeout'; /*:: import type WindowScroller from './WindowScroller.js';*/ 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) { cancelAnimationTimeout(disablePointerEventsTimeoutId); } var maximumTimeout = 0; mountedInstances.forEach(function (instance) { maximumTimeout = Math.max(maximumTimeout, instance.props.scrollingResetTimeInterval); }); disablePointerEventsTimeoutId = 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(); } }); } export 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); } export 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) { cancelAnimationTimeout(disablePointerEventsTimeoutId); enablePointerEventsIfDisabled(); } } }