mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.3 KiB
106 lines
3.3 KiB
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.3",
|
|
ngImport: i0,
|
|
type: SharedResizeObserver,
|
|
deps: [],
|
|
target: i0.ɵɵFactoryTarget.Injectable
|
|
});
|
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
minVersion: "12.0.0",
|
|
version: "21.0.3",
|
|
ngImport: i0,
|
|
type: SharedResizeObserver,
|
|
providedIn: 'root'
|
|
});
|
|
}
|
|
i0.ɵɵngDeclareClassMetadata({
|
|
minVersion: "12.0.0",
|
|
version: "21.0.3",
|
|
ngImport: i0,
|
|
type: SharedResizeObserver,
|
|
decorators: [{
|
|
type: Injectable,
|
|
args: [{
|
|
providedIn: 'root'
|
|
}]
|
|
}],
|
|
ctorParameters: () => []
|
|
});
|
|
|
|
export { SharedResizeObserver };
|
|
//# sourceMappingURL=observers-private.mjs.map
|
|
|