UNPKG

@daredrop/react-scroll

Version:
102 lines (85 loc) 3.77 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _lodash = require('lodash.throttle'); var _lodash2 = _interopRequireDefault(_lodash); var _passiveEventListeners = require('./passive-event-listeners'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // The eventHandler will execute at a rate of 15fps by default var eventThrottler = function eventThrottler(eventHandler) { var throttleAmount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 66; return (0, _lodash2.default)(eventHandler, throttleAmount); }; var scrollSpy = { spyCallbacks: [], spySetState: [], scrollSpyContainers: [], mount: function mount(scrollSpyContainer, throttle) { if (scrollSpyContainer) { var eventHandler = eventThrottler(function (event) { scrollSpy.scrollHandler(scrollSpyContainer); }, throttle); scrollSpy.scrollSpyContainers.push(scrollSpyContainer); (0, _passiveEventListeners.addPassiveEventListener)(scrollSpyContainer, 'scroll', eventHandler); } }, isMounted: function isMounted(scrollSpyContainer) { return scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer) !== -1; }, currentPositionX: function currentPositionX(scrollSpyContainer) { if (scrollSpyContainer === document) { var supportPageOffset = window.pageYOffset !== undefined; var isCSS1Compat = (document.compatMode || "") === "CSS1Compat"; return supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft; } else { return scrollSpyContainer.scrollLeft; } }, currentPositionY: function currentPositionY(scrollSpyContainer) { if (scrollSpyContainer === document) { var supportPageOffset = window.pageXOffset !== undefined; var isCSS1Compat = (document.compatMode || "") === "CSS1Compat"; return supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop; } else { return scrollSpyContainer.scrollTop; } }, scrollHandler: function scrollHandler(scrollSpyContainer) { var callbacks = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)].spyCallbacks || []; callbacks.forEach(function (c) { return c(scrollSpy.currentPositionX(scrollSpyContainer), scrollSpy.currentPositionY(scrollSpyContainer)); }); }, addStateHandler: function addStateHandler(handler) { scrollSpy.spySetState.push(handler); }, addSpyHandler: function addSpyHandler(handler, scrollSpyContainer) { var container = scrollSpy.scrollSpyContainers[scrollSpy.scrollSpyContainers.indexOf(scrollSpyContainer)]; if (!container.spyCallbacks) { container.spyCallbacks = []; } container.spyCallbacks.push(handler); handler(scrollSpy.currentPositionX(scrollSpyContainer), scrollSpy.currentPositionY(scrollSpyContainer)); }, updateStates: function updateStates() { scrollSpy.spySetState.forEach(function (s) { return s(); }); }, unmount: function unmount(stateHandler, spyHandler) { scrollSpy.scrollSpyContainers.forEach(function (c) { return c.spyCallbacks && c.spyCallbacks.length && c.spyCallbacks.splice(c.spyCallbacks.indexOf(spyHandler), 1); }); if (scrollSpy.spySetState && scrollSpy.spySetState.length) { scrollSpy.spySetState.splice(scrollSpy.spySetState.indexOf(stateHandler), 1); } document.removeEventListener('scroll', scrollSpy.scrollHandler); }, update: function update() { return scrollSpy.scrollSpyContainers.forEach(function (c) { return scrollSpy.scrollHandler(c); }); } }; exports.default = scrollSpy;