react-scroll-tracker
Version:
A React hook to help with scroll tracking events, which supports typescript.
78 lines (77 loc) • 3.23 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var react_1 = require("react");
var useScrollTracker = function (trackScrollDepths, callback) {
var _a = react_1.useState({
scrollDepths: trackScrollDepths,
scrollY: 0
}), state = _a[0], setState = _a[1];
var scrollDepths = state.scrollDepths, scrollY = state.scrollY;
react_1.useEffect(function () {
if (typeof window === 'undefined' || window.pageYOffset === 0) {
return;
}
setState(function (oldState) { return (__assign(__assign({}, oldState), { scrollY: window.pageYOffset })); });
}, []);
react_1.useEffect(function () {
if (typeof window === 'undefined') {
return;
}
var endScrollTracker = function () {
return window.removeEventListener('scroll', handleScroll);
};
var handleScroll = function () {
var h = document.documentElement;
var b = document.body;
var scrollTop = h.scrollTop || b.scrollTop;
var scrollHeight = h.scrollHeight || b.scrollHeight;
var clientHeight = h.clientHeight;
var scrollPercent = (scrollTop / (scrollHeight - clientHeight)) * 100;
if (scrollDepths) {
var nextMinDepth_1 = Math.min.apply(Math, __spreadArrays(scrollDepths, [scrollHeight]));
if (scrollPercent >= nextMinDepth_1) {
var updatedScrollDepths = scrollDepths.filter(function (depth) { return depth !== nextMinDepth_1; });
if (updatedScrollDepths.length === 0) {
endScrollTracker();
}
if (callback) {
callback({
scrollY: nextMinDepth_1,
scrollPercent: scrollPercent,
remainingDepths: updatedScrollDepths,
});
}
setState({
scrollY: nextMinDepth_1,
scrollDepths: updatedScrollDepths,
});
}
}
else {
setState(__assign(__assign({}, state), { scrollY: scrollPercent }));
}
};
window.addEventListener('scroll', handleScroll);
return endScrollTracker;
}, [scrollDepths, scrollY, state]);
return { scrollY: scrollY };
};
exports.default = useScrollTracker;