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 4df30bfeda..0000000000 Binary files a/src/renderer/src/assets/images/apps/n8n.ico and /dev/null differ diff --git a/src/renderer/src/assets/images/apps/n8n.svg b/src/renderer/src/assets/images/apps/n8n.svg new file mode 100644 index 0000000000..82f0a6da2e --- /dev/null +++ b/src/renderer/src/assets/images/apps/n8n.svg @@ -0,0 +1 @@ +n8n \ 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)' - }} - /> - - )