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 @@
+
\ 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)'
- }}
- />
-
-
)