Installation
There are two cases to integrate the Push Notifications:
Case 1: You Are the Owner of a Firebase Project
- Provide us with your Firebase Service Account (JSON file).
 - Get your Firebase project configuration (documentation).
 - Create a new service worker file, it should be named 
firebase-messaging-sw.jsand should be placed at the root level of your server.- This file acts as a background script that runs separately from your web page and is responsible for receiving push notifications.
 
 - Add the Snippet below to your service worker file.
 - Fill the 
firebase.initializeAppwith your Firebase configuration. 
Case 2: MeetingDoctors Manages the Firebase Project
- Create a new service worker file, it should be named 
firebase-messaging-sw.jsand should be placed at the root level of your server.- This file acts as a background script that runs separately from your web page and is responsible for receiving push notifications.
 
 - Add the Snippet below to your service worker file.
 - Fill the 
firebase.initializeAppwith your Firebase configuration that you received from MeetingDoctors. 
Snippet
/firebase-messaging-sw.js
// Give the service worker access to Firebase Messaging.
// Note that you can only use Firebase Messaging here, other Firebase libraries
// are not available in the service worker.
importScripts('https://www.gstatic.com/firebasejs/10.12.2/firebase-app-compat.js');
importScripts('https://www.gstatic.com/firebasejs/10.12.2/firebase-messaging-compat.js');
// Function to parse new format of payload notification
(function(e,i){typeof exports=="object"&&typeof module<"u"?i(exports):typeof define=="function"&&define.amd?define(["exports"],i):(e=typeof globalThis<"u"?globalThis:e||self,i(e["payload-notification"]={}))})(this,function(e){"use strict";const i=t=>{try{return JSON.parse(t)}catch{return t}};function r(t){return Object.entries(t.data).reduce((d,[c,f])=>(d[c]=i(f),d),{})}const o=t=>{try{return!("data"in t.data)}catch{return!0}},a=t=>{if(o(t)){const n=r(t);return{data:{data:JSON.stringify(n)}}}return t};self.customPayloadNotification={isPayloadNotificationNew:o,payloadNotificationMiddleware:a},e.isPayloadNotificationNew=o,e.payloadNotificationMiddleware=a,Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})});
////////////////////////////////////////////////////////////////////////////////////////////
// FIREBASE WEB CREDENTIALS - https://firebase.google.com/docs/web/learn-more#config-object
firebase.initializeApp({
  apiKey: "",
  authDomain: "",
  databaseURL: "",
  projectId: "",
  storageBucket: "",
  messagingSenderId: "",
  appId: "",
  measurementId: "",
});
////////////////////////////////////////////////////////////////////////////////////////////
const messaging = firebase.messaging();
messaging.onBackgroundMessage(function (backgroundMessage) {
  try {
    if (backgroundMessage.data && backgroundMessage.data.type === "silent") {
      return;
    }
  } catch (_) {}
  const payload = self.customPayloadNotification.payloadNotificationMiddleware(backgroundMessage);
  const pushMessage = payload.data;
  const pushMessageData = JSON.parse(pushMessage.data);
  pushMessageData.company = "MD"
  const promiseChain = clients.matchAll({ type: "window", includeUncontrolled: true })
    .then(windowClients => {
      for (let i = 0; i < windowClients.length; i++) {
        const windowClient = windowClients[i];
        windowClient.postMessage(pushMessageData);
      }
    })
    .then(() => {
  if (!['video-consultations', 'consultations'].includes(pushMessageData.module)) {
        return null;
      }
      var tag = null;
      switch (pushMessageData.type) {
        case "open_url":
          return self.registration.showNotification(pushMessageData.title, {
            body: pushMessageData.message,
            tag: pushMessageData.type,
            data: {url: pushMessageData.url}
          });
        case 'video_consultation:assigned':
        case 'video_call:calling':
        case 'video_consultation:cancelled':
          tag = 'videoCall';
          break;
        case 'push-notifications.new_video_consultation:assigned':
         return self.registration.showNotification(pushMessageData.message.title, {
            body: pushMessageData.message.body,
            icon:pushMessageData.professional.avatar,
            tag: pushMessageData.type,
          });
        case 'message_created':
          tag = pushMessageData.room_id;
          break;
      }
      return self.registration.showNotification(pushMessageData.message.title, {
        body: pushMessageData.message.body,
        icon:pushMessageData.professional.avatar,
        tag,
        badge: 1,
      });
    });
  return promiseChain;
});
//
addEventListener('notificationclick', event => {
  event.notification.close();
  event.waitUntil(async function () {
    if (event.notification.tag === 'push-notifications.new_video_consultation:assigned') {
      const tabs = await clients.matchAll({ type: 'window', includeUncontrolled: true });
      const dataToSend = {data: {type: event.notification.tag}}
      const destinationUrl = '/?notificationData=' + encodeURIComponent(JSON.stringify(dataToSend))
      let widgetOnTab = false;
      for (const tab of tabs) {
        if ('focus' in tab) {
          tab.postMessage(dataToSend);
          widgetOnTab = true;
          return tab.focus();
        }
      }
      if (!widgetOnTab) {
        await clients.openWindow('/#/chat'+ destinationUrl);
      }
      return;
    }
    const tabs = await clients.matchAll({ type: 'window', includeUncontrolled: true });
    let widgetOnTab = false;
    if (event.notification.tag === "open_url") {
      await clients.openWindow(event.notification.data.url);
      return;
    }
    for (const tab of tabs) {
      tab.focus();
      widgetOnTab = true;
      break;
    }
    if (!widgetOnTab) {
      await clients.openWindow('/#/chat');
    }
  }());
});