1
1
import { Inject , Injectable , InjectionToken , NgZone , Optional , PLATFORM_ID } from '@angular/core' ;
2
- import firebase from 'firebase/app ' ;
3
- import { concat , EMPTY , Observable , of , throwError , fromEvent } from 'rxjs' ;
2
+ import { FirebaseMessaging , getMessaging , getToken , onMessage , deleteToken , MessagePayload } from 'firebase/messaging ' ;
3
+ import { concat , EMPTY , Observable , of , throwError } from 'rxjs' ;
4
4
import { catchError , defaultIfEmpty , map , mergeMap , observeOn , switchMap , switchMapTo , shareReplay , filter , subscribeOn } from 'rxjs/operators' ;
5
5
import {
6
6
FIREBASE_APP_NAME ,
@@ -20,18 +20,19 @@ import { ɵfetchInstance } from '@angular/fire';
20
20
export const VAPID_KEY = new InjectionToken < string > ( 'angularfire2.messaging.vapid-key' ) ;
21
21
export const SERVICE_WORKER = new InjectionToken < Promise < ServiceWorkerRegistration > > ( 'angularfire2.messaging.service-worker-registeration' ) ;
22
22
23
- // SEMVER(7): drop
24
- const firebaseLTv8 = parseInt ( firebase . SDK_VERSION , 10 ) < 8 ;
23
+ export interface AngularFireMessaging extends Omit < ɵPromiseProxy < FirebaseMessaging > , 'deleteToken' | 'getToken' | 'requestPermission' > {
24
+ }
25
25
26
- export interface AngularFireMessaging extends Omit < ɵPromiseProxy < firebase . messaging . Messaging > , 'deleteToken' | 'getToken' | 'requestPermission' > {
26
+ function isMessagingSupported ( ) {
27
+ return 'Notification' in window ;
27
28
}
28
29
29
30
@Injectable ( {
30
31
providedIn : 'any'
31
32
} )
32
33
export class AngularFireMessaging {
33
34
34
- public readonly requestPermission : Observable < void > ;
35
+ public readonly requestPermission : Observable < NotificationPermission > ;
35
36
public readonly getToken : Observable < string | null > ;
36
37
public readonly tokenChanges : Observable < string | null > ;
37
38
public readonly messages : Observable < { } > ;
@@ -56,15 +57,9 @@ export class AngularFireMessaging {
56
57
switchMap ( ( ) => isPlatformServer ( platformId ) ? EMPTY : import ( 'firebase/messaging' ) ) ,
57
58
map ( ( ) => ɵfirebaseAppFactory ( options , zone , nameOrConfig ) ) ,
58
59
switchMap ( app => ɵfetchInstance ( `${ app . name } .messaging` , 'AngularFireMessaging' , app , async ( ) => {
59
- const messaging = app . messaging ( ) ;
60
- if ( firebaseLTv8 ) {
61
- if ( vapidKey ) {
62
- messaging . usePublicVapidKey ( vapidKey ) ;
63
- }
64
- if ( serviceWorker ) {
65
- messaging . useServiceWorker ( await serviceWorker ) ;
66
- }
67
- }
60
+ const messaging = getMessaging ( app ) ;
61
+ // MARK: Breaking change
62
+ // Removed: useVapidKey removed?
68
63
return messaging ;
69
64
} , [ vapidKey , serviceWorker ] ) ) ,
70
65
shareReplay ( { bufferSize : 1 , refCount : false } )
@@ -74,20 +69,16 @@ export class AngularFireMessaging {
74
69
subscribeOn ( schedulers . outsideAngular ) ,
75
70
observeOn ( schedulers . insideAngular ) ,
76
71
// tslint:disable-next-line
77
- switchMap ( messaging => firebase . messaging . isSupported ( ) ? messaging . requestPermission ( ) : throwError ( 'Not supported.' ) )
72
+ switchMap ( messaging => isMessagingSupported ( ) ? Notification . requestPermission ( ) : throwError ( 'Not supported.' ) )
78
73
) ;
79
74
80
75
this . getToken = messaging . pipe (
81
76
subscribeOn ( schedulers . outsideAngular ) ,
82
77
observeOn ( schedulers . insideAngular ) ,
83
78
switchMap ( async messaging => {
84
- if ( firebase . messaging . isSupported ( ) && Notification . permission === 'granted' ) {
85
- if ( firebaseLTv8 ) {
86
- return await messaging . getToken ( ) ;
87
- } else {
88
- const serviceWorkerRegistration = serviceWorker ? await serviceWorker : null ;
89
- return await messaging . getToken ( { vapidKey, serviceWorkerRegistration } ) ;
90
- }
79
+ if ( isMessagingSupported ( ) && Notification . permission === 'granted' ) {
80
+ const serviceWorkerRegistration = serviceWorker ? await serviceWorker : null ;
81
+ return await getToken ( { vapidKey, serviceWorkerRegistration } ) ;
91
82
} else {
92
83
return null ;
93
84
}
@@ -110,15 +101,15 @@ export class AngularFireMessaging {
110
101
this . tokenChanges = messaging . pipe (
111
102
subscribeOn ( schedulers . outsideAngular ) ,
112
103
observeOn ( schedulers . insideAngular ) ,
113
- switchMap ( ( ) => firebase . messaging . isSupported ( ) ? concat ( this . getToken , tokenChange$ ) : EMPTY )
104
+ switchMap ( ( ) => isMessagingSupported ( ) ? concat ( this . getToken , tokenChange$ ) : EMPTY )
114
105
) ;
115
106
116
107
117
108
this . messages = messaging . pipe (
118
109
subscribeOn ( schedulers . outsideAngular ) ,
119
110
observeOn ( schedulers . insideAngular ) ,
120
- switchMap ( messaging => firebase . messaging . isSupported ( ) ? new Observable < string > ( emitter =>
121
- messaging . onMessage ( next => emitter . next ( next ) , err => emitter . error ( err ) , ( ) => emitter . complete ( ) )
111
+ switchMap ( messaging => isMessagingSupported ( ) ? new Observable < MessagePayload > ( subscriber =>
112
+ onMessage ( messaging , subscriber )
122
113
) : EMPTY ) ,
123
114
) ;
124
115
@@ -131,10 +122,12 @@ export class AngularFireMessaging {
131
122
) ;
132
123
133
124
// SEMVER(7): drop token
125
+ // MARK: Breaking change
126
+ // previous: this.deleteToken = (token?: string) => messaging.pipe(
134
127
this . deleteToken = ( token ?: string ) => messaging . pipe (
135
128
subscribeOn ( schedulers . outsideAngular ) ,
136
129
observeOn ( schedulers . insideAngular ) ,
137
- switchMap ( messaging => messaging . deleteToken ( token || undefined ) ) ,
130
+ switchMap ( messaging => deleteToken ( messaging ) ) ,
138
131
defaultIfEmpty ( false )
139
132
) ;
140
133
0 commit comments