@rx-angular/template
Version:
**Fully** Reactive Component Template Rendering in Angular. @rx-angular/template aims to be a reflection of Angular's built in renderings just reactive.
1 lines • 9.46 kB
Source Map (JSON)
{"version":3,"file":"template-experimental-viewport-prio.mjs","sources":["../../../../libs/template/experimental/viewport-prio/src/lib/viewport-prio.directive.ts","../../../../libs/template/experimental/viewport-prio/src/lib/viewport-prio.module.ts","../../../../libs/template/experimental/viewport-prio/src/template-experimental-viewport-prio.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n} from '@angular/core';\nimport { coerceObservableWith } from '@rx-angular/cdk/coercing';\nimport { RxNotification } from '@rx-angular/cdk/notifications';\nimport { RxStrategyProvider } from '@rx-angular/cdk/render-strategies';\nimport { RxLet } from '@rx-angular/template/let';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { filter, map, mergeAll, withLatestFrom } from 'rxjs/operators';\n\nfunction intersectionObserver(options?: object): {\n observe: (target: Element) => void;\n unobserve: (target: Element) => void;\n entries$: Observable<any>;\n} {\n const subject = new Subject();\n const observer = observerSupported()\n ? new IntersectionObserver((entries) => {\n entries.forEach((entry) => subject.next(entry));\n }, options)\n : null;\n\n const entries$ = new Observable((subscriber) => {\n subject.subscribe(subscriber);\n return () => {\n if (observer) {\n observer.disconnect();\n }\n };\n });\n\n return {\n entries$,\n observe: observer.observe,\n unobserve: observer.unobserve,\n };\n}\n\nconst observerSupported = () =>\n typeof window !== 'undefined'\n ? !!(window as any).IntersectionObserver\n : false;\n\n@Directive({\n selector: '[viewport-prio]',\n standalone: true,\n})\nexport class ViewportPrioDirective implements OnInit, OnDestroy {\n // Note that we're picking only the `intersectionRatio` property\n // since this is the only property that we're intersted in.\n entriesSubject = new Subject<\n Pick<IntersectionObserverEntry, 'intersectionRatio'>[]\n >();\n\n entries$: Observable<Pick<IntersectionObserverEntry, 'intersectionRatio'>> =\n this.entriesSubject.pipe(mergeAll());\n\n _viewportPrioObservables = new BehaviorSubject<Observable<string> | string>(\n of('noop')\n );\n _viewportPrio = this._viewportPrioObservables.pipe(\n coerceObservableWith(),\n mergeAll(),\n map((v) => (!v ? 'noop' : v))\n );\n @Input('viewport-prio')\n set viewportPrio(prio: string | Observable<string>) {\n this._viewportPrioObservables.next(prio);\n }\n\n private observer: IntersectionObserver | null = observerSupported()\n ? new IntersectionObserver(\n (entries) => {\n this.entriesSubject.next(entries);\n },\n {\n threshold: 0,\n }\n )\n : null;\n\n visibilityEvents$ = this.entries$.pipe(\n map((entry) => {\n if (entry.intersectionRatio > 0) {\n return 'visible';\n } else {\n return 'invisible';\n }\n })\n );\n\n constructor(\n private readonly el: ElementRef<HTMLElement>,\n private strategyProvider: RxStrategyProvider,\n @Inject(RxLet)\n @Optional()\n private letDirective: RxLet<any> | null\n ) {}\n\n ngOnInit() {\n const letStrategyName$ = this.strategyProvider.primaryStrategy$.pipe(\n map(({ name }) => name)\n );\n\n let lastValue = undefined;\n // @TODO add a connect here to get rid of the subscribe\n this.letDirective.values$\n .pipe(filter((n: RxNotification<any>) => n.kind === 'next'))\n .subscribe((v) => {\n lastValue = v;\n });\n\n this.visibilityEvents$\n .pipe(\n withLatestFrom(\n combineLatest(letStrategyName$, this._viewportPrio).pipe(\n filter(([newN, oldN]) => newN !== oldN)\n )\n ),\n map(([visibility, strategyNames]) => {\n const [inStrategyName, outStrategyName] = strategyNames;\n return visibility === 'visible'\n ? [visibility, inStrategyName]\n : [visibility, outStrategyName];\n })\n )\n .subscribe(([visibility, strategyName]) => {\n if (this.letDirective !== null) {\n this.letDirective.strategy = strategyName as string;\n }\n\n if (visibility === 'visible') {\n // render actual state on viewport enter\n // this.letDirective.templateNotification$.next(lastValue);\n }\n });\n\n // If the browser doesn't support the `IntersectionObserver` or we're inside\n // the Node.js environment, then this will throw an exception that property\n // `observe` doesn't exist on `null`.\n if (this.observer !== null) {\n this.observer.observe(this.el.nativeElement);\n } else {\n // If we're inside the Node.js environment then this should be\n // rendered (e.g. for SEO purposes), and when running this code in browser\n // it will decide itself to render it or not.\n this.entriesSubject.next([{ intersectionRatio: 1 }]);\n }\n }\n\n ngOnDestroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ViewportPrioDirective } from './viewport-prio.directive';\n\n/** @deprecated use the standalone import, will be removed with v16 */\n@NgModule({\n imports: [ViewportPrioDirective],\n exports: [ViewportPrioDirective],\n})\nexport class ViewportPrioModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}