personal web client for Bluesky
typescript solidjs bluesky atcute
at trunk 1.1 kB view raw
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 };