UNPKG

ng-spy

Version:

A lightweight, dependecy-free scrollspy for angular. Use this library to spy on HTML elements on your page when the window is scrolled or resized.

82 lines 9.55 kB
import { isPlatformBrowser } from '@angular/common'; import { Inject, Injectable, PLATFORM_ID } from '@angular/core'; import { EMPTY, fromEvent } from 'rxjs'; import { auditTime } from 'rxjs/operators'; import { RESIZE_TIME_THRESHOLD } from './tokens/resize-threshold.token'; import { SCROLL_TIME_THRESHOLD } from './tokens/scroll-threshold.token'; import * as i0 from "@angular/core"; export class WindowService { constructor(platformId, resizeTime, scrollTime) { this.resizeTime = resizeTime; this.scrollTime = scrollTime; this.isBrowser = true; if (!isPlatformBrowser(platformId)) { this.isBrowser = false; this.scrollEvent$ = this.resizeEvent$ = EMPTY; } else { this.scrollEvent$ = fromEvent(window, 'scroll', { passive: true }).pipe(auditTime(this.scrollTime)); this.resizeEvent$ = fromEvent(window, 'resize', { passive: true }).pipe(auditTime(this.resizeTime)); } } getScrollEventForContainer(scrollContainer) { if (!this.isBrowser) { return EMPTY; } return fromEvent(scrollContainer.nativeElement, 'scroll', { passive: true }).pipe(auditTime(this.scrollTime)); } get scrollEvent() { return this.scrollEvent$; } get resizeEvent() { return this.resizeEvent$; } get scrollTop() { if (!this.isBrowser) { return 0; } return Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop); } get viewportHeight() { if (!this.isBrowser) { return 0; } return Math.max(document.documentElement.clientHeight, window.innerHeight || 0); } getElementHeight(el) { if (!this.isBrowser) { return 0; } return el.nativeElement.offsetHeight; } getElementOffsetTop(el) { if (!this.isBrowser) { return 0; } return el.nativeElement.offsetTop; } getElementScrollTop(el) { if (!this.isBrowser) { return 0; } return el.nativeElement.scrollTop; } } WindowService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: WindowService, deps: [{ token: PLATFORM_ID }, { token: RESIZE_TIME_THRESHOLD }, { token: SCROLL_TIME_THRESHOLD }], target: i0.ɵɵFactoryTarget.Injectable }); WindowService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: WindowService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: WindowService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: undefined, decorators: [{ type: Inject, args: [RESIZE_TIME_THRESHOLD] }] }, { type: undefined, decorators: [{ type: Inject, args: [SCROLL_TIME_THRESHOLD] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1zcHkvc3JjL2xpYi93aW5kb3cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQWMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQU14RSxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUN1QixVQUFVLEVBQ1EsVUFBa0IsRUFDbEIsVUFBa0I7UUFEbEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBUG5ELGNBQVMsR0FBRyxJQUFJLENBQUM7UUFTdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDL0M7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3JHO0lBQ0gsQ0FBQztJQUVELDBCQUEwQixDQUFDLGVBQTJCO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxPQUFPLFNBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBYztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUN2QyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsRUFBYztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsRUFBYztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNuQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUNwQyxDQUFDOzswR0F6RVUsYUFBYSxrQkFNZCxXQUFXLGFBQ1gscUJBQXFCLGFBQ3JCLHFCQUFxQjs4R0FScEIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU9JLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMscUJBQXFCOzswQkFDNUIsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3QsIEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhdWRpdFRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSRVNJWkVfVElNRV9USFJFU0hPTEQgfSBmcm9tICcuL3Rva2Vucy9yZXNpemUtdGhyZXNob2xkLnRva2VuJztcbmltcG9ydCB7IFNDUk9MTF9USU1FX1RIUkVTSE9MRCB9IGZyb20gJy4vdG9rZW5zL3Njcm9sbC10aHJlc2hvbGQudG9rZW4nO1xuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdpbmRvd1NlcnZpY2Uge1xuICBwcml2YXRlIGlzQnJvd3NlciA9IHRydWU7XG4gIHByaXZhdGUgc2Nyb2xsRXZlbnQkOiBPYnNlcnZhYmxlPEV2ZW50PjtcbiAgcHJpdmF0ZSByZXNpemVFdmVudCQ6IE9ic2VydmFibGU8RXZlbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQsXG4gICAgQEluamVjdChSRVNJWkVfVElNRV9USFJFU0hPTEQpIHByaXZhdGUgcmVzaXplVGltZTogbnVtYmVyLFxuICAgIEBJbmplY3QoU0NST0xMX1RJTUVfVEhSRVNIT0xEKSBwcml2YXRlIHNjcm9sbFRpbWU6IG51bWJlclxuICApIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLmlzQnJvd3NlciA9IGZhbHNlO1xuICAgICAgdGhpcy5zY3JvbGxFdmVudCQgPSB0aGlzLnJlc2l6ZUV2ZW50JCA9IEVNUFRZO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbEV2ZW50JCA9IGZyb21FdmVudCh3aW5kb3csICdzY3JvbGwnLCB7IHBhc3NpdmU6IHRydWUgfSkucGlwZShhdWRpdFRpbWUodGhpcy5zY3JvbGxUaW1lKSk7XG4gICAgICB0aGlzLnJlc2l6ZUV2ZW50JCA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnLCB7IHBhc3NpdmU6IHRydWUgfSkucGlwZShhdWRpdFRpbWUodGhpcy5yZXNpemVUaW1lKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2Nyb2xsRXZlbnRGb3JDb250YWluZXIoc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tRXZlbnQoc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnLCB7IHBhc3NpdmU6IHRydWUgfSkucGlwZShhdWRpdFRpbWUodGhpcy5zY3JvbGxUaW1lKSk7XG4gIH1cblxuICBnZXQgc2Nyb2xsRXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2Nyb2xsRXZlbnQkO1xuICB9XG5cbiAgZ2V0IHJlc2l6ZUV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLnJlc2l6ZUV2ZW50JDtcbiAgfVxuXG4gIGdldCBzY3JvbGxUb3AoKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWF4KHdpbmRvdy5wYWdlWU9mZnNldCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApO1xuICB9XG5cbiAgZ2V0IHZpZXdwb3J0SGVpZ2h0KCkge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gIH1cblxuICBnZXRFbGVtZW50SGVpZ2h0KGVsOiBFbGVtZW50UmVmKSB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICB9XG5cbiAgZ2V0RWxlbWVudE9mZnNldFRvcChlbDogRWxlbWVudFJlZikge1xuICAgIGlmICghdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBlbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcDtcbiAgfVxuXG4gIGdldEVsZW1lbnRTY3JvbGxUb3AoZWw6IEVsZW1lbnRSZWYpIHtcbiAgICBpZiAoIXRoaXMuaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cbn1cbiJdfQ==