@daredrop/react-scroll
Version:
A scroll component for React.js
102 lines (85 loc) • 3.77 kB
JavaScript
;
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;