diff --git a/src/renderer/src/assets/images/apps/ai-search.png b/src/renderer/src/assets/images/apps/ai-search.png new file mode 100644 index 00000000..a3de4880 Binary files /dev/null and b/src/renderer/src/assets/images/apps/ai-search.png differ diff --git a/src/renderer/src/assets/images/apps/devv.png b/src/renderer/src/assets/images/apps/devv.png new file mode 100644 index 00000000..e2a35482 Binary files /dev/null and b/src/renderer/src/assets/images/apps/devv.png differ diff --git a/src/renderer/src/assets/images/apps/metaso.webp b/src/renderer/src/assets/images/apps/metaso.webp new file mode 100644 index 00000000..7c4f3ca2 Binary files /dev/null and b/src/renderer/src/assets/images/apps/metaso.webp differ diff --git a/src/renderer/src/assets/images/apps/sensetime.png b/src/renderer/src/assets/images/apps/sensetime.png new file mode 100644 index 00000000..a4a29526 Binary files /dev/null and b/src/renderer/src/assets/images/apps/sensetime.png differ diff --git a/src/renderer/src/assets/images/apps/sparkdesk.png b/src/renderer/src/assets/images/apps/sparkdesk.png new file mode 100644 index 00000000..9a173550 Binary files /dev/null and b/src/renderer/src/assets/images/apps/sparkdesk.png differ diff --git a/src/renderer/src/assets/images/apps/tiangong.png b/src/renderer/src/assets/images/apps/tiangong.png new file mode 100644 index 00000000..7d3d21e9 Binary files /dev/null and b/src/renderer/src/assets/images/apps/tiangong.png differ diff --git a/src/renderer/src/assets/images/apps/yuanbao.png b/src/renderer/src/assets/images/apps/yuanbao.png new file mode 100644 index 00000000..e9ab2efb Binary files /dev/null and b/src/renderer/src/assets/images/apps/yuanbao.png differ diff --git a/src/renderer/src/i18n/index.ts b/src/renderer/src/i18n/index.ts index a075a775..87307e20 100644 --- a/src/renderer/src/i18n/index.ts +++ b/src/renderer/src/i18n/index.ts @@ -227,6 +227,9 @@ const resources = { 'keep_alive_time.placeholder': 'Minutes', 'keep_alive_time.description': 'The time in minutes to keep the connection alive, default is 5 minutes.' }, + minapp: { + title: 'MinApp' + }, error: { 'chat.response': 'Something went wrong. Please check if you have set your API key in the Settings > Providers', 'backup.file_format': 'Backup file format error' @@ -462,6 +465,9 @@ const resources = { 'keep_alive_time.placeholder': '分钟', 'keep_alive_time.description': '对话后模型在内存中保持的时间(默认:5分钟)' }, + minapp: { + title: '小程序' + }, error: { 'chat.response': '出错了,如果没有配置 API 密钥,请前往设置 > 模型提供商中配置密钥', 'backup.file_format': '备份文件格式错误' diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx index 08e4118b..cd7aaaf4 100644 --- a/src/renderer/src/pages/apps/App.tsx +++ b/src/renderer/src/pages/apps/App.tsx @@ -24,7 +24,7 @@ const App: FC = ({ app }) => { return ( - + {app.name} ) @@ -36,6 +36,7 @@ const Container = styled.div` justify-content: center; align-items: center; cursor: pointer; + width: 65px; ` const AppIcon = styled.img` diff --git a/src/renderer/src/pages/apps/AppsPage.tsx b/src/renderer/src/pages/apps/AppsPage.tsx index 3aadd70f..340620cf 100644 --- a/src/renderer/src/pages/apps/AppsPage.tsx +++ b/src/renderer/src/pages/apps/AppsPage.tsx @@ -1,9 +1,20 @@ +import { SearchOutlined } from '@ant-design/icons' import AiAssistantAppLogo from '@renderer/assets/images/apps/360-ai.png' +import AiSearchAppLogo from '@renderer/assets/images/apps/ai-search.png' import BaiduAiAppLogo from '@renderer/assets/images/apps/baidu-ai.png' +import DevvAppLogo from '@renderer/assets/images/apps/devv.png' +import MetasoAppLogo from '@renderer/assets/images/apps/metaso.webp' +import SensetimeAppLogo from '@renderer/assets/images/apps/sensetime.png' +import SparkDeskAppLogo from '@renderer/assets/images/apps/sparkdesk.png' +import TiangongAiLogo from '@renderer/assets/images/apps/tiangong.png' +import TencentYuanbaoAppLogo from '@renderer/assets/images/apps/yuanbao.png' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' +import { Center } from '@renderer/components/Layout' import { PROVIDER_CONFIG } from '@renderer/config/provider' import { MinAppType } from '@renderer/types' -import { FC } from 'react' +import { Empty, Input } from 'antd' +import { isEmpty } from 'lodash' +import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -19,27 +30,87 @@ const _apps: MinAppType[] = [ name: '文心一言', logo: BaiduAiAppLogo, url: 'https://yiyan.baidu.com/' + }, + { + name: 'SparkDesk', + logo: SparkDeskAppLogo, + url: 'https://xinghuo.xfyun.cn/desk' + }, + { + name: '腾讯元宝', + logo: TencentYuanbaoAppLogo, + url: 'https://yuanbao.tencent.com/chat' + }, + { + name: '商量', + logo: SensetimeAppLogo, + url: 'https://chat.sensetime.com/wb/chat' + }, + { + name: '360AI搜索', + logo: AiSearchAppLogo, + url: 'https://so.360.com/' + }, + { + name: '秘塔AI搜索', + logo: MetasoAppLogo, + url: 'https://metaso.cn/' + }, + { + name: '天工AI', + logo: TiangongAiLogo, + url: 'https://www.tiangong.cn/' + }, + { + name: 'DEVV_', + logo: DevvAppLogo, + url: 'https://devv.ai/' } ] const AppsPage: FC = () => { const { t } = useTranslation() + const [search, setSearch] = useState('') - const apps: MinAppType[] = (Object.entries(PROVIDER_CONFIG) as any[]) + const list: MinAppType[] = (Object.entries(PROVIDER_CONFIG) as any[]) .filter(([, config]) => config.app) .map(([key, config]) => ({ id: key, ...config.app })) .concat(_apps) + const apps = search + ? list.filter( + (app) => app.name.toLowerCase().includes(search.toLowerCase()) || app.url.includes(search.toLowerCase()) + ) + : list + return ( - {t('agents.title')} + + {t('minapp.title')} + } + value={search} + onChange={(e) => setSearch(e.target.value)} + /> +
+ {apps.map((app) => ( ))} + {isEmpty(apps) && ( +
+ +
+ )}
diff --git a/src/renderer/src/pages/settings/AboutSettings.tsx b/src/renderer/src/pages/settings/AboutSettings.tsx index 7dcdabb2..7e384a34 100644 --- a/src/renderer/src/pages/settings/AboutSettings.tsx +++ b/src/renderer/src/pages/settings/AboutSettings.tsx @@ -2,6 +2,7 @@ import { GithubOutlined } from '@ant-design/icons' import { FileProtectOutlined, GlobalOutlined, MailOutlined, SoundOutlined } from '@ant-design/icons' import Logo from '@renderer/assets/images/logo.png' import { HStack } from '@renderer/components/Layout' +import MinApp from '@renderer/components/MinApp' import { runAsyncFunction } from '@renderer/utils' import { Avatar, Button, Progress, Row, Tag } from 'antd' import { ProgressInfo } from 'electron-updater' @@ -139,7 +140,14 @@ const AboutSettings: FC = () => { {t('settings.about.releases.title')} - diff --git a/src/renderer/src/pages/settings/GeneralSettings.tsx b/src/renderer/src/pages/settings/GeneralSettings.tsx index d15fddb1..4f7ab922 100644 --- a/src/renderer/src/pages/settings/GeneralSettings.tsx +++ b/src/renderer/src/pages/settings/GeneralSettings.tsx @@ -1,3 +1,4 @@ +import { FolderOpenOutlined, SaveOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import useAvatar from '@renderer/hooks/useAvatar' import { useSettings } from '@renderer/hooks/useSettings' @@ -117,8 +118,12 @@ const GeneralSettings: FC = () => { {t('settings.general.backup.title')} - - + + diff --git a/src/renderer/src/pages/settings/ProviderSettings/index.tsx b/src/renderer/src/pages/settings/ProviderSettings/index.tsx index acc196ab..ab7a9d72 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/index.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/index.tsx @@ -182,11 +182,10 @@ const ProviderListItem = styled.div` font-size: 14px; transition: all 0.2s ease-in-out; &:hover { - background: var(--color-primary-mute); + background: var(--color-background-soft); } &.active { - background: var(--color-primary); - color: var(--color-white); + background: var(--color-background-mute); font-weight: bold !important; } ` diff --git a/src/renderer/src/pages/settings/SettingsPage.tsx b/src/renderer/src/pages/settings/SettingsPage.tsx index a1665754..c7b7a8d7 100644 --- a/src/renderer/src/pages/settings/SettingsPage.tsx +++ b/src/renderer/src/pages/settings/SettingsPage.tsx @@ -118,11 +118,10 @@ const MenuItem = styled.li` opacity: 0.8; } &:hover { - background: var(--color-primary-soft); + background: var(--color-background-soft); } &.active { - background: var(--color-primary); - color: var(--color-white); + background: var(--color-background-mute); } `