UNPKG

@trademe/ng-defer-load

Version:

Angular directive to load elements lazily

1 lines 10.2 kB
{"version":3,"file":"trademe-ng-defer-load.mjs","sources":["../../src/defer-load.directive.ts","../../src/defer-load.module.ts","../../src/trademe-ng-defer-load.ts"],"sourcesContent":["import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { AfterViewInit, Directive, ElementRef, EventEmitter, Inject, Input, NgZone, OnDestroy, OnInit, Output, PLATFORM_ID } from '@angular/core';\nimport { fromEvent, Subscription } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n@Directive({\n selector: '[deferLoad]'\n})\nexport class DeferLoadDirective implements OnInit, AfterViewInit, OnDestroy {\n\n @Input() public preRender: boolean = true;\n @Input() public fallbackEnabled: boolean = true;\n @Input() public removeListenersAfterLoad: boolean = true;\n @Output() public deferLoad: EventEmitter<any> = new EventEmitter();\n\n private _intersectionObserver?: IntersectionObserver;\n private _scrollSubscription?: Subscription;\n\n constructor (\n private _element: ElementRef,\n private _zone: NgZone,\n @Inject(PLATFORM_ID) private platformId: Object\n ) { }\n\n public ngOnInit () {\n if ((isPlatformServer(this.platformId) && this.preRender)\n || (isPlatformBrowser(this.platformId) && !this.fallbackEnabled && !this.hasCompatibleBrowser())) {\n this.load();\n }\n }\n\n public ngAfterViewInit () {\n if (isPlatformBrowser(this.platformId)) {\n if (this.hasCompatibleBrowser()) {\n this.registerIntersectionObserver();\n if (this._intersectionObserver && this._element.nativeElement) {\n this._intersectionObserver.observe(<Element>(this._element.nativeElement));\n }\n } else if (this.fallbackEnabled) {\n this.addScrollListeners();\n }\n }\n }\n\n public hasCompatibleBrowser (): boolean {\n const hasIntersectionObserver = 'IntersectionObserver' in window;\n const userAgent = window.navigator.userAgent;\n const matches = userAgent.match(/Edge\\/(\\d*)\\./i);\n\n const isEdge = !!matches && matches.length > 1;\n const isEdgeVersion16OrBetter = isEdge && (!!matches && parseInt(matches[1], 10) > 15);\n\n return hasIntersectionObserver && (!isEdge || isEdgeVersion16OrBetter);\n }\n\n public ngOnDestroy () {\n this.removeListeners();\n }\n\n private registerIntersectionObserver (): void {\n if (!!this._intersectionObserver) {\n return;\n }\n this._intersectionObserver = new IntersectionObserver(entries => {\n this.checkForIntersection(entries);\n }, {});\n }\n\n private checkForIntersection = (entries: Array<IntersectionObserverEntry>) => {\n entries.forEach((entry: IntersectionObserverEntry) => {\n if (this.checkIfIntersecting(entry)) {\n this.load();\n if (this._intersectionObserver && this._element.nativeElement) {\n this._intersectionObserver.unobserve(<Element>(this._element.nativeElement));\n }\n }\n });\n }\n\n private checkIfIntersecting (entry: IntersectionObserverEntry) {\n // For Samsung native browser, IO has been partially implemented whereby the\n // callback fires, but entry object is empty. We will check manually.\n if (entry && entry.time) {\n return entry.isIntersecting && entry.target === this._element.nativeElement;\n }\n return this.isVisible();\n }\n\n private load (): void {\n if (this.removeListenersAfterLoad) {\n this.removeListeners();\n }\n this.deferLoad.emit();\n }\n\n private addScrollListeners () {\n if (this.isVisible()) {\n this.load();\n return;\n }\n this._zone.runOutsideAngular(() => {\n this._scrollSubscription = fromEvent(window, 'scroll')\n .pipe(debounceTime(50))\n .subscribe(this.onScroll);\n });\n }\n\n private removeListeners () {\n this._scrollSubscription?.unsubscribe();\n this._intersectionObserver?.disconnect();\n }\n\n private onScroll = () => {\n if (this.isVisible()) {\n this._zone.run(() => this.load());\n }\n }\n\n private isVisible () {\n let scrollPosition = this.getScrollPosition();\n let elementOffset = this._element.nativeElement.getBoundingClientRect().top + window.scrollY;\n return elementOffset <= scrollPosition;\n }\n\n private getScrollPosition () {\n // Getting screen size and scroll position for IE\n return window.scrollY + (document.documentElement.clientHeight || document.body.clientHeight);\n }\n}\n","import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {DeferLoadDirective} from './defer-load.directive';\n@NgModule({\n imports: [CommonModule],\n declarations: [DeferLoadDirective],\n exports: [DeferLoadDirective]\n})\nexport class DeferLoadModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}