11import { Injectable, Inject, Optional, NgZone, PLATFORM_ID } from '@angular/core';
22import { isPlatformBrowser } from '@angular/common';
33import { messaging } from 'firebase';
4- import { requestPermission } from './observable/request-permission';
54import { Observable, empty, from, of, throwError } from 'rxjs';
6- import { mergeMap, catchError } from 'rxjs/operators';
7- import { FirebaseOptions, FirebaseAppConfig } from 'angularfire2';
5+ import { mergeMap, catchError, map, switchMap, concat, defaultIfEmpty } from 'rxjs/operators';
6+ import { FirebaseOptions, FirebaseAppConfig, runOutsideAngular } from 'angularfire2';
87import { FirebaseOptionsToken, FirebaseNameOrConfigToken, _firebaseAppFactory, FirebaseZoneScheduler } from 'angularfire2';
98
109@Injectable()
1110export class AngularFireMessaging {
12- messaging: messaging.Messaging;
11+ messaging: Observable< messaging.Messaging> ;
1312 requestPermission: Observable<void>;
1413 getToken: Observable<string|null>;
1514 tokenChanges: Observable<string|null>;
@@ -23,52 +22,58 @@ export class AngularFireMessaging {
2322 @Inject(PLATFORM_ID) platformId: Object,
2423 zone: NgZone
2524 ) {
26- const scheduler = new FirebaseZoneScheduler(zone, platformId);
27- this.messaging = zone.runOutsideAngular(() => {
28- const app = _firebaseAppFactory(options, nameOrConfig);
29- return app.messaging();
30- });
3125
3226 if (isPlatformBrowser(platformId)) {
3327
34- this.requestPermission = scheduler.runOutsideAngular(
35- requestPermission(this.messaging)
36- );
37-
38- this.getToken = scheduler.runOutsideAngular(
39- from(this.messaging.getToken())
40- );
41-
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- );
28+ const requireMessaging = from(require('firebase/messaging'));
4829
49- this.messages = scheduler.runOutsideAngular (
50- new Observable(subscriber => {
51- this .messaging.onMessage(subscriber.next);
52- } )
30+ this.messaging = requireMessaging.pipe (
31+ map(() => _firebaseAppFactory(options, nameOrConfig)),
32+ map(app => app .messaging()),
33+ runOutsideAngular(zone )
5334 );
5435
55- this.requestToken = this.requestPermission .pipe(
56- catchError(() => of(null )),
57- mergeMap(() => this.tokenChanges),
36+ this.requestPermission = this.messaging .pipe(
37+ switchMap(messaging => messaging.requestPermission( )),
38+ runOutsideAngular(zone)
5839 );
5940
6041 } else {
6142
43+ this.messaging = empty();
6244 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);
6745
6846 }
6947
70- this.deleteToken = (token: string) => scheduler.runOutsideAngular(
71- from(this.messaging.deleteToken(token))
48+ this.getToken = this.messaging.pipe(
49+ switchMap(messaging => messaging.getToken()),
50+ defaultIfEmpty(null),
51+ runOutsideAngular(zone)
52+ );
53+
54+ const tokenChanges = this.messaging.pipe(
55+ switchMap(messaging => new Observable(messaging.onTokenRefresh)),
56+ runOutsideAngular(zone)
57+ );
58+
59+ this.tokenChanges = this.getToken.pipe(
60+ concat(tokenChanges)
61+ );
62+
63+ this.messages = this.messaging.pipe(
64+ switchMap(messaging => new Observable(messaging.onMessage)),
65+ runOutsideAngular(zone)
66+ );
67+
68+ this.requestToken = this.requestPermission.pipe(
69+ catchError(() => of(null)),
70+ mergeMap(() => this.tokenChanges)
71+ );
72+
73+ this.deleteToken = (token: string) => this.messaging.pipe(
74+ switchMap(messaging => messaging.deleteToken(token)),
75+ defaultIfEmpty(false),
76+ runOutsideAngular(zone)
7277 );
7378 }
7479
0 commit comments