diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2021-01-11 22:31:17 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2021-01-11 22:31:17 +0900 |
| commit | 114a9fbdb2b3f770b8069e81aaa095602290401f (patch) | |
| tree | fbad1fb5828957e2837c1653ec210160bfd9e4fe /src/client/theme-store.ts | |
| parent | Tweak tab size (diff) | |
| download | misskey-114a9fbdb2b3f770b8069e81aaa095602290401f.tar.gz misskey-114a9fbdb2b3f770b8069e81aaa095602290401f.tar.bz2 misskey-114a9fbdb2b3f770b8069e81aaa095602290401f.zip | |
テーマをレジストリに保存するように
Diffstat (limited to 'src/client/theme-store.ts')
| -rw-r--r-- | src/client/theme-store.ts | 62 |
1 files changed, 62 insertions, 0 deletions
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<void> { + 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<void> { + 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<void> { + 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', []); +} |