{"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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"}