diff --git a/public/manifest.json b/public/manifest.json
index 4f90bb1..b1b64d6 100644
--- a/public/manifest.json
+++ b/public/manifest.json
@@ -1,6 +1,6 @@
{
- "name": "Nsec.app",
- "short_name": "Nsec.app - Nostr key management tool",
+ "name": "Nsec.app - Nostr key management tool",
+ "short_name": "Nsec.app",
"start_url": ".",
"icons": [
{
diff --git a/src/App.tsx b/src/App.tsx
index 4f18330..9105bdb 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,6 +1,6 @@
import { DbKey, dbi } from './modules/db'
import { useCallback, useEffect, useState } from 'react'
-import { swicOnRender } from './modules/swic'
+import { swicOnReload, swicOnRender } from './modules/swic'
import { useAppDispatch } from './store/hooks/redux'
import { setApps, setKeys, setPending, setPerms } from './store/reducers/content.slice'
import AppRoutes from './routes/AppRoutes'
@@ -77,6 +77,12 @@ function App() {
setRender((r) => r + 1)
})
+ // subscribe to service worker updates
+ swicOnReload(() => {
+ console.log('reload')
+ // FIXME show 'Please reload' badge at page top
+ })
+
return (
<>
diff --git a/src/modules/backend.ts b/src/modules/backend.ts
index 145d777..dfb3c20 100644
--- a/src/modules/backend.ts
+++ b/src/modules/backend.ts
@@ -144,13 +144,8 @@ export class NoauthBackend {
const self = this
swg.addEventListener('activate', (event) => {
- console.log('activate')
- // swg.addEventListener('activate', event => event.waitUntil(swg.clients.claim()));
- })
-
- swg.addEventListener('install', (event) => {
- console.log('install')
- // swg.addEventListener('install', event => event.waitUntil(swg.skipWaiting()));
+ console.log('activate new sw worker')
+ this.reloadUI()
})
swg.addEventListener('push', (event) => {
@@ -1001,7 +996,7 @@ export class NoauthBackend {
}
private async editName(npub: string, name: string) {
- const key = this.enckeys.find(k => k.npub == npub)
+ const key = this.enckeys.find(k => k.npub === npub)
if (!key) throw new Error("Npub not found");
if (key.name) {
await this.sendDeleteNameToServer(npub, key.name)
@@ -1015,7 +1010,7 @@ export class NoauthBackend {
}
private async transferName(npub: string, name: string, newNpub: string) {
- const key = this.enckeys.find(k => k.npub == npub)
+ const key = this.enckeys.find(k => k.npub === npub)
if (!key) throw new Error("Npub not found")
if (!name) throw new Error("Empty name")
if (key.name !== name) throw new Error("Name changed, please reload")
@@ -1103,10 +1098,20 @@ export class NoauthBackend {
}
}
+ private async reloadUI() {
+ const clients = await this.swg.clients.matchAll({
+ includeUncontrolled: true,
+ })
+ console.log('reloadUI clients', clients.length)
+ for (const client of clients) {
+ client.postMessage({ result: 'reload' })
+ }
+ }
+
public async onPush(event: any) {
console.log('push', { data: event.data })
// noop - we just need browser to launch this worker
// FIXME use event.waitUntil and and unblock after we
- // show a notification
+ // show a notification to avoid annoying the browser
}
}
diff --git a/src/modules/swic.ts b/src/modules/swic.ts
index 725b9ad..3b0ef6e 100644
--- a/src/modules/swic.ts
+++ b/src/modules/swic.ts
@@ -1,10 +1,12 @@
-// service-worker client interface
+// service-worker client interface,
+// works on the frontend, not sw
import * as serviceWorkerRegistration from '../serviceWorkerRegistration'
export let swr: ServiceWorkerRegistration | null = null
const reqs = new Map void; rej: (r: any) => void }>()
let nextReqId = 1
let onRender: (() => void) | null = null
+let onReload: (() => void) | null = null
export async function swicRegister() {
serviceWorkerRegistration.register({
@@ -13,8 +15,12 @@ export async function swicRegister() {
swr = registration
},
onError(e) {
- console.log(`error ${e}`)
+ console.log('sw error', e)
},
+ onUpdate() {
+ // tell new SW that it should activate immediately
+ swr?.waiting?.postMessage({type: 'SKIP_WAITING'})
+ }
})
navigator.serviceWorker.ready.then((r) => {
@@ -37,7 +43,11 @@ function onMessage(data: any) {
console.log('SW message', id, result, error)
if (!id) {
- if (onRender) onRender()
+ if (result === 'reload') {
+ if (onReload) onReload()
+ } else {
+ if (onRender) onRender()
+ }
return
}
@@ -76,3 +86,7 @@ export async function swicCall(method: string, ...args: any[]) {
export function swicOnRender(cb: () => void) {
onRender = cb
}
+
+export function swicOnReload(cb: () => void) {
+ onReload = cb
+}