Skip to content

Commit 8fce342

Browse files
authored
feat(messaging): Add Messaging
1 parent 6376d97 commit 8fce342

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

src/messaging/messaging.ts

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
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';
44
import { catchError, defaultIfEmpty, map, mergeMap, observeOn, switchMap, switchMapTo, shareReplay, filter, subscribeOn } from 'rxjs/operators';
55
import {
66
FIREBASE_APP_NAME,
@@ -20,18 +20,19 @@ import { ɵfetchInstance } from '@angular/fire';
2020
export const VAPID_KEY = new InjectionToken<string>('angularfire2.messaging.vapid-key');
2121
export const SERVICE_WORKER = new InjectionToken<Promise<ServiceWorkerRegistration>>('angularfire2.messaging.service-worker-registeration');
2222

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+
}
2525

26-
export interface AngularFireMessaging extends Omit<ɵPromiseProxy<firebase.messaging.Messaging>, 'deleteToken' | 'getToken' | 'requestPermission'> {
26+
function isMessagingSupported() {
27+
return 'Notification' in window;
2728
}
2829

2930
@Injectable({
3031
providedIn: 'any'
3132
})
3233
export class AngularFireMessaging {
3334

34-
public readonly requestPermission: Observable<void>;
35+
public readonly requestPermission: Observable<NotificationPermission>;
3536
public readonly getToken: Observable<string | null>;
3637
public readonly tokenChanges: Observable<string | null>;
3738
public readonly messages: Observable<{}>;
@@ -56,15 +57,9 @@ export class AngularFireMessaging {
5657
switchMap(() => isPlatformServer(platformId) ? EMPTY : import('firebase/messaging')),
5758
map(() => ɵfirebaseAppFactory(options, zone, nameOrConfig)),
5859
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?
6863
return messaging;
6964
}, [vapidKey, serviceWorker])),
7065
shareReplay({ bufferSize: 1, refCount: false })
@@ -74,20 +69,16 @@ export class AngularFireMessaging {
7469
subscribeOn(schedulers.outsideAngular),
7570
observeOn(schedulers.insideAngular),
7671
// tslint:disable-next-line
77-
switchMap(messaging => firebase.messaging.isSupported() ? messaging.requestPermission() : throwError('Not supported.'))
72+
switchMap(messaging => isMessagingSupported() ? Notification.requestPermission() : throwError('Not supported.'))
7873
);
7974

8075
this.getToken = messaging.pipe(
8176
subscribeOn(schedulers.outsideAngular),
8277
observeOn(schedulers.insideAngular),
8378
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 });
9182
} else {
9283
return null;
9384
}
@@ -110,15 +101,15 @@ export class AngularFireMessaging {
110101
this.tokenChanges = messaging.pipe(
111102
subscribeOn(schedulers.outsideAngular),
112103
observeOn(schedulers.insideAngular),
113-
switchMap(() => firebase.messaging.isSupported() ? concat(this.getToken, tokenChange$) : EMPTY)
104+
switchMap(() => isMessagingSupported() ? concat(this.getToken, tokenChange$) : EMPTY)
114105
);
115106

116107

117108
this.messages = messaging.pipe(
118109
subscribeOn(schedulers.outsideAngular),
119110
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)
122113
) : EMPTY),
123114
);
124115

@@ -131,10 +122,12 @@ export class AngularFireMessaging {
131122
);
132123

133124
// SEMVER(7): drop token
125+
// MARK: Breaking change
126+
// previous: this.deleteToken = (token?: string) => messaging.pipe(
134127
this.deleteToken = (token?: string) => messaging.pipe(
135128
subscribeOn(schedulers.outsideAngular),
136129
observeOn(schedulers.insideAngular),
137-
switchMap(messaging => messaging.deleteToken(token || undefined)),
130+
switchMap(messaging => deleteToken(messaging)),
138131
defaultIfEmpty(false)
139132
);
140133

0 commit comments

Comments
 (0)