@angular/cdk
Version:
Angular Material Component Development Kit
107 lines (104 loc) • 3.36 kB
JavaScript
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