Files
chore/frontend/vue-app/public/sw.js
Ryan Kegel 43d647a712
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m31s
Refactor code structure for improved readability and maintainability
2026-04-16 16:49:54 -04:00

79 lines
2.2 KiB
JavaScript

/* Service Worker for Reward App push notifications */
/* Activate immediately — no waiting for old tabs to close */
self.addEventListener('install', function (event) {
event.waitUntil(self.skipWaiting())
})
self.addEventListener('activate', function (event) {
event.waitUntil(self.clients.claim())
})
self.addEventListener('push', function (event) {
if (!event.data) return
let payload
try {
payload = event.data.json()
} catch (e) {
payload = { title: 'Reward App', body: event.data.text() }
}
const title = payload.title || 'Reward App'
const options = {
body: payload.body || '',
icon: '/icons/icon-192x192.png',
data: payload,
actions: [
{ action: 'approve', title: 'Approve' },
{ action: 'deny', title: 'Deny' },
],
}
event.waitUntil(self.registration.showNotification(title, options))
})
self.addEventListener('notificationclick', function (event) {
event.notification.close()
const payload = event.notification.data || {}
const approveToken = payload.approve_token
const denyToken = payload.deny_token
const childId = payload.child_id
const entityId = payload.entity_id
const entityType = payload.entity_type
if (event.action === 'approve' && approveToken) {
event.waitUntil(fetch('/api/digest-action/' + approveToken))
return
}
if (event.action === 'deny' && denyToken) {
event.waitUntil(fetch('/api/digest-action/' + denyToken))
return
}
// Body tap — open or focus the app then navigate to the deep link
const deepLinkUrl =
childId && entityId && entityType
? '/parent/' + childId + '?scrollTo=' + entityId + '&entityType=' + entityType
: '/parent'
event.waitUntil(
clients.matchAll({ type: 'window', includeUncontrolled: true }).then(function (clientList) {
const sameOriginClients = clientList.filter(function (c) {
return new URL(c.url).origin === self.location.origin
})
if (sameOriginClients.length > 0) {
const client = sameOriginClients[0]
return client.focus().then(function () {
return client.navigate(deepLinkUrl)
})
}
return clients.openWindow(deepLinkUrl)
}),
)
})