Skip to content

Instantly share code, notes, and snippets.

@DaSchTour
Created February 1, 2021 11:17
Show Gist options
  • Save DaSchTour/1e90d9d59221bb8a618a7721beb5c517 to your computer and use it in GitHub Desktop.
Save DaSchTour/1e90d9d59221bb8a618a7721beb5c517 to your computer and use it in GitHub Desktop.
import { Injectable } from '@angular/core';
import { isNil } from 'lodash-es';
import { ReplaySubject } from 'rxjs';
import { filter, finalize, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
})
export class ResizeObserverService {
private readonly entries: ReplaySubject<Array<ResizeObserverEntry>> = new ReplaySubject(1);
private readonly observer: ResizeObserver = new ResizeObserver((entries) => this.entries.next(entries));
public observe(element: HTMLElement, options?: ResizeObserverObserveOptions) {
this.observer.observe(element, options);
return this.entries.pipe(
map((entries) => entries.find((entry) => entry.target === element)),
filter((entry) => !isNil(entry)),
finalize(() => this.observer.unobserve(element)),
);
}
public unobserve(element: HTMLElement) {
return this.observer.unobserve(element);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment