private buildObservable()

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$)
        );
  }