You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

100 lines
3.8 KiB

/**
* Odoo module for handling Firebase push notifications.
*
* This module initializes Firebase messaging and handles push notifications
* for the current session's company. It also registers the service worker for
* handling notifications if the company has push notifications enabled.
*
* @module mail_push_notification
*/
odoo.define("mail_push_notification.Firebase", function (require) {
"use strict";
var ajax = require('web.ajax');
var rpc = require("web.rpc");
var session = require('web.session');
var vapid = '';
var firebaseConfig = {};
var push_notification = false;
/**
* Sends an RPC query to retrieve push notification settings for the current company.
*
* @function
* @returns {Promise} A promise that resolves with the push notification settings.
*/
rpc.query({
model: 'res.company',
method: 'search_read',
fields: ['push_notification'],
domain: [['id', '=', session.company_id]]
}, { async: false }).then(function (data) {
if (data) {
_.each(data, function (company) {
if (company.push_notification) {
push_notification = true;
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("/firebase-messaging-sw.js").then(function () {});
}
}
});
}
});
ajax.jsonRpc("/firebase_config_details", 'call', {}).then(function (data) {
if (data) {
var json = JSON.parse(data);
vapid = json.vapid;
firebaseConfig = json.config;
/**
* Initializes Firebase messaging and sets up event listeners for incoming messages.
*
* @function
*/
firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();
/**
* Handles incoming push notification messages.
*
* @function
* @param {Object} payload - The notification payload.
*/
messaging.onMessage((payload) => {
const notificationOptions = {
body: payload.notification.body,
};
let notification = payload.notification;
navigator.serviceWorker.getRegistrations().then((registration) => {
registration[0].showNotification(notification.title, notificationOptions);
});
});
/**
* Requests permission for receiving push notifications and retrieves the registration token.
*
* @function
*/
messaging.requestPermission().then(function () {
/**
* Retrieves the registration token and sends it to the server for subscription.
*
* @function
* @param {string} vapidKey - The VAPID key for authentication.
*/
messaging.getToken({ vapidKey: vapid }).then((currentToken) => {
if (currentToken) {
/**
* Sends a POST request to the server with the registration token.
*
* @function
* @param {string} token - The registration token.
*/
$.post("/push_notification", {
name: currentToken
});
} else {
console.log('No registration token found');
}
}).catch((err) => {
console.log('There is an error has occurred while attempting to retrieve the token.', err);
});
});
}
});
});