summaryrefslogtreecommitdiff
path: root/packages/frontend/src/theme-store.ts
blob: c41cc1765245140421ef16f1d1daf9e6657b81d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

import { Theme, getBuiltinThemes } from '@/scripts/theme.js';
import { miLocalStorage } from '@/local-storage.js';
import { misskeyApi } from '@/scripts/misskey-api.js';
import { $i } from '@/account.js';

const lsCacheKey = $i ? `themes:${$i.id}` as const : null;

export function getThemes(): Theme[] {
	if ($i == null) return [];
	return JSON.parse(miLocalStorage.getItem(lsCacheKey!) ?? '[]');
}

export async function fetchThemes(): Promise<void> {
	if ($i == null) return;

	try {
		const themes = await misskeyApi('i/registry/get', { scope: ['client'], key: 'themes' });
		miLocalStorage.setItem(lsCacheKey!, JSON.stringify(themes));
	} catch (err) {
		if (err.code === 'NO_SUCH_KEY') return;
		throw err;
	}
}

export async function addTheme(theme: Theme): Promise<void> {
	if ($i == null) return;
	const builtinThemes = await getBuiltinThemes();
	if (builtinThemes.some(t => t.id === theme.id)) {
		throw new Error('builtin theme');
	}
	await fetchThemes();
	const themes = getThemes().concat(theme);
	await misskeyApi('i/registry/set', { scope: ['client'], key: 'themes', value: themes });
	miLocalStorage.setItem(lsCacheKey!, JSON.stringify(themes));
}

export async function removeTheme(theme: Theme): Promise<void> {
	if ($i == null) return;
	const themes = getThemes().filter(t => t.id !== theme.id);
	await misskeyApi('i/registry/set', { scope: ['client'], key: 'themes', value: themes });
	miLocalStorage.setItem(lsCacheKey!, JSON.stringify(themes));
}