logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git
commit: 0628aac664be4ccce361d319fad201c44d9257fe
parent 1b7e930b2e850408f46876395a85628b05729cc9
Author: Henry Jameson <me@hjkos.com>
Date:   Thu, 26 Oct 2023 15:42:21 +0300

fallback to old notification method, don't spam if old way of creating
notification fails, try to use favicon

Diffstat:

Msrc/services/desktop_notification_utils/desktop_notification_utils.js14++++++++++++--
Msrc/services/notification_utils/notification_utils.js6+++++-
Msrc/services/sw/sw.js2+-
Msrc/sw.js15+++++++++------
4 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/services/desktop_notification_utils/desktop_notification_utils.js b/src/services/desktop_notification_utils/desktop_notification_utils.js @@ -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) => { if (!('Notification' in window && window.Notification.permission === 'granted')) 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 + } + } } diff --git a/src/services/notification_utils/notification_utils.js b/src/services/notification_utils/notification_utils.js @@ -76,8 +76,12 @@ export const unseenNotificationsFromStore = store => filter(filteredNotificationsFromStore(store), ({ seen }) => !seen) export const prepareNotificationObject = (notification, i18n) => { + const nodes = document.querySelectorAll('link[rel="icon"]') + const icon = nodes[0].href + const notifObj = { - tag: notification.id + tag: notification.id, + icon } const status = notification.status const title = notification.from_profile.name diff --git a/src/services/sw/sw.js b/src/services/sw/sw.js @@ -10,7 +10,7 @@ function urlBase64ToUint8Array (base64String) { return Uint8Array.from([...rawData].map((char) => char.charCodeAt(0))) } -function isSWSupported () { +export function isSWSupported () { return 'serviceWorker' in navigator } diff --git a/src/sw.js b/src/sw.js @@ -59,16 +59,19 @@ self.addEventListener('message', async (event) => { console.log(event) if (type === 'desktopNotification') { - const { title, body, icon, id } = content - if (state.notificationIds.has(id)) return - state.notificationIds.add(id) - setTimeout(() => state.notificationIds.delete(id), 10000) - self.registration.showNotification('SWTEST: ' + title, { body, icon }) + const { title, ...rest } = content + const { tag } = rest + if (state.notificationIds.has(tag)) return + state.notificationIds.add(tag) + setTimeout(() => state.notificationIds.delete(tag), 10000) + self.registration.showNotification(title, rest) } if (type === 'updateFocus') { state.lastFocused = event.source.id - console.log(state) + + const notifications = await self.registration.getNotifications() + notifications.forEach(n => n.close()) } })