ngx-infinite-scroller
Version:
Infinite bidirectional scroll directive for Angular 11
40 lines • 6.39 kB
JavaScript
import isNumber from 'is-number';
import { InitialScrollPosition } from '../enum/initial-scroll-position-type.enum';
export class StrategyBase {
constructor(directive, state) {
this.directive = directive;
this.state = state;
}
wasScrolledDown(prevPos, currentPos) {
return prevPos.scrollTop < currentPos.scrollTop;
}
wasScrolledUp(prevPos, currentPos) {
return !this.wasScrolledDown(prevPos, currentPos);
}
isScrollDownEnough(pos, scrollPositionTrigger) {
return ((pos.scrollTop + pos.clientHeight) / pos.scrollHeight) > (scrollPositionTrigger / 100);
}
isScrollUpEnough(pos, scrollPositionTrigger) {
return (pos.scrollTop / pos.scrollHeight) < (scrollPositionTrigger / 100);
}
getInitialScrollPositionValue(defaultScrollPosition) {
const { initialScrollPosition } = this.directive;
if (isNumber(initialScrollPosition)) {
return Number(initialScrollPosition);
}
const initialScrollPositions = this.getInitialScrollPositions();
if (initialScrollPosition === InitialScrollPosition.DEFAULT) {
return initialScrollPositions[defaultScrollPosition];
}
return initialScrollPositions[initialScrollPosition];
}
getInitialScrollPositions() {
const { scrollHeight, clientHeight } = this.state;
return {
[InitialScrollPosition.TOP]: 0,
[InitialScrollPosition.MIDDLE]: scrollHeight / 2 - clientHeight / 2,
[InitialScrollPosition.BOTTOM]: scrollHeight,
};
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyYXRlZ3ktYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8iLCJzb3VyY2VzIjpbInNyYy9hcHAvc2Nyb2xsaW5nLXN0cmF0ZWd5L3N0cmF0ZWd5LWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBTWpDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRWxGLE1BQU0sT0FBZ0IsWUFBWTtJQUNoQyxZQUNZLFNBQXVDLEVBQ3ZDLEtBQTRCO1FBRDVCLGNBQVMsR0FBVCxTQUFTLENBQThCO1FBQ3ZDLFVBQUssR0FBTCxLQUFLLENBQXVCO0lBQ3BDLENBQUM7SUFFSyxlQUFlLENBQUMsT0FBdUIsRUFBRSxVQUEwQjtRQUMzRSxPQUFPLE9BQU8sQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNsRCxDQUFDO0lBRVMsYUFBYSxDQUFDLE9BQXVCLEVBQUUsVUFBMEI7UUFDekUsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxHQUFtQixFQUFFLHFCQUE2QjtRQUM3RSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRVMsZ0JBQWdCLENBQUMsR0FBbUIsRUFBRSxxQkFBNkI7UUFDM0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVTLDZCQUE2QixDQUFDLHFCQUE0QztRQUNsRixNQUFNLEVBQUUscUJBQXFCLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRWpELElBQUksUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDbkMsT0FBTyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN0QztRQUVELE1BQU0sc0JBQXNCLEdBQThCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBRTNGLElBQUkscUJBQXFCLEtBQUsscUJBQXFCLENBQUMsT0FBTyxFQUFFO1lBQzNELE9BQU8sc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN0RDtRQUVELE9BQU8sc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVsRCxPQUFPO1lBQ0wsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlCLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUUsWUFBWSxHQUFHLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQztZQUNuRSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxFQUFFLFlBQVk7U0FDN0MsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpc051bWJlciBmcm9tICdpcy1udW1iZXInO1xuXG5pbXBvcnQgeyBOZ3hJbmZpbml0ZVNjcm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vbmd4LWluZmluaXRlLXNjcm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEaXJlY3RpdmVTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9kaXJlY3RpdmUtc3RhdGUuc2VydmljZSc7XG5cbmltcG9ydCB7IFNjcm9sbFBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWwvc2Nyb2xsLXBvc2l0aW9uLm1vZGVsJztcbmltcG9ydCB7IEluaXRpYWxTY3JvbGxQb3NpdGlvbiB9IGZyb20gJy4uL2VudW0vaW5pdGlhbC1zY3JvbGwtcG9zaXRpb24tdHlwZS5lbnVtJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0cmF0ZWd5QmFzZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBkaXJlY3RpdmU6IE5neEluZmluaXRlU2Nyb2xsZXJEaXJlY3RpdmUsXG4gICAgcHJvdGVjdGVkIHN0YXRlOiBEaXJlY3RpdmVTdGF0ZVNlcnZpY2VcbiAgKSB7IH1cblxuICBwcm90ZWN0ZWQgd2FzU2Nyb2xsZWREb3duKHByZXZQb3M6IFNjcm9sbFBvc2l0aW9uLCBjdXJyZW50UG9zOiBTY3JvbGxQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwcmV2UG9zLnNjcm9sbFRvcCA8IGN1cnJlbnRQb3Muc2Nyb2xsVG9wO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhc1Njcm9sbGVkVXAocHJldlBvczogU2Nyb2xsUG9zaXRpb24sIGN1cnJlbnRQb3M6IFNjcm9sbFBvc2l0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLndhc1Njcm9sbGVkRG93bihwcmV2UG9zLCBjdXJyZW50UG9zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1Njcm9sbERvd25Fbm91Z2gocG9zOiBTY3JvbGxQb3NpdGlvbiwgc2Nyb2xsUG9zaXRpb25UcmlnZ2VyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKChwb3Muc2Nyb2xsVG9wICsgcG9zLmNsaWVudEhlaWdodCkgLyBwb3Muc2Nyb2xsSGVpZ2h0KSA+IChzY3JvbGxQb3NpdGlvblRyaWdnZXIgLyAxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzU2Nyb2xsVXBFbm91Z2gocG9zOiBTY3JvbGxQb3NpdGlvbiwgc2Nyb2xsUG9zaXRpb25UcmlnZ2VyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHBvcy5zY3JvbGxUb3AgLyBwb3Muc2Nyb2xsSGVpZ2h0KSA8IChzY3JvbGxQb3NpdGlvblRyaWdnZXIgLyAxMDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEluaXRpYWxTY3JvbGxQb3NpdGlvblZhbHVlKGRlZmF1bHRTY3JvbGxQb3NpdGlvbjogSW5pdGlhbFNjcm9sbFBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCB7IGluaXRpYWxTY3JvbGxQb3NpdGlvbiB9ID0gdGhpcy5kaXJlY3RpdmU7XG5cbiAgICBpZiAoaXNOdW1iZXIoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKSkge1xuICAgICAgcmV0dXJuIE51bWJlcihpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY3JvbGxQb3NpdGlvbnM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB0aGlzLmdldEluaXRpYWxTY3JvbGxQb3NpdGlvbnMoKTtcblxuICAgIGlmIChpbml0aWFsU2Nyb2xsUG9zaXRpb24gPT09IEluaXRpYWxTY3JvbGxQb3NpdGlvbi5ERUZBVUxUKSB7XG4gICAgICByZXR1cm4gaW5pdGlhbFNjcm9sbFBvc2l0aW9uc1tkZWZhdWx0U2Nyb2xsUG9zaXRpb25dO1xuICAgIH1cblxuICAgIHJldHVybiBpbml0aWFsU2Nyb2xsUG9zaXRpb25zW2luaXRpYWxTY3JvbGxQb3NpdGlvbl07XG4gIH1cblxuICBwcml2YXRlIGdldEluaXRpYWxTY3JvbGxQb3NpdGlvbnMoKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgY29uc3QgeyBzY3JvbGxIZWlnaHQsIGNsaWVudEhlaWdodCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbSW5pdGlhbFNjcm9sbFBvc2l0aW9uLlRPUF06IDAsXG4gICAgICBbSW5pdGlhbFNjcm9sbFBvc2l0aW9uLk1JRERMRV06IHNjcm9sbEhlaWdodCAvIDIgLSBjbGllbnRIZWlnaHQgLyAyLFxuICAgICAgW0luaXRpYWxTY3JvbGxQb3NpdGlvbi5CT1RUT01dOiBzY3JvbGxIZWlnaHQsXG4gICAgfTtcbiAgfVxufVxuIl19