Skip to content

Commit a32fc8d

Browse files
authored
fix(ssr): resize observe and animation player errors 18.2.x (#15097)
* fix(*): Fix resize observe and animation player errors when using Angular SSR. * chore(*): fix build. Change a check in resize observer creation * chore(*): Use never observable when on server * chore(*): add comments * chore(*): apply review comments
1 parent e74f4b5 commit a32fc8d

File tree

5 files changed

+41
-23
lines changed

5 files changed

+41
-23
lines changed

projects/igniteui-angular/src/lib/core/utils.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CurrencyPipe, formatDate as _formatDate, isPlatformBrowser } from '@angular/common';
22
import { Inject, Injectable, InjectionToken, PLATFORM_ID, inject } from '@angular/core';
33
import { mergeWith } from 'lodash-es';
4-
import { Observable } from 'rxjs';
4+
import { NEVER, Observable } from 'rxjs';
55
import { setImmediate } from './setImmediate';
66
import { isDevMode } from '@angular/core';
77

@@ -449,14 +449,23 @@ export const HEADER_KEYS = new Set([...Array.from(NAVIGATION_KEYS), 'escape', 'e
449449
* Run the resizeObservable outside angular zone, because it patches the MutationObserver which causes an infinite loop.
450450
* Related issue: https://github.com/angular/angular/issues/31712
451451
*/
452-
export const resizeObservable = (target: HTMLElement): Observable<ResizeObserverEntry[]> => new Observable((observer) => {
453-
const instance = new (getResizeObserver())((entries: ResizeObserverEntry[]) => {
454-
observer.next(entries);
455-
});
456-
instance.observe(target);
457-
const unsubscribe = () => instance.disconnect();
458-
return unsubscribe;
459-
});
452+
export const resizeObservable = (target: HTMLElement): Observable<ResizeObserverEntry[]> => {
453+
const resizeObserver = getResizeObserver();
454+
// check whether we are on server env or client env
455+
if (resizeObserver) {
456+
return new Observable((observer) => {
457+
const instance = new resizeObserver((entries: ResizeObserverEntry[]) => {
458+
observer.next(entries);
459+
});
460+
instance.observe(target);
461+
const unsubscribe = () => instance.disconnect();
462+
return unsubscribe;
463+
});
464+
} else {
465+
// if on a server env return a empty observable that does not complete immediately
466+
return NEVER;
467+
}
468+
}
460469

461470
/**
462471
* @hidden

projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,10 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
491491
public ngAfterViewInit(): void {
492492
if (this.igxForScrollOrientation === 'vertical') {
493493
this._zone.runOutsideAngular(() => {
494-
this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
495-
this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
494+
if (this.platformUtil.isBrowser) {
495+
this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
496+
this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
497+
}
496498
});
497499
}
498500
}

projects/igniteui-angular/src/lib/services/animation/angular-animation-player.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ export class IgxAngularAnimationPlayer implements AnimationPlayer {
2323
// To workaround this we are getting the positions from the inner player.
2424
// This is logged in Angular here - https://github.com/angular/angular/issues/18891
2525
// As soon as this is resolved we can remove this hack
26-
this._innerPlayer = innerRenderer.engine.players[innerRenderer.engine.players.length - 1];
26+
const rendererEngine = innerRenderer.engine || innerRenderer.delegate.engine;
27+
// A workaround because of Angular SSR is using some delegation.
28+
this._innerPlayer = rendererEngine.players[rendererEngine.players.length - 1];
2729
}
2830

2931
public init(): void {

projects/igniteui-angular/src/lib/tabs/tabs/tab-header.component.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,12 @@ export class IgxTabHeaderComponent extends IgxTabHeaderDirective implements Afte
9999
/** @hidden @internal */
100100
public ngAfterViewInit(): void {
101101
this.ngZone.runOutsideAngular(() => {
102-
this._resizeObserver = new (getResizeObserver())(() => {
103-
this.tabs.realignSelectedIndicator();
104-
});
105-
this._resizeObserver.observe(this.nativeElement);
102+
if (this.platform.isBrowser) {
103+
this._resizeObserver = new (getResizeObserver())(() => {
104+
this.tabs.realignSelectedIndicator();
105+
});
106+
this._resizeObserver.observe(this.nativeElement);
107+
}
106108
});
107109
}
108110

projects/igniteui-angular/src/lib/tabs/tabs/tabs.component.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostBinding, Inject, Input, NgZone, OnDestroy, ViewChild } from '@angular/core';
2-
import { getResizeObserver, mkenum } from '../../core/utils';
2+
import { getResizeObserver, mkenum, PlatformUtil } from '../../core/utils';
33
import { IgxAngularAnimationService } from '../../services/animation/angular-animation-service';
44
import { AnimationService } from '../../services/animation/animation';
55
import { IgxDirectionality } from '../../services/direction/directionality';
@@ -140,6 +140,7 @@ export class IgxTabsComponent extends IgxTabsDirective implements AfterViewInit,
140140
cdr: ChangeDetectorRef,
141141
private ngZone: NgZone,
142142
dir: IgxDirectionality,
143+
private platform: PlatformUtil
143144
) {
144145
super(animationService, cdr, dir);
145146
}
@@ -150,12 +151,14 @@ export class IgxTabsComponent extends IgxTabsDirective implements AfterViewInit,
150151
super.ngAfterViewInit();
151152

152153
this.ngZone.runOutsideAngular(() => {
153-
this._resizeObserver = new (getResizeObserver())(() => {
154-
this.updateScrollButtons();
155-
this.realignSelectedIndicator();
156-
});
157-
this._resizeObserver.observe(this.headerContainer.nativeElement);
158-
this._resizeObserver.observe(this.viewPort.nativeElement);
154+
if (this.platform.isBrowser) {
155+
this._resizeObserver = new (getResizeObserver())(() => {
156+
this.updateScrollButtons();
157+
this.realignSelectedIndicator();
158+
});
159+
this._resizeObserver.observe(this.headerContainer.nativeElement);
160+
this._resizeObserver.observe(this.viewPort.nativeElement);
161+
}
159162
});
160163
}
161164

0 commit comments

Comments
 (0)