1+ import { Injectable , Inject , Optional , NgZone , PLATFORM_ID } from '@angular/core' ;
2+ import { isPlatformBrowser } from '@angular/common' ;
3+ import { messaging } from 'firebase' ;
4+ import { requestPermission } from './observable/request-permission' ;
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' ;
9+
10+ @Injectable ( )
11+ export class AngularFireMessaging {
12+ messaging : messaging . Messaging ;
13+ requestPermission : Observable < void > ;
14+ getToken : Observable < string | null > ;
15+ tokenChanges : Observable < string | null > ;
16+ messages : Observable < { } > ;
17+ requestToken : Observable < string | null > ;
18+ deleteToken : ( string ) => Observable < boolean > ;
19+
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+ } ) ;
31+
32+ if ( isPlatformBrowser ( platformId ) ) {
33+
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+ ) ;
48+
49+ this . messages = scheduler . runOutsideAngular (
50+ new Observable ( subscriber => {
51+ this . messaging . onMessage ( subscriber . next ) ;
52+ } )
53+ ) ;
54+
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+ ) ;
73+ }
74+
75+ }
0 commit comments