UNPKG

@angular/cdk

Version:

Angular Material Component Development Kit

107 lines (104 loc) 3.36 kB
import * as i0 from '@angular/core'; import { inject, NgZone, RendererFactory2, Injectable } from '@angular/core'; import { Subject, Observable } from 'rxjs'; import { filter, shareReplay, takeUntil } from 'rxjs/operators'; const loopLimitExceededErrorHandler = e => { if (e instanceof ErrorEvent && e.message === 'ResizeObserver loop limit exceeded') { console.error(`${e.message}. This could indicate a performance issue with your app. See https://github.com/WICG/resize-observer/blob/master/explainer.md#error-handling`); } }; class SingleBoxSharedResizeObserver { _box; _destroyed = new Subject(); _resizeSubject = new Subject(); _resizeObserver; _elementObservables = new Map(); constructor(_box) { this._box = _box; if (typeof ResizeObserver !== 'undefined') { this._resizeObserver = new ResizeObserver(entries => this._resizeSubject.next(entries)); } } observe(target) { if (!this._elementObservables.has(target)) { this._elementObservables.set(target, new Observable(observer => { const subscription = this._resizeSubject.subscribe(observer); this._resizeObserver?.observe(target, { box: this._box }); return () => { this._resizeObserver?.unobserve(target); subscription.unsubscribe(); this._elementObservables.delete(target); }; }).pipe(filter(entries => entries.some(entry => entry.target === target)), shareReplay({ bufferSize: 1, refCount: true }), takeUntil(this._destroyed))); } return this._elementObservables.get(target); } destroy() { this._destroyed.next(); this._destroyed.complete(); this._resizeSubject.complete(); this._elementObservables.clear(); } } class SharedResizeObserver { _cleanupErrorListener; _observers = new Map(); _ngZone = inject(NgZone); constructor() { if (typeof ResizeObserver !== 'undefined' && (typeof ngDevMode === 'undefined' || ngDevMode)) { this._ngZone.runOutsideAngular(() => { const renderer = inject(RendererFactory2).createRenderer(null, null); this._cleanupErrorListener = renderer.listen('window', 'error', loopLimitExceededErrorHandler); }); } } ngOnDestroy() { for (const [, observer] of this._observers) { observer.destroy(); } this._observers.clear(); this._cleanupErrorListener?.(); } observe(target, options) { const box = options?.box || 'content-box'; if (!this._observers.has(box)) { this._observers.set(box, new SingleBoxSharedResizeObserver(box)); } return this._observers.get(box).observe(target); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SharedResizeObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SharedResizeObserver, providedIn: 'root' }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.0", ngImport: i0, type: SharedResizeObserver, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [] }); export { SharedResizeObserver }; //# sourceMappingURL=observers-private.mjs.map