diff --git a/src/client/scripts/idb-proxy.ts b/src/client/scripts/idb-proxy.ts index 804d7ca625..aba17c796c 100644 --- a/src/client/scripts/idb-proxy.ts +++ b/src/client/scripts/idb-proxy.ts @@ -2,22 +2,33 @@ import { get as iget, set as iset, - del as idel + del as idel, } from 'idb-keyval'; const fallbackName = (key: string) => `idbfallback::${key}`; +let idbAvailable = !!window.indexedDB; + +if (idbAvailable) { + try { + const request = indexedDB.open('keyval-store'); + if (request.error) idbAvailable = false; + } catch (e) { + idbAvailable = false; + } +} + export async function get(key: string) { - if (window.indexedDB) return iget(key); + if (idbAvailable) return iget(key); return JSON.parse(localStorage.getItem(fallbackName(key))); } export async function set(key: string, val: any) { - if (window.indexedDB) return iset(key, val); + if (idbAvailable) return iset(key, val); return localStorage.setItem(fallbackName(key), JSON.stringify(val)); } export async function del(key: string) { - if (window.indexedDB) return idel(key); + if (idbAvailable) return idel(key); return localStorage.removeItem(fallbackName(key)); } diff --git a/src/client/ui/_common_/common.vue b/src/client/ui/_common_/common.vue index 8709f5a686..26e3a5b35e 100644 --- a/src/client/ui/_common_/common.vue +++ b/src/client/ui/_common_/common.vue @@ -55,44 +55,46 @@ export default defineComponent({ const sideViewHook = inject('sideViewHook', null); //#region Listen message from SW - navigator.serviceWorker.addEventListener('message', ev => { - if (_DEV_) { - console.log('sw msg', ev.data); - } + if ('serviceWorker' in navigator) { + navigator.serviceWorker.addEventListener('message', ev => { + if (_DEV_) { + console.log('sw msg', ev.data); + } - const data = ev.data as SwMessage; - if (data.type !== 'order') return; + const data = ev.data as SwMessage; + if (data.type !== 'order') return; - if (data.loginId !== $i?.id) { - return getAccountFromId(data.loginId).then(account => { - if (!account) return; - return login(account.token, data.url); - }); - } + if (data.loginId !== $i?.id) { + return getAccountFromId(data.loginId).then(account => { + if (!account) return; + return login(account.token, data.url); + }); + } - switch (data.order) { - case 'post': - return post(data.options); - case 'push': - if (data.url.startsWith('/my/messaging')) { - if (router.currentRoute.value.path === data.url) return; - if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return pageWindow(data.url); - if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return popout(data.url); - } - if (router.currentRoute.value.path === data.url) { - return window.scroll({ top: 0, behavior: 'smooth' }); - } - if (navHook) { - return navHook(data.url); - } - if (sideViewHook && defaultStore.state.defaultSideView && data.url !== '/') { - return sideViewHook(data.url); - } - return router.push(data.url); - default: - return; - } - }); + switch (data.order) { + case 'post': + return post(data.options); + case 'push': + if (data.url.startsWith('/my/messaging')) { + if (router.currentRoute.value.path === data.url) return; + if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return pageWindow(data.url); + if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return popout(data.url); + } + if (router.currentRoute.value.path === data.url) { + return window.scroll({ top: 0, behavior: 'smooth' }); + } + if (navHook) { + return navHook(data.url); + } + if (sideViewHook && defaultStore.state.defaultSideView && data.url !== '/') { + return sideViewHook(data.url); + } + return router.push(data.url); + default: + return; + } + }); + } } return {