ngx-infinite-scroll
Version:
[](https://travis-ci.org/orizens/ngx-infinite-scroll) [](#backers) [![Sponso
65 lines • 11.4 kB
JavaScript
import { of, fromEvent } from 'rxjs';
import { map, mergeMap, tap, throttleTime, filter } from 'rxjs/operators';
import { AxisResolver } from './axis-resolver';
import { shouldTriggerEvents } from './event-trigger';
import { resolveContainerElement } from './ngx-ins-utils';
import { calculatePoints, createResolver } from './position-resolver';
import * as ScrollResolver from './scroll-resolver';
import { ScrollState } from './scroll-state';
export function createScroller(config) {
const { scrollContainer, scrollWindow, element, fromRoot } = config;
const resolver = createResolver({
axis: new AxisResolver(!config.horizontal),
windowElement: resolveContainerElement(scrollContainer, scrollWindow, element, fromRoot),
});
const scrollState = new ScrollState({
totalToScroll: calculatePoints(element, resolver).totalToScroll,
});
const options = {
container: resolver.container,
throttle: config.throttle,
};
const distance = {
up: config.upDistance,
down: config.downDistance,
};
return attachScrollEvent(options).pipe(mergeMap(() => of(calculatePoints(element, resolver))), map((positionStats) => toInfiniteScrollParams(scrollState.lastScrollPosition, positionStats, distance)), tap(({ stats }) => scrollState.updateScroll(stats.scrolled, stats.totalToScroll)), filter(({ fire, scrollDown, stats: { totalToScroll } }) => shouldTriggerEvents(config.alwaysCallback, fire, scrollState.isTriggeredScroll(totalToScroll, scrollDown))), tap(({ scrollDown, stats: { totalToScroll } }) => {
scrollState.updateTriggeredFlag(totalToScroll, scrollDown);
}), map(toInfiniteScrollAction));
}
export function attachScrollEvent(options) {
let obs = fromEvent(options.container, 'scroll');
// For an unknown reason calling `sampleTime()` causes trouble for many users, even with `options.throttle = 0`.
// Let's avoid calling the function unless needed.
// Replacing with throttleTime seems to solve the problem
// See https://github.com/orizens/ngx-infinite-scroll/issues/198
if (options.throttle) {
obs = obs.pipe(throttleTime(options.throttle, undefined, {
leading: true,
trailing: true,
}));
}
return obs;
}
export function toInfiniteScrollParams(lastScrollPosition, stats, distance) {
const { scrollDown, fire } = ScrollResolver.getScrollStats(lastScrollPosition, stats, distance);
return {
scrollDown,
fire,
stats,
};
}
export const InfiniteScrollActions = {
DOWN: '[NGX_ISE] DOWN',
UP: '[NGX_ISE] UP',
};
export function toInfiniteScrollAction(response) {
const { scrollDown, stats: { scrolled: currentScrollPosition }, } = response;
return {
type: scrollDown ? InfiniteScrollActions.DOWN : InfiniteScrollActions.UP,
payload: {
currentScrollPosition,
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXJlZ2lzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWluZmluaXRlLXNjcm9sbC9zcmMvbGliL3NlcnZpY2VzL3Njcm9sbC1yZWdpc3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxjQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBd0I7SUFDckQsTUFBTSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNwRSxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMxQyxhQUFhLEVBQUUsdUJBQXVCLENBQ3BDLGVBQWUsRUFDZixZQUFZLEVBQ1osT0FBTyxFQUNQLFFBQVEsQ0FDVDtLQUNGLENBQUMsQ0FBQztJQUNILE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO1FBQ2xDLGFBQWEsRUFBRSxl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Q0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7UUFDeEUsT0FBTyxFQUFFO1lBQ1AscUJBQXFCO1NBQ3RCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIG1lcmdlTWFwLCB0YXAsIHRocm90dGxlVGltZSwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgKiBhcyBNb2RlbHMgZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEF4aXNSZXNvbHZlciB9IGZyb20gJy4vYXhpcy1yZXNvbHZlcic7XG5pbXBvcnQgeyBzaG91bGRUcmlnZ2VyRXZlbnRzIH0gZnJvbSAnLi9ldmVudC10cmlnZ2VyJztcbmltcG9ydCB7IHJlc29sdmVDb250YWluZXJFbGVtZW50IH0gZnJvbSAnLi9uZ3gtaW5zLXV0aWxzJztcbmltcG9ydCB7IGNhbGN1bGF0ZVBvaW50cywgY3JlYXRlUmVzb2x2ZXIgfSBmcm9tICcuL3Bvc2l0aW9uLXJlc29sdmVyJztcbmltcG9ydCAqIGFzIFNjcm9sbFJlc29sdmVyIGZyb20gJy4vc2Nyb2xsLXJlc29sdmVyJztcbmltcG9ydCB7IFNjcm9sbFN0YXRlIH0gZnJvbSAnLi9zY3JvbGwtc3RhdGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2Nyb2xsZXIoY29uZmlnOiBNb2RlbHMuSVNjcm9sbGVyKSB7XG4gIGNvbnN0IHsgc2Nyb2xsQ29udGFpbmVyLCBzY3JvbGxXaW5kb3csIGVsZW1lbnQsIGZyb21Sb290IH0gPSBjb25maWc7XG4gIGNvbnN0IHJlc29sdmVyID0gY3JlYXRlUmVzb2x2ZXIoe1xuICAgIGF4aXM6IG5ldyBBeGlzUmVzb2x2ZXIoIWNvbmZpZy5ob3Jpem9udGFsKSxcbiAgICB3aW5kb3dFbGVtZW50OiByZXNvbHZlQ29udGFpbmVyRWxlbWVudChcbiAgICAgIHNjcm9sbENvbnRhaW5lcixcbiAgICAgIHNjcm9sbFdpbmRvdyxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBmcm9tUm9vdFxuICAgICksXG4gIH0pO1xuICBjb25zdCBzY3JvbGxTdGF0ZSA9IG5ldyBTY3JvbGxTdGF0ZSh7XG4gICAgdG90YWxUb1Njcm9sbDogY2FsY3VsYXRlUG9pbnRzKGVsZW1lbnQsIHJlc29sdmVyKS50b3RhbFRvU2Nyb2xsLFxuICB9KTtcbiAgY29uc3Qgb3B0aW9uczogTW9kZWxzLklTY3JvbGxSZWdpc3RlckNvbmZpZyA9IHtcbiAgICBjb250YWluZXI6IHJlc29sdmVyLmNvbnRhaW5lcixcbiAgICB0aHJvdHRsZTogY29uZmlnLnRocm90dGxlLFxuICB9O1xuICBjb25zdCBkaXN0YW5jZSA9IHtcbiAgICB1cDogY29uZmlnLnVwRGlzdGFuY2UsXG4gICAgZG93bjogY29uZmlnLmRvd25EaXN0YW5jZSxcbiAgfTtcbiAgcmV0dXJuIGF0dGFjaFNjcm9sbEV2ZW50KG9wdGlvbnMpLnBpcGUoXG4gICAgbWVyZ2VNYXAoKCkgPT4gb2YoY2FsY3VsYXRlUG9pbnRzKGVsZW1lbnQsIHJlc29sdmVyKSkpLFxuICAgIG1hcCgocG9zaXRpb25TdGF0czogTW9kZWxzLklQb3NpdGlvblN0YXRzKSA9PlxuICAgICAgdG9JbmZpbml0ZVNjcm9sbFBhcmFtcyhcbiAgICAgICAgc2Nyb2xsU3RhdGUubGFzdFNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBwb3NpdGlvblN0YXRzLFxuICAgICAgICBkaXN0YW5jZVxuICAgICAgKVxuICAgICksXG4gICAgdGFwKCh7IHN0YXRzIH06IE1vZGVscy5JU2Nyb2xsUGFyYW1zKSA9PlxuICAgICAgc2Nyb2xsU3RhdGUudXBkYXRlU2Nyb2xsKHN0YXRzLnNjcm9sbGVkLCBzdGF0cy50b3RhbFRvU2Nyb2xsKVxuICAgICksXG4gICAgZmlsdGVyKFxuICAgICAgKHsgZmlyZSwgc2Nyb2xsRG93biwgc3RhdHM6IHsgdG90YWxUb1Njcm9sbCB9IH06IE1vZGVscy5JU2Nyb2xsUGFyYW1zKSA9PlxuICAgICAgICBzaG91bGRUcmlnZ2VyRXZlbnRzKFxuICAgICAgICAgIGNvbmZpZy5hbHdheXNDYWxsYmFjayxcbiAgICAgICAgICBmaXJlLFxuICAgICAgICAgIHNjcm9sbFN0YXRlLmlzVHJpZ2dlcmVkU2Nyb2xsKHRvdGFsVG9TY3JvbGwsIHNjcm9sbERvd24pXG4gICAgICAgIClcbiAgICApLFxuICAgIHRhcCgoeyBzY3JvbGxEb3duLCBzdGF0czogeyB0b3RhbFRvU2Nyb2xsIH0gfTogTW9kZWxzLklTY3JvbGxQYXJhbXMpID0+IHtcbiAgICAgIHNjcm9sbFN0YXRlLnVwZGF0ZVRyaWdnZXJlZEZsYWcodG90YWxUb1Njcm9sbCwgc2Nyb2xsRG93bik7XG4gICAgfSksXG4gICAgbWFwKHRvSW5maW5pdGVTY3JvbGxBY3Rpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hTY3JvbGxFdmVudChcbiAgb3B0aW9uczogTW9kZWxzLklTY3JvbGxSZWdpc3RlckNvbmZpZ1xuKTogT2JzZXJ2YWJsZTx7fT4ge1xuICBsZXQgb2JzID0gZnJvbUV2ZW50KG9wdGlvbnMuY29udGFpbmVyLCAnc2Nyb2xsJyk7XG4gIC8vIEZvciBhbiB1bmtub3duIHJlYXNvbiBjYWxsaW5nIGBzYW1wbGVUaW1lKClgIGNhdXNlcyB0cm91YmxlIGZvciBtYW55IHVzZXJzLCBldmVuIHdpdGggYG9wdGlvbnMudGhyb3R0bGUgPSAwYC5cbiAgLy8gTGV0J3MgYXZvaWQgY2FsbGluZyB0aGUgZnVuY3Rpb24gdW5sZXNzIG5lZWRlZC5cbiAgLy8gUmVwbGFjaW5nIHdpdGggdGhyb3R0bGVUaW1lIHNlZW1zIHRvIHNvbHZlIHRoZSBwcm9ibGVtXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vb3JpemVucy9uZ3gtaW5maW5pdGUtc2Nyb2xsL2lzc3Vlcy8xOThcbiAgaWYgKG9wdGlvbnMudGhyb3R0bGUpIHtcbiAgICBvYnMgPSBvYnMucGlwZShcbiAgICAgIHRocm90dGxlVGltZShvcHRpb25zLnRocm90dGxlLCB1bmRlZmluZWQsIHtcbiAgICAgICAgbGVhZGluZzogdHJ1ZSxcbiAgICAgICAgdHJhaWxpbmc6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG9icyBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b0luZmluaXRlU2Nyb2xsUGFyYW1zKFxuICBsYXN0U2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgc3RhdHM6IE1vZGVscy5JUG9zaXRpb25TdGF0cyxcbiAgZGlzdGFuY2U6IE1vZGVscy5JU2Nyb2xsZXJEaXN0YW5jZVxuKTogTW9kZWxzLklTY3JvbGxQYXJhbXMge1xuICBjb25zdCB7IHNjcm9sbERvd24sIGZpcmUgfSA9IFNjcm9sbFJlc29sdmVyLmdldFNjcm9sbFN0YXRzKFxuICAgIGxhc3RTY3JvbGxQb3NpdGlvbixcbiAgICBzdGF0cyxcbiAgICBkaXN0YW5jZVxuICApO1xuICByZXR1cm4ge1xuICAgIHNjcm9sbERvd24sXG4gICAgZmlyZSxcbiAgICBzdGF0cyxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEluZmluaXRlU2Nyb2xsQWN0aW9ucyA9IHtcbiAgRE9XTjogJ1tOR1hfSVNFXSBET1dOJyxcbiAgVVA6ICdbTkdYX0lTRV0gVVAnLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvSW5maW5pdGVTY3JvbGxBY3Rpb24oXG4gIHJlc3BvbnNlOiBNb2RlbHMuSVNjcm9sbFBhcmFtc1xuKTogTW9kZWxzLklJbmZpbml0ZVNjcm9sbEFjdGlvbiB7XG4gIGNvbnN0IHtcbiAgICBzY3JvbGxEb3duLFxuICAgIHN0YXRzOiB7IHNjcm9sbGVkOiBjdXJyZW50U2Nyb2xsUG9zaXRpb24gfSxcbiAgfSA9IHJlc3BvbnNlO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHNjcm9sbERvd24gPyBJbmZpbml0ZVNjcm9sbEFjdGlvbnMuRE9XTiA6IEluZmluaXRlU2Nyb2xsQWN0aW9ucy5VUCxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBjdXJyZW50U2Nyb2xsUG9zaXRpb24sXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==