in projects/libs/flex-layout/core/media-observer/media-observer.ts [155:191]
private buildObservable(mqList: string[]): Observable<MediaChange[]> {
const hasChanges = (changes: MediaChange[]) => {
const isValidQuery = (change: MediaChange) => (change.mediaQuery.length > 0);
return (changes.filter(isValidQuery).length > 0);
};
const excludeOverlaps = (changes: MediaChange[]) => {
return !this.filterOverlaps ? changes : changes.filter(change => {
const bp = this.breakpoints.findByQuery(change.mediaQuery);
return bp?.overlapping ?? true;
});
};
const ignoreDuplicates = (previous: MediaChange[], current: MediaChange[]): boolean => {
if (previous.length !== current.length) {
return false;
}
const previousMqs = previous.map(mc => mc.mediaQuery);
const currentMqs = new Set(current.map(mc => mc.mediaQuery));
const difference = new Set(previousMqs.filter(mq => !currentMqs.has(mq)));
return difference.size === 0;
};
/**
*/
return this.matchMedia
.observe(this.hook.withPrintQuery(mqList))
.pipe(
filter((change: MediaChange) => change.matches),
debounceTime(0, asapScheduler),
switchMap(_ => of(this.findAllActivations())),
map(excludeOverlaps),
filter(hasChanges),
distinctUntilChanged(ignoreDuplicates),
takeUntil(this.destroyed$)
);
}