From f51bca41c5f59f9ffce346a3ec32badaf1ccda31 Mon Sep 17 00:00:00 2001 From: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Sat, 21 Oct 2023 18:41:12 +0900 Subject: Feat: 外部サイトからテーマ・プラグインのインストールができるように (#12034) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feat: 外部サイトからテーマ・プラグインのインストールができるように * Update Changelog * Change Changelog * Remove unnecessary imports * Update fetch-external-resources.ts * Update CHANGELOG.md * Update CHANGELOG.md --- packages/frontend/src/scripts/install-theme.ts | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 packages/frontend/src/scripts/install-theme.ts (limited to 'packages/frontend/src/scripts/install-theme.ts') diff --git a/packages/frontend/src/scripts/install-theme.ts b/packages/frontend/src/scripts/install-theme.ts new file mode 100644 index 0000000000..394b642bf4 --- /dev/null +++ b/packages/frontend/src/scripts/install-theme.ts @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: syuilo and other misskey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import JSON5 from 'json5'; +import { addTheme, getThemes } from '@/theme-store.js'; +import { Theme, applyTheme, validateTheme } from '@/scripts/theme.js'; + +export function parseThemeCode(code: string): Theme { + let theme; + + try { + theme = JSON5.parse(code); + } catch (err) { + throw new Error('Failed to parse theme json'); + } + if (!validateTheme(theme)) { + throw new Error('This theme is invaild'); + } + if (getThemes().some(t => t.id === theme.id)) { + throw new Error('This theme is already installed'); + } + + return theme; +} + +export function previewTheme(code: string): void { + const theme = parseThemeCode(code); + if (theme) applyTheme(theme, false); +} + +export async function installTheme(code: string): Promise { + const theme = parseThemeCode(code); + if (!theme) return; + await addTheme(theme); +} -- cgit v1.2.3-freya