summaryrefslogtreecommitdiff
path: root/src/client/theme-store.ts
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2021-01-11 22:31:17 +0900
committersyuilo <syuilotan@yahoo.co.jp>2021-01-11 22:31:17 +0900
commit114a9fbdb2b3f770b8069e81aaa095602290401f (patch)
treefbad1fb5828957e2837c1653ec210160bfd9e4fe /src/client/theme-store.ts
parentTweak tab size (diff)
downloadmisskey-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.ts62
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', []);
+}