diff --git a/src/renderer/src/Router.tsx b/src/renderer/src/Router.tsx
index edaebfa144..72ce119533 100644
--- a/src/renderer/src/Router.tsx
+++ b/src/renderer/src/Router.tsx
@@ -20,6 +20,7 @@ import PaintingsRoutePage from './pages/paintings/PaintingsRoutePage'
import SettingsPage from './pages/settings/SettingsPage'
import AssistantPresetsPage from './pages/store/assistants/presets/AssistantPresetsPage'
import TranslatePage from './pages/translate/TranslatePage'
+import { VideoPage } from './pages/video/VideoPage'
const Router: FC = () => {
const { navbarPosition } = useNavbarPosition()
@@ -40,6 +41,7 @@ const Router: FC = () => {
} />
} />
} />
+ } />
)
diff --git a/src/renderer/src/components/Tab/TabContainer.tsx b/src/renderer/src/components/Tab/TabContainer.tsx
index 6747066c6e..17184086b9 100644
--- a/src/renderer/src/components/Tab/TabContainer.tsx
+++ b/src/renderer/src/components/Tab/TabContainer.tsx
@@ -32,6 +32,7 @@ import {
Sparkle,
Sun,
Terminal,
+ Video,
X
} from 'lucide-react'
import { useCallback, useEffect, useMemo } from 'react'
@@ -106,6 +107,8 @@ const getTabIcon = (
return
case 'code':
return
+ case 'video':
+ return
default:
return null
}
diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx
index 8de40ff15c..c3b1e58e66 100644
--- a/src/renderer/src/components/app/Sidebar.tsx
+++ b/src/renderer/src/components/app/Sidebar.tsx
@@ -26,7 +26,8 @@ import {
Palette,
Settings,
Sparkle,
- Sun
+ Sun,
+ Video
} from 'lucide-react'
import { FC } from 'react'
import { useTranslation } from 'react-i18next'
@@ -139,7 +140,8 @@ const MainMenus: FC = () => {
knowledge: ,
files: ,
notes: ,
- code_tools:
+ code_tools: ,
+ video:
}
const pathMap = {
@@ -151,7 +153,8 @@ const MainMenus: FC = () => {
knowledge: '/knowledge',
files: '/files',
code_tools: '/code',
- notes: '/notes'
+ notes: '/notes',
+ video: '/video'
}
return sidebarIcons.visible.map((icon) => {
diff --git a/src/renderer/src/i18n/label.ts b/src/renderer/src/i18n/label.ts
index 376aec32e3..4bcd5c67b2 100644
--- a/src/renderer/src/i18n/label.ts
+++ b/src/renderer/src/i18n/label.ts
@@ -146,7 +146,8 @@ const titleKeyMap = {
notes: 'title.notes',
paintings: 'title.paintings',
settings: 'title.settings',
- translate: 'title.translate'
+ translate: 'title.translate',
+ video: 'title.video'
} as const
export const getTitleLabel = (key: string): string => {
@@ -172,7 +173,8 @@ const sidebarIconKeyMap = {
knowledge: 'knowledge.title',
files: 'files.title',
code_tools: 'code.title',
- notes: 'notes.title'
+ notes: 'notes.title',
+ video: 'video.title'
} as const
export const getSidebarIconLabel = (key: string): string => {
diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json
index 74b2911dd1..1054f199b2 100644
--- a/src/renderer/src/i18n/locales/en-us.json
+++ b/src/renderer/src/i18n/locales/en-us.json
@@ -4486,7 +4486,8 @@
"paintings": "Paintings",
"settings": "Settings",
"store": "Assistant Library",
- "translate": "Translate"
+ "translate": "Translate",
+ "video": "Video"
},
"trace": {
"backList": "Back To List",
@@ -4644,6 +4645,9 @@
"saveDataError": "Failed to save data, please try again.",
"title": "Update"
},
+ "video": {
+ "title": "Video"
+ },
"warning": {
"missing_provider": "The supplier does not exist; reverted to the default supplier {{provider}}. This may cause issues."
},
diff --git a/src/renderer/src/pages/launchpad/LaunchpadPage.tsx b/src/renderer/src/pages/launchpad/LaunchpadPage.tsx
index 4b51632b58..975bfff833 100644
--- a/src/renderer/src/pages/launchpad/LaunchpadPage.tsx
+++ b/src/renderer/src/pages/launchpad/LaunchpadPage.tsx
@@ -2,7 +2,7 @@ import App from '@renderer/components/MinApp/MinApp'
import { useMinapps } from '@renderer/hooks/useMinapps'
import { useRuntime } from '@renderer/hooks/useRuntime'
import { useSettings } from '@renderer/hooks/useSettings'
-import { Code, FileSearch, Folder, Languages, LayoutGrid, NotepadText, Palette, Sparkle } from 'lucide-react'
+import { Code, FileSearch, Folder, Languages, LayoutGrid, NotepadText, Palette, Sparkle, Video } from 'lucide-react'
import { FC, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
import { useNavigate } from 'react-router-dom'
@@ -63,6 +63,12 @@ const LaunchpadPage: FC = () => {
text: t('title.notes'),
path: '/notes',
bgColor: 'linear-gradient(135deg, #F97316, #FB923C)' // 笔记:橙色,代表活力和清晰思路
+ },
+ {
+ icon: ,
+ text: t('title.video'),
+ path: '/video',
+ bgColor: 'linear-gradient(135deg, #7C3AED, #A78BFA)' // Video Generation: deep purple, representing creativity and dynamic media
}
]
diff --git a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx
index e79af44eb6..ed30bcd5d5 100644
--- a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx
+++ b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx
@@ -21,7 +21,8 @@ import {
MessageSquareQuote,
NotepadText,
Palette,
- Sparkle
+ Sparkle,
+ Video
} from 'lucide-react'
import { FC, useCallback, useMemo } from 'react'
import { useTranslation } from 'react-i18next'
@@ -127,7 +128,8 @@ const SidebarIconsManager: FC = ({
knowledge: ,
files: ,
notes: ,
- code_tools:
+ code_tools: ,
+ video:
}),
[]
)
diff --git a/src/renderer/src/pages/video/VideoPage.tsx b/src/renderer/src/pages/video/VideoPage.tsx
new file mode 100644
index 0000000000..1ce6c41325
--- /dev/null
+++ b/src/renderer/src/pages/video/VideoPage.tsx
@@ -0,0 +1,16 @@
+// interface VideoPageProps {}
+
+import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
+import { useTranslation } from 'react-i18next'
+
+export const VideoPage = () => {
+ const { t } = useTranslation()
+ return (
+
+
+ {t('video.title')}
+
+
video page
+
+ )
+}
diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts
index f3f0fa3dda..d38c0a23ed 100644
--- a/src/renderer/src/store/index.ts
+++ b/src/renderer/src/store/index.ts
@@ -65,7 +65,7 @@ const persistedReducer = persistReducer(
{
key: 'cherry-studio',
storage,
- version: 160,
+ version: 161,
blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'],
migrate
},
diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts
index 89738b5821..5cffb58054 100644
--- a/src/renderer/src/store/migrate.ts
+++ b/src/renderer/src/store/migrate.ts
@@ -2654,6 +2654,19 @@ const migrateConfig = {
logger.error('migrate 160 error', error as Error)
return state
}
+ },
+ '161': (state: RootState) => {
+ try {
+ if (state.settings && state.settings.sidebarIcons) {
+ if (!state.settings.sidebarIcons.visible.includes('video')) {
+ state.settings.sidebarIcons.visible = [...state.settings.sidebarIcons.visible, 'video']
+ }
+ }
+ return state
+ } catch (error) {
+ logger.error('migrate 161 error', error as Error)
+ return state
+ }
}
}
diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts
index d8845cd1cc..55b574fc9d 100644
--- a/src/renderer/src/types/index.ts
+++ b/src/renderer/src/types/index.ts
@@ -534,6 +534,7 @@ export type SidebarIcon =
| 'files'
| 'code_tools'
| 'notes'
+ | 'video'
export type ExternalToolResult = {
mcpTools?: MCPTool[]