From 68aba2afc3d949eeeb968bd11e9960e2b916157e Mon Sep 17 00:00:00 2001 From: pompurin404 Date: Fri, 20 Sep 2024 14:34:27 +0800 Subject: [PATCH] support import local themes --- src/main/resolve/theme.ts | 8 ++- src/main/utils/ipc.ts | 3 +- .../components/settings/general-config.tsx | 67 +++++++++++++------ src/renderer/src/utils/ipc.ts | 4 ++ 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/main/resolve/theme.ts b/src/main/resolve/theme.ts index 7fd1cb7..9eb4872 100644 --- a/src/main/resolve/theme.ts +++ b/src/main/resolve/theme.ts @@ -1,4 +1,4 @@ -import { readdir, readFile } from 'fs/promises' +import { copyFile, readdir, readFile } from 'fs/promises' import { themesDir } from '../utils/dirs' import path from 'path' import axios from 'axios' @@ -40,6 +40,12 @@ export async function fetchThemes(): Promise { zip.extractAllTo(themesDir(), true) } +export async function importThemes(files: string[]): Promise { + for (const file of files) { + if (existsSync(file)) await copyFile(file, path.join(themesDir(), path.basename(file))) + } +} + export async function applyTheme(theme: string): Promise { if (theme === 'default.css') { if (insertedCSSKey) { diff --git a/src/main/utils/ipc.ts b/src/main/utils/ipc.ts index bb364a8..ed9bf95 100644 --- a/src/main/utils/ipc.ts +++ b/src/main/utils/ipc.ts @@ -65,7 +65,7 @@ import { getInterfaces } from '../sys/interface' import { copyEnv } from '../resolve/tray' import { registerShortcut } from '../resolve/shortcut' import { mainWindow } from '..' -import { applyTheme, fetchThemes, resolveThemes } from '../resolve/theme' +import { applyTheme, fetchThemes, importThemes, resolveThemes } from '../resolve/theme' import { subStoreCollections, subStoreSubs } from '../core/subStoreApi' import { logDir } from './dirs' import path from 'path' @@ -204,6 +204,7 @@ export function registerIpcMainHandlers(): void { }) ipcMain.handle('resolveThemes', () => ipcErrorWrapper(resolveThemes)()) ipcMain.handle('fetchThemes', () => ipcErrorWrapper(fetchThemes)()) + ipcMain.handle('importThemes', (_e, file) => ipcErrorWrapper(importThemes)(file)) ipcMain.handle('applyTheme', (_e, theme) => ipcErrorWrapper(applyTheme)(theme)) ipcMain.handle('copyEnv', (_e, type) => ipcErrorWrapper(copyEnv)(type)) ipcMain.handle('alert', (_e, msg) => { diff --git a/src/renderer/src/components/settings/general-config.tsx b/src/renderer/src/components/settings/general-config.tsx index 6fdca3d..45b67fe 100644 --- a/src/renderer/src/components/settings/general-config.tsx +++ b/src/renderer/src/components/settings/general-config.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react' import SettingCard from '../base/base-setting-card' import SettingItem from '../base/base-setting-item' import { Button, Input, Select, SelectItem, Switch, Tab, Tabs, Tooltip } from '@nextui-org/react' -import { BiCopy } from 'react-icons/bi' +import { BiCopy, BiSolidFileImport } from 'react-icons/bi' import useSWR from 'swr' import { checkAutoRun, @@ -10,6 +10,8 @@ import { disableAutoRun, enableAutoRun, fetchThemes, + getFilePath, + importThemes, relaunchApp, resolveThemes, restartCore @@ -223,27 +225,48 @@ const GeneralConfig: React.FC = () => { { - setFetching(true) - try { - await fetchThemes() - setCustomThemes(await resolveThemes()) - } catch (e) { - alert(e) - } finally { - setFetching(false) - } - }} - > - - + <> + + + } >