From c0cb1693daa9bf7a0dde75c40b7dcff96dd1a01c Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Fri, 9 May 2025 20:15:43 +0800 Subject: [PATCH] feat: replace n8n icon with SVG version and update references * removed the old n8n.ico file * added new n8n.svg file * updated references in minapps configuration and app components to use the new SVG logo * changed file handling from 'customMiniAPP' to 'custom-minapps.json' for consistency --- src/renderer/src/assets/images/apps/n8n.ico | Bin 15086 -> 0 bytes src/renderer/src/assets/images/apps/n8n.svg | 1 + src/renderer/src/config/minapps.ts | 13 +- src/renderer/src/pages/apps/App.tsx | 8 +- .../MiniappSettings/MiniAppSettings.tsx | 119 +----------------- 5 files changed, 15 insertions(+), 126 deletions(-) delete mode 100644 src/renderer/src/assets/images/apps/n8n.ico create mode 100644 src/renderer/src/assets/images/apps/n8n.svg diff --git a/src/renderer/src/assets/images/apps/n8n.ico b/src/renderer/src/assets/images/apps/n8n.ico deleted file mode 100644 index 4df30bfedac76030e187377589832346b680bf46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHOX>3(R6uuSr4UCE#N=1o#L@^o_X;DPpz3-tU7MB=hQA7}W-zx}448CwXhEp+B|cbw}T$0;l{`A&|r9=uMVEFW>S<4l3TrI0}tXD|}^>UXgw z@!!}3u?J!g#2$z}5PKl@Ku9`lF|6W46uEjPKp4OeMJJZ8^z#zVw%G5iN#TVdp-|OZ9WlW^aq10+E0K# zxH^i>_kyvMLpxSS`R)0f@x%;`J=jD4`fhk1@|(zm|6jJ)R6AX8YntHSDqzLl|lCLemfg`QVH*D36t zs4I1=Z?LjW(emOA$73#g*VL_lzZq97J=9!={`)v&cjd@$Ds@HgTw9rhxW>wjbH&-V zyu4f<1z){s%OZ4N#tk2}a?PO_|F1^sR}eSyb&7}gSzas=9ne2NDeeYejXlt6`VMrb zlJ&$6u0>Xs6d0eZ=W+>*az=#I%MXili_n^iJHr8S#v1;i@FLc-oZ1r&-jTg zw}QWqw&@SGMsl6>#82cQ&9i+bb7#%@!0@}_&(iB@_6lJ0!PE0$QcP_Qo_uBeRB)HE z`&ZP@)C2x!rmVhC*}R_&Zj9Pe<3_jZAX&6+)!2U3Cq?C3>KQ&7U@+B=POLpHsuz9Z z3yU|G=Js`9oR}*U$*-N@Z9grlyQQAtm(H-W*VvkA-+}4p`^o3JNc&7?Y^XWIVq%{) zYm#JNCf~m!JO^|8gQ&0e2=K+UmcpE?2k+o{gP-p{MEWg~U(C6}*6|Y}figX|Ic}5U z7v$AA0TtM{bg{CenWS2Csdsaf-`KMnj~FZF-Oo#VVOdjsk3NU~nMlgtpt=uZk1}fD zrqgq6VVpmJFM@zZl*ixnj1)8Pr7AImo9Bewpvu&{FNwdx&s>#nA-) zprKuUpK)Epd%@b-u&nKJYQNx$!5Hr!0?YD4q$*-WT4C2vqT@UUo*I{2Q`-)4ewNJl zm>RQK3upNKvxVqqJ%If?)2@*FwEVQTt#r;lEIR)jK-v9miza_-B_*;0=BNqqx0;9O zcg#iWIM3y;t^I0ntc*(p7jZssKNPX$*aNW#Vh_X~h&>Q{AojqK(zBs zdb72NW}$hNJF?nNfu?na%GxE0FKe~DJkV9=slT=T!h2eUNX1C?_q1@AEB?hEh&>Q{ zptU`~m@Z;TL(*&+2<+U_LtoD1xmG!wu@H+gx zhi3_l)xtKd}a(b{2ub#VdDin>sT)QM!A2^u);5OIpxH1tm5kY*_;E)==lQAx`1;K z$`;@jvki%l^#| z7$4xj2OGh|8NTubV!uHp`7GDxrRYzdSO^)$PZ9qO7g&E#CcmF7FuHb{ z80RABWSja^52?!I&W0)H8O$PUgSe3g{w=)1e$Y?NMV=VOGtkDy!01HwOfzmbqb+N4 zi1Nb~^!QBPu>}(D3nfQ2T!163*-(-wa;nQOizH0fo2>QPvHk>~WhW@_w$;?G% zDbdULVJ>7_d@dTBs=g31~db}nj-HG$)UV~KOHO?W4-!56rf5_+67 z;G@rhaVLFYF|{V;`J@@6)*n1eeyBBV=IZA86z64*Tdoti<#9gtKn8n \ No newline at end of file diff --git a/src/renderer/src/config/minapps.ts b/src/renderer/src/config/minapps.ts index 6a2f01df40..42234b2400 100644 --- a/src/renderer/src/config/minapps.ts +++ b/src/renderer/src/config/minapps.ts @@ -1,8 +1,7 @@ -import n8nLogo from '@renderer/assets/images/apps/n8n.ico?url' -import ApplicationLogo from '@renderer/assets/images/apps/application.png?url' import ThreeMinTopAppLogo from '@renderer/assets/images/apps/3mintop.png?url' import AbacusLogo from '@renderer/assets/images/apps/abacus.webp?url' import AIStudioLogo from '@renderer/assets/images/apps/aistudio.svg?url' +import ApplicationLogo from '@renderer/assets/images/apps/application.png?url' import BaiduAiAppLogo from '@renderer/assets/images/apps/baidu-ai.png?url' import BaiduAiSearchLogo from '@renderer/assets/images/apps/baidu-ai-search.webp?url' import BaicuanAppLogo from '@renderer/assets/images/apps/baixiaoying.webp?url' @@ -28,6 +27,7 @@ import LambdaChatLogo from '@renderer/assets/images/apps/lambdachat.webp?url' import LeChatLogo from '@renderer/assets/images/apps/lechat.png?url' import MetasoAppLogo from '@renderer/assets/images/apps/metaso.webp?url' import MonicaLogo from '@renderer/assets/images/apps/monica.webp?url' +import n8nLogo from '@renderer/assets/images/apps/n8n.svg?url' import NamiAiLogo from '@renderer/assets/images/apps/nm.png?url' import NamiAiSearchLogo from '@renderer/assets/images/apps/nm-search.webp?url' import NotebookLMAppLogo from '@renderer/assets/images/apps/notebooklm.svg?url' @@ -61,11 +61,11 @@ const loadCustomMiniApp = async (): Promise => { try { let content: string try { - content = await window.api.file.read('customMiniAPP') + content = await window.api.file.read('custom-minapps.json') } catch (error) { // 如果文件不存在,创建一个空的 JSON 数组 content = '[]' - await window.api.file.writeWithId('customMiniAPP', content) + await window.api.file.writeWithId('custom-minapps.json', content) } const customApps = JSON.parse(content) @@ -455,7 +455,10 @@ const ORIGIN_DEFAULT_MIN_APPS: MinAppType[] = [ name: 'n8n', logo: n8nLogo, url: 'https://app.n8n.cloud/', - bodered: true + bodered: true, + style: { + padding: 5 + } } ] diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx index cbf6ec75c6..c787a6ab1c 100644 --- a/src/renderer/src/pages/apps/App.tsx +++ b/src/renderer/src/pages/apps/App.tsx @@ -40,7 +40,7 @@ const App: FC = ({ app, onClick, size = 60, isLast }) => { const handleAddCustomApp = async (values: any) => { try { - const content = await window.api.file.read('customMiniAPP') + const content = await window.api.file.read('custom-minapps.json') const customApps = JSON.parse(content) // Check for duplicate ID @@ -62,7 +62,7 @@ const App: FC = ({ app, onClick, size = 60, isLast }) => { addTime: new Date().toISOString() } customApps.push(newApp) - await window.api.file.writeWithId('customMiniAPP', JSON.stringify(customApps, null, 2)) + await window.api.file.writeWithId('custom-minapps.json', JSON.stringify(customApps, null, 2)) message.success(t('settings.miniapps.custom.save_success')) setIsModalVisible(false) form.resetFields() @@ -138,10 +138,10 @@ const App: FC = ({ app, onClick, size = 60, isLast }) => { danger: true, onClick: async () => { try { - const content = await window.api.file.read('customMiniAPP') + const content = await window.api.file.read('custom-minapps.json') const customApps = JSON.parse(content) const updatedApps = customApps.filter((customApp: MinAppType) => customApp.id !== app.id) - await window.api.file.writeWithId('customMiniAPP', JSON.stringify(updatedApps, null, 2)) + await window.api.file.writeWithId('custom-minapps.json', JSON.stringify(updatedApps, null, 2)) message.success(t('settings.miniapps.custom.remove_success')) const reloadedApps = [...ORIGIN_DEFAULT_MIN_APPS, ...(await loadCustomMiniApp())] updateDefaultMinApps(reloadedApps) diff --git a/src/renderer/src/pages/settings/MiniappSettings/MiniAppSettings.tsx b/src/renderer/src/pages/settings/MiniappSettings/MiniAppSettings.tsx index 6dd3d52963..134b9e52bd 100644 --- a/src/renderer/src/pages/settings/MiniappSettings/MiniAppSettings.tsx +++ b/src/renderer/src/pages/settings/MiniappSettings/MiniAppSettings.tsx @@ -1,10 +1,5 @@ import { UndoOutlined } from '@ant-design/icons' // 导入重置图标 -import { - DEFAULT_MIN_APPS, - loadCustomMiniApp, - ORIGIN_DEFAULT_MIN_APPS, - updateDefaultMinApps -} from '@renderer/config/minapps' +import { DEFAULT_MIN_APPS } from '@renderer/config/minapps' import { useTheme } from '@renderer/context/ThemeProvider' import { useMinapps } from '@renderer/hooks/useMinapps' import { useSettings } from '@renderer/hooks/useSettings' @@ -14,7 +9,7 @@ import { setMinappsOpenLinkExternal, setShowOpenedMinappsInSidebar } from '@renderer/store/settings' -import { Button, Input, message, Slider, Switch, Tooltip } from 'antd' +import { Button, message, Slider, Switch, Tooltip } from 'antd' import { FC, useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -36,92 +31,6 @@ const MiniAppSettings: FC = () => { const [disabledMiniApps, setDisabledMiniApps] = useState(disabled || []) const [messageApi, contextHolder] = message.useMessage() const debounceTimerRef = useRef(null) - const [customMiniAppContent, setCustomMiniAppContent] = useState('[]') - - // 加载自定义小应用配置 - useEffect(() => { - const loadCustomMiniApp = async () => { - try { - const content = await window.api.file.read('customMiniAPP') - let validContent = '[]' - try { - const parsed = JSON.parse(content) - validContent = JSON.stringify(parsed) - } catch (e) { - console.error('Invalid JSON format in custom mini app config:', e) - } - setCustomMiniAppContent(validContent) - } catch (error) { - console.error('Failed to load custom mini app config:', error) - setCustomMiniAppContent('[]') - } - } - loadCustomMiniApp() - }, []) - - // 保存自定义小应用配置 - const handleSaveCustomMiniApp = useCallback(async () => { - try { - // 验证 JSON 格式 - if (customMiniAppContent === '') { - setCustomMiniAppContent('[]') - } - const parsedContent = JSON.parse(customMiniAppContent) - // 确保是数组 - if (!Array.isArray(parsedContent)) { - throw new Error('Content must be an array') - } - - // 检查自定义应用中的重复ID - const customIds = new Set() - const duplicateIds = new Set() - parsedContent.forEach((app: any) => { - if (app.id) { - if (customIds.has(app.id)) { - duplicateIds.add(app.id) - } - customIds.add(app.id) - } - }) - - // 检查与默认应用的ID重复 - const defaultIds = new Set(ORIGIN_DEFAULT_MIN_APPS.map((app) => app.id)) - const conflictingIds = new Set() - customIds.forEach((id) => { - if (defaultIds.has(id)) { - conflictingIds.add(id) - } - }) - - // 如果有重复ID,显示错误信息 - if (duplicateIds.size > 0 || conflictingIds.size > 0) { - let errorMessage = '' - if (duplicateIds.size > 0) { - errorMessage += t('settings.miniapps.custom.duplicate_ids', { ids: Array.from(duplicateIds).join(', ') }) - } - if (conflictingIds.size > 0) { - console.log('conflictingIds', Array.from(conflictingIds)) - if (errorMessage) errorMessage += '\n' - errorMessage += t('settings.miniapps.custom.conflicting_ids', { ids: Array.from(conflictingIds).join(', ') }) - } - messageApi.error(errorMessage) - return - } - - // 保存文件 - await window.api.file.writeWithId('customMiniAPP', customMiniAppContent) - messageApi.success(t('settings.miniapps.custom.save_success')) - // 重新加载应用列表 - console.log('Reloading mini app list...') - const reloadedApps = [...ORIGIN_DEFAULT_MIN_APPS, ...(await loadCustomMiniApp())] - updateDefaultMinApps(reloadedApps) - console.log('Reloaded mini app list:', reloadedApps) - updateMinapps(reloadedApps) - } catch (error) { - messageApi.error(t('settings.miniapps.custom.save_error')) - console.error('Failed to save custom mini app config:', error) - } - }, [customMiniAppContent, messageApi, t, updateMinapps]) const handleResetMinApps = useCallback(() => { setVisibleMiniApps(DEFAULT_MIN_APPS) @@ -235,30 +144,6 @@ const MiniAppSettings: FC = () => { onChange={(checked) => dispatch(setShowOpenedMinappsInSidebar(checked))} /> - - - - {t('settings.miniapps.custom.edit_title')} - {t('settings.miniapps.custom.edit_description')} - - - - setCustomMiniAppContent(e.target.value)} - placeholder={t('settings.miniapps.custom.placeholder')} - style={{ - minHeight: 200, - fontFamily: 'monospace', - backgroundColor: 'var(--color-bg-2)', - color: 'var(--color-text)', - borderColor: 'var(--color-border)' - }} - /> - - )