feat(notify): web push as a notification channel
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m15s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m15s
- VAPID keys from VAPID_* or generated once (push_keys, migration 9); devices in push_subscriptions, forgotten on 404/410 from the push service - push column for every event (also due tasks) and the daily summary, bundles as one notification; /push/key, /devices, /subscribe, /unsubscribe, /test - settings: switch push on per device, test it, see the devices; the service worker shows notifications and focuses MindSift on click - tests decrypt a sent push like a browser (RFC 8291) and check VAPID Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
1a49e6b304
commit
38b8c92899
27 files changed
+918
-27
No files matched your search
@@ -94,3 +94,35 @@ self.addEventListener('fetch', (event) => {
|
||||
event.respondWith(staleWhileRevalidate(request));
|
||||
}
|
||||
});
|
||||
|
||||
// Web push: show the notification; a click focuses an open MindSift window or opens a new one
|
||||
self.addEventListener('push', (event) => {
|
||||
let msg = {};
|
||||
try {
|
||||
msg = event.data ? event.data.json() : {};
|
||||
} catch {
|
||||
msg = { body: event.data ? event.data.text() : '' };
|
||||
}
|
||||
event.waitUntil(
|
||||
self.registration.showNotification(msg.title || 'MindSift', {
|
||||
body: msg.body || '',
|
||||
icon: '/icon-192x192.png',
|
||||
badge: '/icon-192x192.png',
|
||||
tag: msg.tag || undefined,
|
||||
data: { url: msg.url || '/' },
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('notificationclick', (event) => {
|
||||
event.notification.close();
|
||||
const target = new URL((event.notification.data && event.notification.data.url) || '/', self.location.origin);
|
||||
event.waitUntil(
|
||||
self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then((windows) => {
|
||||
for (const w of windows) {
|
||||
if (new URL(w.url).origin === target.origin && 'focus' in w) return w.focus();
|
||||
}
|
||||
return self.clients.openWindow(target.href);
|
||||
})
|
||||
);
|
||||
});
|
||||
Reference in new issue
Block a user