Skip to content

Commit ec6937f

Browse files
committed
Zone.js and DI on top of this work, also fixing a couple small things
1 parent 14fcef6 commit ec6937f

File tree

1 file changed

+54
-23
lines changed

1 file changed

+54
-23
lines changed

src/messaging/messaging.ts

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { Injectable } from '@angular/core';
2-
import { Observable } from 'rxjs';
3-
import { FirebaseApp } from 'angularfire2';
1+
import { Injectable, Inject, Optional, NgZone, PLATFORM_ID } from '@angular/core';
2+
import { isPlatformBrowser } from '@angular/common';
43
import { messaging } from 'firebase';
54
import { requestPermission } from './observable/request-permission';
6-
import { from } from 'rxjs';
7-
import { mergeMap } from 'rxjs/operators';
5+
import { Observable, empty, from, of, throwError } from 'rxjs';
6+
import { mergeMap, catchError } from 'rxjs/operators';
7+
import { FirebaseOptions, FirebaseAppConfig } from 'angularfire2';
8+
import { FirebaseOptionsToken, FirebaseNameOrConfigToken, _firebaseAppFactory, FirebaseZoneScheduler } from 'angularfire2';
89

910
@Injectable()
1011
export class AngularFireMessaging {
@@ -14,31 +15,61 @@ export class AngularFireMessaging {
1415
tokenChanges: Observable<string|null>;
1516
messages: Observable<{}>;
1617
requestToken: Observable<string|null>;
18+
deleteToken: (string) => Observable<boolean>;
1719

18-
constructor(public app: FirebaseApp) {
19-
this.messaging = app.messaging();
20+
constructor(
21+
@Inject(FirebaseOptionsToken) options:FirebaseOptions,
22+
@Optional() @Inject(FirebaseNameOrConfigToken) nameOrConfig:string|FirebaseAppConfig|undefined,
23+
@Inject(PLATFORM_ID) platformId: Object,
24+
zone: NgZone
25+
) {
26+
const scheduler = new FirebaseZoneScheduler(zone, platformId);
27+
this.messaging = zone.runOutsideAngular(() => {
28+
const app = _firebaseAppFactory(options, nameOrConfig);
29+
return app.messaging();
30+
});
2031

21-
this.requestPermission = requestPermission(this.messaging);
32+
if (isPlatformBrowser(platformId)) {
2233

23-
this.getToken = from(this.messaging.getToken());
34+
this.requestPermission = scheduler.runOutsideAngular(
35+
requestPermission(this.messaging)
36+
);
2437

25-
this.tokenChanges = new Observable(subscriber => {
26-
this.messaging.getToken().then(t => subscriber.next(t));
27-
this.messaging.onTokenRefresh(subscriber);
28-
});
38+
this.getToken = scheduler.runOutsideAngular(
39+
from(this.messaging.getToken())
40+
);
2941

30-
this.messages = new Observable(subscriber => {
31-
this.messaging.onMessage(subscriber);
32-
});
33-
34-
this.requestToken = this.requestPermission.pipe(
35-
mergeMap(() => this.tokenChanges)
36-
);
42+
this.tokenChanges = scheduler.runOutsideAngular(
43+
new Observable(subscriber => {
44+
this.messaging.getToken().then(t => subscriber.next(t));
45+
this.messaging.onTokenRefresh(subscriber.next);
46+
})
47+
);
3748

38-
}
49+
this.messages = scheduler.runOutsideAngular(
50+
new Observable(subscriber => {
51+
this.messaging.onMessage(subscriber.next);
52+
})
53+
);
3954

40-
deleteToken(token: string) {
41-
return from(this.messaging.deleteToken(token)!);
55+
this.requestToken = this.requestPermission.pipe(
56+
catchError(() => of(null)),
57+
mergeMap(() => this.tokenChanges),
58+
);
59+
60+
} else {
61+
62+
this.requestPermission = throwError('Not available on server platform.');
63+
this.getToken = of(null);
64+
this.tokenChanges = of(null);
65+
this.messages = empty();
66+
this.requestToken = of(null);
67+
68+
}
69+
70+
this.deleteToken = (token: string) => scheduler.runOutsideAngular(
71+
from(this.messaging.deleteToken(token))
72+
);
4273
}
4374

4475
}

0 commit comments

Comments
 (0)