UNPKG

react-virtualized

Version:

React components for efficiently rendering large, scrollable lists and tabular data

70 lines (69 loc) 2.71 kB
"use strict"; 'no babel-plugin-flow-react-proptypes'; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerScrollListener = registerScrollListener; exports.unregisterScrollListener = unregisterScrollListener; var _requestAnimationTimeout = require("../../utils/requestAnimationTimeout"); /*:: import type WindowScroller from '../WindowScroller.js';*/ var mountedInstances = []; var originalBodyPointerEvents = null; var disablePointerEventsTimeoutId = null; 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(function (instance) { return instance.props.scrollElement === element; })) { element.addEventListener('scroll', 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); if (disablePointerEventsTimeoutId) { (0, _requestAnimationTimeout.cancelAnimationTimeout)(disablePointerEventsTimeoutId); enablePointerEventsIfDisabled(); } } }