Improved push notifications
This commit is contained in:
parent
40a8877953
commit
41bdb545a1
@ -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)
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
@ -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())
|
||||
|
@ -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",
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user