Cleanup broken sw functions
This commit is contained in:
parent
a9f4d0dff9
commit
dcb846324d
4 changed files with 2 additions and 93 deletions
|
@ -41,4 +41,4 @@ export default class NamespaceModel extends AbstractModel {
|
||||||
updated: null,
|
updated: null,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,10 +223,6 @@ export default class TaskModel extends AbstractModel {
|
||||||
icon: '/images/icons/android-chrome-512x512.png',
|
icon: '/images/icons/android-chrome-512x512.png',
|
||||||
data: {taskId: this.id},
|
data: {taskId: this.id},
|
||||||
actions: [
|
actions: [
|
||||||
{
|
|
||||||
action: 'mark-as-done',
|
|
||||||
title: 'Done',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
action: 'show-task',
|
action: 'show-task',
|
||||||
title: 'Show task',
|
title: 'Show task',
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/* eslint-disable no-console */
|
/* eslint-disable no-console */
|
||||||
|
|
||||||
import {register} from 'register-service-worker'
|
import {register} from 'register-service-worker'
|
||||||
import {getToken} from './helpers/auth'
|
|
||||||
|
|
||||||
if (import.meta.env.PROD) {
|
if (import.meta.env.PROD) {
|
||||||
register('/sw.js', {
|
register('/sw.js', {
|
||||||
|
@ -32,26 +31,3 @@ if (import.meta.env.PROD) {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (navigator && navigator.serviceWorker) {
|
|
||||||
navigator.serviceWorker.addEventListener('message', event => {
|
|
||||||
// for every message we expect an action field
|
|
||||||
// determining operation that we should perform
|
|
||||||
const {action} = event.data
|
|
||||||
// we use 2nd port provided by the message channel
|
|
||||||
const port = event.ports[0]
|
|
||||||
|
|
||||||
if (action === 'getBearerToken') {
|
|
||||||
console.debug('Token request from sw')
|
|
||||||
port.postMessage({
|
|
||||||
authToken: getToken(),
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
console.error('Unknown event', event)
|
|
||||||
port.postMessage({
|
|
||||||
error: 'Unknown request',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
65
src/sw.js
65
src/sw.js
|
@ -36,76 +36,12 @@ self.addEventListener('message', (e) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const getBearerToken = async () => {
|
|
||||||
// we can't get a client that sent the current request, therefore we need
|
|
||||||
// to ask any controlled page for auth token
|
|
||||||
const allClients = await self.clients.matchAll()
|
|
||||||
const client = allClients.filter(client => client.type === 'window')[0]
|
|
||||||
|
|
||||||
// if there is no page in scope, we can't get any token
|
|
||||||
// and we indicate it with null value
|
|
||||||
if (!client) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
// to communicate with a page we will use MessageChannels
|
|
||||||
// they expose pipe-like interface, where a receiver of
|
|
||||||
// a message uses one end of a port for messaging and
|
|
||||||
// we use the other end for listening
|
|
||||||
const channel = new MessageChannel()
|
|
||||||
|
|
||||||
client.postMessage({
|
|
||||||
'action': 'getBearerToken',
|
|
||||||
}, [channel.port1])
|
|
||||||
|
|
||||||
// ports support only onmessage callback which
|
|
||||||
// is cumbersome to use, so we wrap it with Promise
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
channel.port2.onmessage = event => {
|
|
||||||
if (event.data.error) {
|
|
||||||
console.error('Port error', event.error)
|
|
||||||
reject(event.data.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve(event.data.authToken)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification action
|
// Notification action
|
||||||
self.addEventListener('notificationclick', function (event) {
|
self.addEventListener('notificationclick', function (event) {
|
||||||
const taskId = event.notification.data.taskId
|
const taskId = event.notification.data.taskId
|
||||||
event.notification.close()
|
event.notification.close()
|
||||||
|
|
||||||
switch (event.action) {
|
switch (event.action) {
|
||||||
case 'mark-as-done':
|
|
||||||
// FIXME: Ugly as hell, but no other way of doing this, since we can't use modules
|
|
||||||
// in service workers for now.
|
|
||||||
fetch('/config.json')
|
|
||||||
.then(r => r.json())
|
|
||||||
.then(config => {
|
|
||||||
|
|
||||||
getBearerToken()
|
|
||||||
.then(token => {
|
|
||||||
fetch(`${config.VIKUNJA_API_BASE_URL}tasks/${taskId}`, {
|
|
||||||
method: 'post',
|
|
||||||
headers: {
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Authorization': `Bearer ${token}`,
|
|
||||||
},
|
|
||||||
body: JSON.stringify({id: taskId, done: true}),
|
|
||||||
})
|
|
||||||
.then(r => r.json())
|
|
||||||
.then(r => {
|
|
||||||
console.debug('Task marked as done from notification', r)
|
|
||||||
})
|
|
||||||
.catch(e => {
|
|
||||||
console.debug('Error marking task as done from notification', e)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
break
|
|
||||||
case 'show-task':
|
case 'show-task':
|
||||||
clients.openWindow(`/tasks/${taskId}`)
|
clients.openWindow(`/tasks/${taskId}`)
|
||||||
break
|
break
|
||||||
|
@ -116,3 +52,4 @@ workbox.core.clientsClaim()
|
||||||
// The precaching code provided by Workbox.
|
// The precaching code provided by Workbox.
|
||||||
self.__precacheManifest = [].concat(self.__precacheManifest || [])
|
self.__precacheManifest = [].concat(self.__precacheManifest || [])
|
||||||
workbox.precaching.precacheAndRoute(self.__precacheManifest, {})
|
workbox.precaching.precacheAndRoute(self.__precacheManifest, {})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue