From 114a9fbdb2b3f770b8069e81aaa095602290401f Mon Sep 17 00:00:00 2001 From: syuilo Date: Mon, 11 Jan 2021 22:31:17 +0900 Subject: テーマをレジストリに保存するように MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/theme-store.ts | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/client/theme-store.ts (limited to 'src/client/theme-store.ts') diff --git a/src/client/theme-store.ts b/src/client/theme-store.ts new file mode 100644 index 0000000000..5e440efbf9 --- /dev/null +++ b/src/client/theme-store.ts @@ -0,0 +1,62 @@ +import { api } from '@/os'; +import { $i } from '@/account'; +import { ColdDeviceStorage } from './store'; +import { Theme } from './scripts/theme'; + +const lsCacheKey = $i ? `themes:${$i.id}` : ''; + +export function getThemes(): Theme[] { + return JSON.parse(localStorage.getItem(lsCacheKey) || '[]'); +} + +export async function fetchThemes(): Promise { + if ($i == null) return; + + try { + const themes = await api('i/registry/get', { scope: ['client'], key: 'themes' }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); + } catch (e) { + if (e.code === 'NO_SUCH_KEY') return; + throw e; + } +} + +export async function addTheme(theme: Theme): Promise { + await fetchThemes(); + const themes = getThemes().concat(theme); + await api('i/registry/set', { scope: ['client'], key: 'themes', value: themes }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); +} + +export async function removeTheme(theme: Theme): Promise { + const themes = getThemes().filter(t => t.id != theme.id); + await api('i/registry/set', { scope: ['client'], key: 'themes', value: themes }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); +} + +// TODO: そのうち消す +if (ColdDeviceStorage.get('themes').length > 0) { + const lsThemes = ColdDeviceStorage.get('themes'); + let registryThemes; + try { + registryThemes = await api('i/registry/get', { scope: ['client'], key: 'themes' }); + } catch (e) { + if (e.code === 'NO_SUCH_KEY') { + registryThemes = []; + } else { + throw e; + } + } + const themes = [] as Theme[]; + for (const theme of lsThemes) { + if (themes.some(x => x.id === theme.id)) continue; + themes.push(theme); + } + for (const theme of registryThemes) { + if (themes.some(x => x.id === theme.id)) continue; + themes.push(theme); + } + await api('i/registry/set', { scope: ['client'], key: 'themes', value: themes }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); + ColdDeviceStorage.set('themes', []); +} -- cgit v1.2.3-freya