Skip to content

Commit 0646fb7

Browse files
authored
Merge pull request #111 from scott-wyatt/fix-ssr
fix: check if platform is browser in default view adapter to prevent error during server-side rendering,closes #110
2 parents bc829f0 + 42b48b6 commit 0646fb7

File tree

4 files changed

+10
-8
lines changed

4 files changed

+10
-8
lines changed

ngrx-forms-3.0.2.tgz

229 KB
Binary file not shown.

src/view-adapter/default.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ describe(NgrxDefaultViewAdapter.name, () => {
9090
it('should not set the ID of the element if the ID of the state does not change', () => {
9191
const renderer: Renderer2 = jasmine.createSpyObj('renderer', ['setProperty']);
9292
const nativeElement: any = {};
93-
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any);
93+
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any, 'browser');
9494
viewAdapter.ngrxFormControlState = { id: TEST_ID } as any;
9595
viewAdapter.ngAfterViewInit();
9696
expect(renderer.setProperty).toHaveBeenCalledTimes(1);
@@ -132,7 +132,7 @@ describe(NgrxDefaultViewAdapter.name, () => {
132132
it('should call the registered function when the value changes and is composing but composition is not supported', () => {
133133
const renderer: Renderer2 = jasmine.createSpyObj('renderer', ['setProperty']);
134134
const nativeElement: any = {};
135-
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any, androidNavigator);
135+
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any, 'browser', androidNavigator);
136136
viewAdapter.ngrxFormControlState = { id: TEST_ID } as any;
137137
const spy = jasmine.createSpy('fn');
138138
viewAdapter.setOnChangeCallback(spy);
@@ -158,7 +158,7 @@ describe(NgrxDefaultViewAdapter.name, () => {
158158
it('should not call the registered function on composition end if composition is not supported', () => {
159159
const renderer: Renderer2 = jasmine.createSpyObj('renderer', ['setProperty']);
160160
const nativeElement: any = {};
161-
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any, androidNavigator);
161+
viewAdapter = new NgrxDefaultViewAdapter(renderer, { nativeElement } as any, 'browser', androidNavigator);
162162
viewAdapter.ngrxFormControlState = { id: TEST_ID } as any;
163163
const spy = jasmine.createSpy('fn');
164164
viewAdapter.setOnChangeCallback(spy);
@@ -194,7 +194,7 @@ describe(NgrxDefaultViewAdapter.name, () => {
194194
});
195195

196196
it('should not throw if calling callbacks before they are registered', () => {
197-
expect(() => new NgrxDefaultViewAdapter(undefined as any, undefined as any).onChange(undefined)).not.toThrowError();
198-
expect(() => new NgrxDefaultViewAdapter(undefined as any, undefined as any).onTouched()).not.toThrowError();
197+
expect(() => new NgrxDefaultViewAdapter(undefined as any, undefined as any, undefined as any).onChange(undefined)).not.toThrowError();
198+
expect(() => new NgrxDefaultViewAdapter(undefined as any, undefined as any, undefined as any).onTouched()).not.toThrowError();
199199
});
200200
});

src/view-adapter/default.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { AfterViewInit, Directive, ElementRef, forwardRef, HostListener, Inject, Input, Optional, Renderer2 } from '@angular/core';
1+
import { isPlatformBrowser } from '@angular/common';
2+
import { AfterViewInit, Directive, ElementRef, forwardRef, HostListener, Inject, Input, Optional, PLATFORM_ID, Renderer2 } from '@angular/core';
23

34
import { FormControlState } from '../state';
45
import { FormViewAdapter, NGRX_FORM_VIEW_ADAPTER } from './view-adapter';
@@ -59,10 +60,11 @@ export class NgrxDefaultViewAdapter implements FormViewAdapter, AfterViewInit {
5960
constructor(
6061
private renderer: Renderer2,
6162
private elementRef: ElementRef,
63+
@Optional() @Inject(PLATFORM_ID) private readonly platformId: string,
6264
// we use a special injection string that should never exist at runtime to allow mocking this dependency for testing
6365
@Optional() @Inject('ngrx-forms/never') navigator: Navigator | null = null,
6466
) {
65-
this.isCompositionSupported = !isAndroid(navigator || window.navigator);
67+
this.isCompositionSupported = isPlatformBrowser(this.platformId) && !isAndroid(navigator || window.navigator);
6668
}
6769

6870
ngAfterViewInit() {

src/view-adapter/util.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { selectViewAdapter } from './util';
55

66
describe(selectViewAdapter.name, () => {
77
it('should return the default view adapter if it is the only provided', () => {
8-
const viewAdapter = new NgrxDefaultViewAdapter(undefined as any, undefined as any);
8+
const viewAdapter = new NgrxDefaultViewAdapter(undefined as any, undefined as any, undefined as any);
99
const result = selectViewAdapter([viewAdapter]);
1010
expect(result).toBe(viewAdapter);
1111
});

0 commit comments

Comments
 (0)