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' ;
4
3
import { messaging } from 'firebase' ;
5
4
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' ;
8
9
9
10
@Injectable ( )
10
11
export class AngularFireMessaging {
@@ -14,31 +15,61 @@ export class AngularFireMessaging {
14
15
tokenChanges : Observable < string | null > ;
15
16
messages : Observable < { } > ;
16
17
requestToken : Observable < string | null > ;
18
+ deleteToken : ( string ) => Observable < boolean > ;
17
19
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
+ } ) ;
20
31
21
- this . requestPermission = requestPermission ( this . messaging ) ;
32
+ if ( isPlatformBrowser ( platformId ) ) {
22
33
23
- this . getToken = from ( this . messaging . getToken ( ) ) ;
34
+ this . requestPermission = scheduler . runOutsideAngular (
35
+ requestPermission ( this . messaging )
36
+ ) ;
24
37
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
+ ) ;
29
41
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
+ ) ;
37
48
38
- }
49
+ this . messages = scheduler . runOutsideAngular (
50
+ new Observable ( subscriber => {
51
+ this . messaging . onMessage ( subscriber . next ) ;
52
+ } )
53
+ ) ;
39
54
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
+ ) ;
42
73
}
43
74
44
75
}
0 commit comments