{"version":3,"file":"ngxtension-inject-is-intersecting.mjs","sources":["../../../../libs/ngxtension/inject-is-intersecting/src/is-in-viewport.service.ts","../../../../libs/ngxtension/inject-is-intersecting/src/inject-is-intersecting.ts","../../../../libs/ngxtension/inject-is-intersecting/src/ngxtension-inject-is-intersecting.ts"],"sourcesContent":["import { inject, Injectable, NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n@Injectable({ providedIn: 'root' })\nexport class IsInViewportService implements IsInViewportServiceInterface {\n\tprivate ngZone = inject(NgZone);\n\n\t#observerListeners = new Map<Element, Subject<IntersectionObserverEntry>>();\n\n\t#observer?: IntersectionObserver;\n\n\t#createObserver() {\n\t\tthis.#observer = this.ngZone.runOutsideAngular(() => {\n\t\t\treturn new IntersectionObserver((entries) => {\n\t\t\t\tfor (const entry of entries) {\n\t\t\t\t\tthis.intersect(entry.target, entry);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tobserve(element: Element) {\n\t\tif (!this.#observer) {\n\t\t\tthis.#createObserver();\n\t\t}\n\n\t\tif (this.#observerListeners.has(element)) {\n\t\t\treturn this.#observerListeners.get(element)!;\n\t\t}\n\n\t\tthis.#observerListeners.set(\n\t\t\telement,\n\t\t\tnew Subject<IntersectionObserverEntry>(),\n\t\t);\n\t\tthis.#observer?.observe(element);\n\n\t\treturn this.#observerListeners.get(element)!;\n\t}\n\n\tunobserve(element: Element) {\n\t\tthis.#observer?.unobserve(element);\n\n\t\tthis.#observerListeners.get(element)?.complete();\n\t\tthis.#observerListeners.delete(element);\n\n\t\tif (this.#observerListeners.size === 0) {\n\t\t\tthis.#disconnect();\n\t\t}\n\t}\n\n\tintersect(element: Element, entry: IntersectionObserverEntry) {\n\t\tconst subject = this.#observerListeners.get(element);\n\t\t// only emit if the subject is subscribed to\n\t\tif (subject?.observed) {\n\t\t\tthis.ngZone.run(() => subject.next(entry));\n\t\t}\n\t}\n\n\t#disconnect() {\n\t\tthis.#observer?.disconnect();\n\t\tthis.#observer = undefined;\n\t}\n}\n\nexport interface IsInViewportServiceInterface {\n\tobserve(element: Element): Subject<IntersectionObserverEntry>;\n\tunobserve(element: Element): void;\n\tintersect(element: Element, entry: IntersectionObserverEntry): void;\n}\n","import { DestroyRef, ElementRef, inject, Injector } from '@angular/core';\nimport { assertInjector } from 'ngxtension/assert-injector';\nimport { injectDestroy } from 'ngxtension/inject-destroy';\nimport { IsInViewportService } from './is-in-viewport.service';\n\nexport interface InjectIsIntersectingOptions {\n\tinjector?: Injector;\n\telement?: Element;\n}\n\n/**\n * Injects an observable that emits whenever the element is intersecting the viewport.\n * The observable will complete when the element is destroyed.\n * @param options\n *\n * @example\n * export class MyComponent {\n *   private destroyRef = inject(DestroyRef);\n *\n *   isIntersecting$ = injectIsIntersecting();\n *   isInViewport$ = this.isIntersecting$.pipe(\n *     filter(x => x.intersectionRatio > 0),\n *     take(1),\n *   );\n *\n *   ngOnInit() {\n *     this.getData().subscribe();\n *   }\n *\n *   getData() {\n *     // Only fetch data when the element is in the viewport\n *     return this.isInViewport$.pipe(\n *       switchMap(() => this.service.getData()),\n *       takeUntil(this.destroy$)\n *     );\n *   }\n * }\n */\nexport const injectIsIntersecting = ({\n\tinjector,\n\telement,\n}: InjectIsIntersectingOptions = {}) => {\n\treturn assertInjector(injectDestroy, injector, () => {\n\t\tconst el = element ?? inject(ElementRef).nativeElement;\n\t\tconst inInViewportService = inject(IsInViewportService);\n\t\tconst destroyRef = inject(DestroyRef);\n\n\t\tconst sub = inInViewportService.observe(el);\n\n\t\tdestroyRef.onDestroy(() => {\n\t\t\tinInViewportService.unobserve(el);\n\t\t});\n\n\t\treturn sub;\n\t});\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}