// Firebase.ts
import {FirebaseApp, initializeApp} from 'firebase/app';
import {getMessaging as getFirebaseMessaging, getToken, Messaging} from 'firebase/messaging';
const firebaseConfig = {
apiKey: 'xxx',
authDomain: 'xxx',
projectId: 'xxx',
storageBucket: 'xxx',
messagingSenderId: 'xxx',
appId: 'xxx',
};
export function getFirebaseApp(): FirebaseApp {
return initializeApp(firebaseConfig);
}
export function getMessaging(firebaseApp: FirebaseApp): Messaging {
return getFirebaseMessaging(firebaseApp);
}
export async function getFCMToken(messaging: Messaging): Promise<string> {
return await getToken(messaging, {
vapidKey: 'xxx',
});
}
// Notification.ts
import {deleteApp} from '@firebase/app';
import {deleteToken} from '@firebase/messaging';
const registerFCMToken = async (firebaseApp: FirebaseApp, messaging: Messaging): Promise<void> => {
...
const firebaseToken = await getFCMToken(messaging).catch((e) =>
console.error('An error occurred while retrieving token. ', e)
);
if (!firebaseToken) {
throw new Error('No registration token available.');
}
// => persist token in db
...
};
const deleteFCMToken = (firebaseApp: FirebaseApp, messaging: Messaging) => {
...
deleteToken(messaging)
.then(() => {
deleteApp(firebaseApp)
.then(() => {
... // => supress the FCM token from DB
})
.catch(function (error) {
console.error('Error deleting FCM app:', error);
});
})
.catch(function (error) {
console.error('Error deleting FCM token:', error);
});
};
...
const firebaseApp = getFirebaseApp();
const messaging = getMessaging(firebaseApp);
// If permission for notifications is denied we must reset the FCM token and remove data from innoDB
if (isAuthorized === false) { // => isAuthorized became false if user denied notification permissions
deleteFCMToken(firebaseApp, messaging); // => 404 !?
return;
}
await registerFCMToken(firebaseApp, messaging).catch((e) => console.error('getFCMToken error', e));
// => here the token is generated and some firebase data are created in IndexedDB
```