diff --git a/app/js/lib/ng_utils.js b/app/js/lib/ng_utils.js index b08274fc..e0297f57 100755 --- a/app/js/lib/ng_utils.js +++ b/app/js/lib/ng_utils.js @@ -1989,6 +1989,8 @@ angular.module('izhukov.utils', []) var started = false var settings = {} var isAliveTO + var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 + var userVisibleOnly = isFirefox ? false : true if (!('PushManager' in window) || !('Notification' in window) || @@ -2035,7 +2037,7 @@ angular.module('izhukov.utils', []) return } navigator.serviceWorker.ready.then(function(reg) { - reg.pushManager.subscribe({userVisibleOnly: true}).then(function(subscription) { + reg.pushManager.subscribe({userVisibleOnly: userVisibleOnly}).then(function(subscription) { // The subscription was successful isPushEnabled = true pushSubscriptionNotify('subscribe', subscription) @@ -2045,6 +2047,10 @@ angular.module('izhukov.utils', []) console.log('Permission for Notifications was denied') } else { console.log('Unable to subscribe to push.', e) + if (!userVisibleOnly) { + userVisibleOnly = true + setTimeout(subscribe, 0) + } } }) }) diff --git a/app/js/lib/push_worker.js b/app/js/lib/push_worker.js index aae28ae2..74b28112 100644 --- a/app/js/lib/push_worker.js +++ b/app/js/lib/push_worker.js @@ -8,6 +8,15 @@ var muteUntil = false var baseUrl var settings var lang = {} +var userInvisibleSupported = false + + +var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 + +if (isFirefox) { + userInvisibleSupported = true +} + switch (location.hostname) { case 'localhost': @@ -25,19 +34,49 @@ self.addEventListener('push', function(event) { var obj = event.data.json() console.log('[SW] push', obj) - var closeAll = obj.badge ? !fireNotification(obj, event) : true - - if (closeAll) { + var checksPromise = new Promise(function (resolve, reject) { + if (!obj.badge) { + return reject() + } + var nowTime = +(new Date()) + if (userInvisibleSupported && + muteUntil && + nowTime < muteUntil) { + console.log('Supress notification because mute for ', (muteUntil - nowTime) / 60000, 'min') + return reject() + } + if (lastAliveTime && + nowTime - lastAliveTime < 60000) { + return clients.matchAll({type: 'window'}).then(function(clientList) { + if (clientList.length) { + console.log('Supress notification because some instance is alive') + return reject() + } + return resolve() + }) + } + return resolve() + }) + + var notificationPromise = checksPromise.then(function () { + fireNotification(obj) + }) + + var closePromise = notificationPromise.catch(function () { console.log('[SW] Closing all notifications on push') + if (userInvisibleSupported) { + return closeAllNotifications + } var promise = self.registration.showNotification('Telegram').then(function () { // return closeAllNotifications() setTimeout(closeAllNotifications, 100) }).catch(function (error) { console.error('Show notification error', error) }) - if ('waitUntil' in event) { - event.waitUntil(promise) - } + }) + + if ('waitUntil' in event) { + event.waitUntil(closePromise) } }) @@ -74,17 +113,7 @@ self.addEventListener('message', function(event) { } }) -function fireNotification(obj, event) { - var nowTime = +(new Date()) - if (nowTime - lastAliveTime < 60000) { - console.log('Supress notification because some instance is alive') - return false - } - if (muteUntil && nowTime < muteUntil) { - console.log('Supress notification because mute for ', (muteUntil - nowTime) / 60000, 'min') - return false - } - +function fireNotification(obj) { var title = obj.title || 'Telegram' var body = obj.description || '' var icon = 'img/logo_share.png' @@ -125,19 +154,14 @@ function fireNotification(obj, event) { ] }) - var finalPromise = notificationPromise.then(function (event) { + return notificationPromise.then(function (event) { if (event && event.notification) { pushToNotifications(event.notification) } + return Promise.resolve() }).catch(function (error) { console.error('Show notification promise', error) }) - - if ('waitUntil' in event) { - event.waitUntil(finalPromise) - } - - return true } @@ -150,12 +174,10 @@ function pushToNotifications(notification) { } function onCloseNotification(event) { - muteUntil = Math.max(muteUntil || 0, +(new Date()) + 600000) // 10 min removeFromNotifications(event.notification) } function removeFromNotifications(notification) { - console.warn('on close', notification) var pos = notifications.indexOf(notification) if (pos != -1) { notifications.splice(pos, 1) @@ -196,7 +218,7 @@ self.addEventListener('notificationclick', function(event) { notification.close() var action = event.action - if (action == 'mute1d') { + if (action == 'mute1d' && userInvisibleSupported) { console.log('[SW] mute for 1d') muteUntil = +(new Date()) + 86400000 IDBManager.setItem('push_mute_until', muteUntil.toString()) diff --git a/app/js/locales/en-us.json b/app/js/locales/en-us.json index b32db1a9..b3ebe7a9 100644 --- a/app/js/locales/en-us.json +++ b/app/js/locales/en-us.json @@ -606,6 +606,7 @@ "push_action_mute1d_mobile": "Mute for 24H", "push_action_settings_mobile": "Alerts settings", "push_message_nopreview": "You have a new message", + "push_action_mute1d_success": "Notification settings were successfully saved.", "country_select_modal_country_ab": "Abkhazia", diff --git a/app/js/services.js b/app/js/services.js index 9b4a5b36..c80c4567 100755 --- a/app/js/services.js +++ b/app/js/services.js @@ -3516,7 +3516,7 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) } }) - .service('NotificationsManager', function ($rootScope, $window, $interval, $q, $modal, _, MtpApiManager, AppPeersManager, AppChatsManager, AppUsersManager, IdleManager, Storage, AppRuntimeManager, FileManager, WebPushApiManager) { + .service('NotificationsManager', function ($rootScope, $window, $interval, $q, $modal, _, toaster, MtpApiManager, AppPeersManager, AppChatsManager, AppUsersManager, IdleManager, Storage, AppRuntimeManager, FileManager, WebPushApiManager) { navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate var notificationsMsSiteMode = false @@ -3635,6 +3635,22 @@ angular.module('myApp.services', ['myApp.i18n', 'izhukov.utils']) }) return } + if (notificationData.action == 'mute1d') { + MtpApiManager.invokeApi('account.updateDeviceLocked', function () { + period: 86400 + }).then(function () { + var toastData = toaster.pop({ + type: 'info', + body: _('push_action_mute1d_success'), + bodyOutputType: 'trustedHtml', + clickHandler: function () { + toaster.clear(toastData) + }, + showCloseButton: false + }) + }) + return + } var peerID = notificationData.custom && notificationData.custom.peerID console.log('click', notificationData, peerID) if (peerID) {