personal web client for Bluesky
typescript
solidjs
bluesky
atcute
1import { createSignal } from 'solid-js';
2import { registerSW } from 'virtual:pwa-register';
3
4const shouldInstall = async (): Promise<boolean> => {
5 if (matchMedia('(display-mode: standalone)').matches) {
6 return true;
7 }
8
9 // Just in case.
10 const registration = await navigator.serviceWorker.getRegistration();
11 return !!registration;
12};
13
14export const enum SWStatus {
15 NOT_INSTALLED = 0,
16 INSTALLING = 1,
17 UPDATING = 2,
18 NEED_REFRESH = 3,
19 INSTALLED = 4,
20}
21
22const [swStatus, setSwStatus] = createSignal<SWStatus>(SWStatus.NOT_INSTALLED);
23
24let updateSW = () => {};
25
26shouldInstall().then(async (canInstall) => {
27 if (!canInstall) {
28 return;
29 }
30
31 let alreadyInstalled = !!(await navigator.serviceWorker.getRegistration());
32
33 updateSW = registerSW({
34 onRegisteredSW() {
35 setSwStatus(SWStatus.INSTALLED);
36 },
37 onBeginUpdate() {
38 setSwStatus(alreadyInstalled ? SWStatus.UPDATING : SWStatus.INSTALLING);
39 },
40 onNeedRefresh() {
41 setSwStatus(SWStatus.NEED_REFRESH);
42 },
43 onOfflineReady() {
44 setSwStatus(SWStatus.INSTALLED);
45 alreadyInstalled = true;
46 },
47 });
48});
49
50export { swStatus, updateSW };