/* Service Worker for Reward App push notifications */ 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 || '', 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) }), ) })