var serviceWorker = '/sw.js'; var isSubscribed = false; let deferredPrompt; var DotNetLog; //Vapid public key. var applicationServerPublicKey; function InitLog(dotNet) { DotNetLog = dotNet; } function AdvancedLog(text, e) { console.log(text); if (DotNetLog === undefined || DotNetLog === null) { return; } DotNetLog.invokeMethodAsync( "AddLog", text, e); } // Gérer la popup installation pwa window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); deferredPrompt = e || window.event; AdvancedLog('beforeinstallprompt', deferredPrompt); }); // Initialise le service worker function initSWVAPID(publicKey) { applicationServerPublicKey = publicKey; if ('serviceWorker' in navigator) { if (navigator.serviceWorker.controller) { AdvancedLog('[SW] registered :', navigator.serviceWorker.controller); initPushManager(); } else { AdvancedLog('[SW] Unregistered...'); navigator .serviceWorker .register(serviceWorker) .then(handleSWRegistration) .then(initPushManager); } } } function handleSWRegistration(reg) { if (reg.installing) { AdvancedLog('[SW] Installing...'); } else if (reg.waiting) { AdvancedLog('[SW] Installed'); } else if (reg.active) { AdvancedLog('[SW] Active'); } } function initPushManager() { AdvancedLog('[SW] initPushManager'); // Le service worker est prêt navigator.serviceWorker.ready.then(function (reg) { // On vérifie que l'utilisateur est logué if (typeof applicationServerPublicKey === 'undefined' || applicationServerPublicKey === "") { AdvancedLog('[push] Vapid Undefined.'); return; } // On vérifie que le Service Worker sont supportées if (!reg.showNotification) { AdvancedLog('[push] Notifications arent supported on service workers.'); return; } // Check if push messaging is supported if (!('PushManager' in window)) { AdvancedLog('[push] Push messaging isnt supported.'); return; } // Demander la permission pour les notifications const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; const isWebKit = 'webkit' in window; const isIOSWebKit = isIOS && isWebKit; AdvancedLog('[push] isIOS : ' + isIOS); AdvancedLog('[push] isWebKit : ' + isWebKit); AdvancedLog('[push] isSafari : ' + window.safari); if (window.safari && window.safari.pushNotification !== null) { ManageSubscriptionOnAppleDevices(); } else { // On check si l'utilisateur a déjà autorisé (ou non) les notifications reg.pushManager.getSubscription() .then(function (subscription) { AdvancedLog('[push] subscription : ', subscription); AdvancedLog('[push] Notification.permission : ', Notification.permission); // Si l'utilisateur n'a toujours pas choisi d'afficher ou non les notifs. if (subscription === null && Notification.permission === 'default' && Cookies.get('IsNotifPopupAsked') !== "YES") { AdvancedLog('[push] Ask permission!'); // On affiche la popup d'activation $.alert({ title: 'Notifications Push ', content: "
Afin de profiter d'une expérience complète et immersive de votre événement, nous vous recommandons d'activer les notifications Push sur votre appareil.
" + "Vous serez ainsi notifié à chaque nouveau message reçu !
" + "Vous pourrez désactiver cette fonctionnalité dans les paramètres de votre navigateur.
", theme: 'agorameetin', buttons: { cancel: { text: 'Annuler', btnClass: 'btn-cancel', action: function () { Cookies.set('IsNotifPopupAsked', 'YES'); } }, confirm: { text: 'Accepter', btnClass: 'btn-confirm', action: function () { Notification.requestPermission().then(function (status) { if (status === 'granted') { // L'utilisateur accepte de recevoir les notifications subscribePushDevice(reg); } }); Cookies.set('IsNotifPopupAsked', 'YES'); } } } }); } else if (subscription !== null || (subscription === null && Notification.permission === 'granted')) { // ServiceWorkerGlobalScope.onpushsubscriptionchange not working on Chrome yet. // so we need this bad workaround // Read more here : https://www.chromestatus.com/feature/6242325854420992 subscribePushDevice(reg); } }); } }); } function ManageSubscriptionOnAppleDevices() { AdvancedLog('[push] ManageSubscriptionOnAppleDevices'); const permissionData = window.safari.pushNotification.permission('web.agorameet.in'); AdvancedLog('[push] permissionData : ', permissionData); permissionData.then(function (permission) { AdvancedLog('[push] Permission ' + permission.permission, permission); if (permission.permission === 'default' && Cookies.get('IsNotifPopupAsked') !== "YES") { AdvancedLog('[push] Ask permission!'); // On affiche la popup d'activation $.alert({ title: 'Notifications Push ', content: "Afin de profiter d'une expérience complète et immersive de votre événement, nous vous recommandons d'activer les notifications Push sur votre appareil.
" + "Vous serez ainsi notifié à chaque nouveau message reçu !
" + "Vous pourrez désactiver cette fonctionnalité dans les paramètres de votre navigateur.
", theme: 'agorameetin', buttons: { cancel: { text: 'Annuler', btnClass: 'btn-cancel', action: function () { Cookies.set('IsNotifPopupAsked', 'YES'); } }, confirm: { text: 'Accepter', btnClass: 'btn-confirm', action: function () { Notification.requestPermission().then(function (status) { if (status === 'granted') { window.safari.pushNotification.requestPermission( 'web.agorameet.in', 'api/Notifications/CreateAppleDevice', { authToken: localStorage.getItem('authToken') }, function (permissionData) { AdvancedLog('[push] Subscription : ' + permissionData.permission, permissionData); } ); } }); Cookies.set('IsNotifPopupAsked', 'YES'); } } } }); } }); } // Inscrit le device en cours dans le PushManager et dans N07 function subscribePushDevice(reg) { AdvancedLog('[push] subscribePushDevice'); var subscribeParams = { userVisibleOnly: true }; //Setting the public key of our VAPID key pair. var applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey); subscribeParams.applicationServerKey = applicationServerKey; reg.pushManager .subscribe(subscribeParams) .then(function (subscription) { var p256dh = base64Encode(subscription.getKey('p256dh')); var auth = base64Encode(subscription.getKey('auth')); AdvancedLog('[push] vapid public:' + applicationServerPublicKey); AdvancedLog('[push] p256dh:' + p256dh); AdvancedLog('[push] Auth:' + auth); $.ajax({ type: "POST", url: "api/Notifications/CreateDevice" + "?pstr_PushEndpoint=" + encodeURIComponent(subscription.endpoint) + "&pstr_PushP256DH=" + encodeURIComponent(p256dh) + "&pstr_Auth=" + encodeURIComponent(auth), beforeSend: function (xhr) { xhr.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem("authToken")); }, success: checkPushManagerState(reg) }); //DotNet.invokeMethodAsync( // "createDevice", // subscription.endpoint, // p256dh, // auth); }) .catch(function (e) { errorHandler('[push] Unable to subscribe', e); }); } // Once the service worker is registered set the initial state function checkPushManagerState() { // We need the service worker registration to check for a subscription navigator.serviceWorker.ready.then(function (reg) { reg.pushManager.getSubscription() .then(function (subscription) { if (subscription) { AdvancedLog('[push] User is subscribed !'); } else { AdvancedLog('[push] User is NOT subscribed !'); } }) .catch(function (err) { AdvancedLog('[push] Unable to get subscription details.', err); }); }); } function unsubscribeUser() { AdvancedLog('[push] unsubscribeUser'); navigator.serviceWorker.ready.then(function (reg) { reg.pushManager.getSubscription() .then(function (subscription) { if (subscription) { AdvancedLog('[push] unsubscribing...'); return subscription.unsubscribe(); } }) .catch(function (error) { AdvancedLog('[push] Error unsubscribing', error); }); }); } function errorHandler(message, e) { if (typeof e === 'undefined') { e = null; } AdvancedLog(message, e); } function urlB64ToUint8Array(base64String) { var padding = '='.repeat((4 - base64String.length % 4) % 4); var base64 = (base64String + padding) .replace(/\-/g, '+') .replace(/_/g, '/'); var rawData = window.atob(base64); var outputArray = new Uint8Array(rawData.length); for (var i = 0; i < rawData.length; ++i) { outputArray[i] = rawData.charCodeAt(i); } return outputArray; } function base64Encode(arrayBuffer) { return btoa(String.fromCharCode.apply(null, new Uint8Array(arrayBuffer))); } function IsPWAMode() { const isInStandaloneMode = () => (window.matchMedia('(display-mode: standalone)').matches) || (window.navigator.standalone) || document.referrer.includes('android-app://'); if (isInStandaloneMode()) { return true; } return false; } function InstallPWA() { AdvancedLog('InstallPWA', deferredPrompt); if (deferredPrompt) { // Show the prompt deferredPrompt.prompt(); // Wait for the user to respond to the prompt deferredPrompt.userChoice.then((choiceResult) => { if (choiceResult.outcome === 'accepted') { AdvancedLog('User accepted PWA installation'); } else { AdvancedLog('User dismissed PWA installation'); } deferredPrompt = null; }); } }