fallback to old notification method, don't spam if old way of creating
notification fails, try to use favicon
This commit is contained in:
parent
1b7e930b2e
commit
0628aac664
@ -1,8 +1,18 @@
|
|||||||
import { showDesktopNotification as swDesktopNotification } from '../sw/sw.js'
|
import { showDesktopNotification as swDesktopNotification, isSWSupported } from '../sw/sw.js'
|
||||||
|
const state = { failCreateNotif: false }
|
||||||
|
|
||||||
export const showDesktopNotification = (rootState, desktopNotificationOpts) => {
|
export const showDesktopNotification = (rootState, desktopNotificationOpts) => {
|
||||||
if (!('Notification' in window && window.Notification.permission === 'granted')) return
|
if (!('Notification' in window && window.Notification.permission === 'granted')) return
|
||||||
if (rootState.statuses.notifications.desktopNotificationSilence) { return }
|
if (rootState.statuses.notifications.desktopNotificationSilence) { return }
|
||||||
|
|
||||||
swDesktopNotification(desktopNotificationOpts)
|
if (isSWSupported()) {
|
||||||
|
swDesktopNotification(desktopNotificationOpts)
|
||||||
|
} else if (!state.failCreateNotif) {
|
||||||
|
try {
|
||||||
|
const desktopNotification = new window.Notification(desktopNotificationOpts.title, desktopNotificationOpts)
|
||||||
|
setTimeout(desktopNotification.close.bind(desktopNotification), 5000)
|
||||||
|
} catch {
|
||||||
|
state.failCreateNotif = true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,8 +76,12 @@ export const unseenNotificationsFromStore = store =>
|
|||||||
filter(filteredNotificationsFromStore(store), ({ seen }) => !seen)
|
filter(filteredNotificationsFromStore(store), ({ seen }) => !seen)
|
||||||
|
|
||||||
export const prepareNotificationObject = (notification, i18n) => {
|
export const prepareNotificationObject = (notification, i18n) => {
|
||||||
|
const nodes = document.querySelectorAll('link[rel="icon"]')
|
||||||
|
const icon = nodes[0].href
|
||||||
|
|
||||||
const notifObj = {
|
const notifObj = {
|
||||||
tag: notification.id
|
tag: notification.id,
|
||||||
|
icon
|
||||||
}
|
}
|
||||||
const status = notification.status
|
const status = notification.status
|
||||||
const title = notification.from_profile.name
|
const title = notification.from_profile.name
|
||||||
|
@ -10,7 +10,7 @@ function urlBase64ToUint8Array (base64String) {
|
|||||||
return Uint8Array.from([...rawData].map((char) => char.charCodeAt(0)))
|
return Uint8Array.from([...rawData].map((char) => char.charCodeAt(0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
function isSWSupported () {
|
export function isSWSupported () {
|
||||||
return 'serviceWorker' in navigator
|
return 'serviceWorker' in navigator
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
src/sw.js
15
src/sw.js
@ -59,16 +59,19 @@ self.addEventListener('message', async (event) => {
|
|||||||
console.log(event)
|
console.log(event)
|
||||||
|
|
||||||
if (type === 'desktopNotification') {
|
if (type === 'desktopNotification') {
|
||||||
const { title, body, icon, id } = content
|
const { title, ...rest } = content
|
||||||
if (state.notificationIds.has(id)) return
|
const { tag } = rest
|
||||||
state.notificationIds.add(id)
|
if (state.notificationIds.has(tag)) return
|
||||||
setTimeout(() => state.notificationIds.delete(id), 10000)
|
state.notificationIds.add(tag)
|
||||||
self.registration.showNotification('SWTEST: ' + title, { body, icon })
|
setTimeout(() => state.notificationIds.delete(tag), 10000)
|
||||||
|
self.registration.showNotification(title, rest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === 'updateFocus') {
|
if (type === 'updateFocus') {
|
||||||
state.lastFocused = event.source.id
|
state.lastFocused = event.source.id
|
||||||
console.log(state)
|
|
||||||
|
const notifications = await self.registration.getNotifications()
|
||||||
|
notifications.forEach(n => n.close())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user