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