diff --git a/src/main/services/ConfigManager.ts b/src/main/services/ConfigManager.ts index bb0cbfc422..6242709385 100644 --- a/src/main/services/ConfigManager.ts +++ b/src/main/services/ConfigManager.ts @@ -62,7 +62,7 @@ export class ConfigManager { } getTrayOnClose(): boolean { - return !!this.get(ConfigKeys.TrayOnClose, false) + return !!this.get(ConfigKeys.TrayOnClose, true) } setTrayOnClose(value: boolean) { diff --git a/src/main/services/WindowService.ts b/src/main/services/WindowService.ts index ba508d7048..b67cac03d6 100644 --- a/src/main/services/WindowService.ts +++ b/src/main/services/WindowService.ts @@ -331,11 +331,6 @@ export class WindowService { event.preventDefault() - if (mainWindow.isFullScreen()) { - mainWindow.setFullScreen(false) - return - } - mainWindow.hide() //for mac users, should hide dock icon if close to tray diff --git a/src/renderer/src/components/Alert/OpenAIAlert.tsx b/src/renderer/src/components/Alert/OpenAIAlert.tsx index 7f8695fa05..455ab62987 100644 --- a/src/renderer/src/components/Alert/OpenAIAlert.tsx +++ b/src/renderer/src/components/Alert/OpenAIAlert.tsx @@ -17,7 +17,7 @@ const OpenAIAlert = () => { return ( { diff --git a/src/renderer/src/components/app/Navbar.tsx b/src/renderer/src/components/app/Navbar.tsx index 85a5265560..e5fe83b98c 100644 --- a/src/renderer/src/components/app/Navbar.tsx +++ b/src/renderer/src/components/app/Navbar.tsx @@ -1,6 +1,6 @@ import { isLinux, isMac, isWindows } from '@renderer/config/constant' -import useNavBackgroundColor from '@renderer/hooks/useNavBackgroundColor' import { useFullscreen } from '@renderer/hooks/useFullscreen' +import useNavBackgroundColor from '@renderer/hooks/useNavBackgroundColor' import type { FC, PropsWithChildren } from 'react' import type { HTMLAttributes } from 'react' import styled from 'styled-components' diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index cb182f71a9..2f3a2e1baf 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -869,7 +869,8 @@ "number_images_tip": "Количество увеличенных результатов для генерации", "seed_tip": "Контролирует случайный характер увеличения изображений для воспроизводимых результатов", "magic_prompt_option_tip": "Улучшает увеличение изображений с помощью интеллектуального оптимизирования промптов" - } + }, + "rendering_speed": "Скорость рендеринга" }, "prompts": { "explanation": "Объясните мне этот концепт", @@ -927,7 +928,6 @@ "restore": { "confirm": "Вы уверены, что хотите восстановить данные?", "confirm.button": "Выбрать файл резервной копии", - "content": "Операция восстановления перезапишет все текущие данные приложения данными из резервной копии. Это может занять некоторое время.", "progress": { "completed": "Восстановление завершено", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 1493d0d249..ca72417a8d 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -244,7 +244,7 @@ "settings.context_count": "上下文数", "settings.context_count.tip": "要保留在上下文中的消息数量,数值越大,上下文越长,消耗的 token 越多。普通聊天建议 5-10", "settings.max": "不限", - "settings.max_tokens": "最大 Token 数", + "settings.max_tokens": "最大 TOKEN 数", "settings.max_tokens.confirm": "最大 Token 数", "settings.max_tokens.confirm_content": "设置单次交互所用的最大 Token 数, 会影响返回结果的长度。要根据模型上下文限制来设置,否则会报错", "settings.max_tokens.tip": "单次交互所用的最大 Token 数, 会影响返回结果的长度。要根据模型上下文限制来设置,否则会报错", @@ -1678,7 +1678,7 @@ "reset": "重置" }, "openai": { - "title": "OpenAI设置", + "title": "OpenAI 设置", "summary_text_mode.title": "摘要模式", "summary_text_mode.tip": "模型执行的推理摘要", "summary_text_mode.auto": "自动", diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx index 506aaded1e..41c069f12d 100644 --- a/src/renderer/src/pages/apps/App.tsx +++ b/src/renderer/src/pages/apps/App.tsx @@ -156,14 +156,16 @@ const App: FC = ({ app, onClick, size = 60, isLast }) => { : []) ] - if (!isVisible && !isLast) return null + if (!isVisible && !isLast) { + return null + } return ( <> {isLast ? ( - + ) : ( @@ -252,9 +254,9 @@ const AppTitle = styled.div` white-space: nowrap; ` -const AddButton = styled.div` - width: 60px; - height: 60px; +const AddButton = styled.div<{ size?: number }>` + width: ${({ size }) => size || 60}px; + height: ${({ size }) => size || 60}px; border-radius: 12px; display: flex; align-items: center; diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index 58ee978fe2..84b89f0e43 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -256,6 +256,7 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic, o useEffect(() => { requestAnimationFrame(() => onComponentUpdate?.()) + // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const groupedMessages = useMemo(() => Object.entries(getGroupedMessages(displayMessages)), [displayMessages]) diff --git a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx index b2f291a837..537c7583f8 100644 --- a/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/AssistantsTab.tsx @@ -8,7 +8,7 @@ import { FC, useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' -import AssistantItem from './AssistantItem' +import AssistantItem from './components/AssistantItem' interface AssistantsTabProps { activeAssistant: Assistant diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 6754ccdb43..a421a027f3 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -63,7 +63,7 @@ import { FC, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' -import OpenAISettingsTab from './OpenAISettingsTab' +import OpenAISettingsGroup from './components/OpenAISettingsGroup' interface Props { assistant: Assistant @@ -218,8 +218,7 @@ const SettingsTab: FC = (props) => { /> }> - - + @@ -227,7 +226,7 @@ const SettingsTab: FC = (props) => { - +
= (props) => { value={typeof temperature === 'number' ? temperature : 0} step={0.1} /> - +
@@ -245,7 +244,7 @@ const SettingsTab: FC = (props) => { - +
= (props) => { value={typeof contextCount === 'number' ? contextCount : 0} step={1} /> - +
@@ -296,7 +295,7 @@ const SettingsTab: FC = (props) => { /> {enableMaxTokens && ( - + = (props) => { )}
- {isOpenAI && ( - - )} + {isOpenAI && ( + + )} - {t('settings.messages.prompt')} dispatch(setShowPrompt(checked))} /> @@ -440,7 +440,6 @@ const SettingsTab: FC = (props) => { - {t('message.message.code_style')} = (props) => { - {t('settings.messages.input.show_estimated_tokens')} ` +const SettingGroup = styled.div<{ theme?: ThemeMode }>` padding: 0 5px; width: 100%; margin-top: 0; diff --git a/src/renderer/src/pages/home/Tabs/AssistantItem.tsx b/src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx similarity index 100% rename from src/renderer/src/pages/home/Tabs/AssistantItem.tsx rename to src/renderer/src/pages/home/Tabs/components/AssistantItem.tsx diff --git a/src/renderer/src/pages/home/Tabs/OpenAISettingsTab.tsx b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx similarity index 54% rename from src/renderer/src/pages/home/Tabs/OpenAISettingsTab.tsx rename to src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx index 0fdd702d26..2aa25c5ff1 100644 --- a/src/renderer/src/pages/home/Tabs/OpenAISettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/components/OpenAISettingsGroup.tsx @@ -1,4 +1,5 @@ -import { SettingDivider, SettingRow, SettingSubtitle } from '@renderer/pages/settings' +import { SettingDivider, SettingRow } from '@renderer/pages/settings' +import { CollapsibleSettingGroup } from '@renderer/pages/settings/SettingGroup' import { RootState, useAppDispatch } from '@renderer/store' import { setOpenAIServiceTier, setOpenAISummaryText } from '@renderer/store/settings' import { OpenAIServiceTier, OpenAISummaryText } from '@renderer/types' @@ -9,11 +10,11 @@ import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import styled from 'styled-components' -import { SettingGroup, SettingRowTitleSmall } from './SettingsTab' - interface Props { isOpenAIReasoning: boolean isSupportedFlexServiceTier: boolean + SettingGroup: FC<{ children: React.ReactNode }> + SettingRowTitleSmall: FC<{ children: React.ReactNode }> } const FALL_BACK_SERVICE_TIER: Record = { @@ -22,7 +23,12 @@ const FALL_BACK_SERVICE_TIER: Record = { flex: 'default' } -const OpenAISettingsTab: FC = (props) => { +const OpenAISettingsGroup: FC = ({ + isOpenAIReasoning, + isSupportedFlexServiceTier, + SettingGroup, + SettingRowTitleSmall +}) => { const { t } = useTranslation() const summaryText = useSelector((state: RootState) => state.settings.openAI.summaryText) const serviceTierMode = useSelector((state: RootState) => state.settings.openAI.serviceTier) @@ -74,11 +80,11 @@ const OpenAISettingsTab: FC = (props) => { ] return baseOptions.filter((option) => { if (option.value === 'flex') { - return props.isSupportedFlexServiceTier + return isSupportedFlexServiceTier } return true }) - }, [props.isSupportedFlexServiceTier, t]) + }, [isSupportedFlexServiceTier, t]) useEffect(() => { if (serviceTierMode && !serviceTierOptions.some((option) => option.value === serviceTierMode)) { @@ -87,49 +93,49 @@ const OpenAISettingsTab: FC = (props) => { }, [serviceTierMode, serviceTierOptions, setServiceTierMode]) return ( - - {t('settings.openai.title')} - - - - {t('settings.openai.service_tier.title')}{' '} - - - - - { - setServiceTierMode(value as OpenAIServiceTier) - }} - size="small" - options={serviceTierOptions} - /> - - {props.isOpenAIReasoning && ( - <> - - - - {t('settings.openai.summary_text_mode.title')}{' '} - - - - - { - setSummaryText(value as OpenAISummaryText) - }} - size="small" - options={summaryTextOptions} - /> - - - )} - + + + + + {t('settings.openai.service_tier.title')}{' '} + + + + + { + setServiceTierMode(value as OpenAIServiceTier) + }} + size="small" + options={serviceTierOptions} + /> + + {isOpenAIReasoning && ( + <> + + + + {t('settings.openai.summary_text_mode.title')}{' '} + + + + + { + setSummaryText(value as OpenAISummaryText) + }} + size="small" + options={summaryTextOptions} + /> + + + )} + + ) } @@ -141,4 +147,4 @@ const StyledSelect = styled(Select)` } ` -export default OpenAISettingsTab +export default OpenAISettingsGroup diff --git a/src/renderer/src/pages/settings/QuickPhraseSettings/index.tsx b/src/renderer/src/pages/settings/QuickPhraseSettings/index.tsx index 1321a87db1..ea4a16a532 100644 --- a/src/renderer/src/pages/settings/QuickPhraseSettings/index.tsx +++ b/src/renderer/src/pages/settings/QuickPhraseSettings/index.tsx @@ -1,5 +1,6 @@ import { DeleteOutlined, EditOutlined, ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons' import DragableList from '@renderer/components/DragableList' +import { useTheme } from '@renderer/context/ThemeProvider' import FileItem from '@renderer/pages/files/FileItem' import QuickPhraseService from '@renderer/services/QuickPhraseService' import { QuickPhrase } from '@renderer/types' @@ -19,6 +20,7 @@ const QuickPhraseSettings: FC = () => { const [editingPhrase, setEditingPhrase] = useState(null) const [formData, setFormData] = useState({ title: '', content: '' }) const [dragging, setDragging] = useState(false) + const { theme } = useTheme() const loadPhrases = async () => { const data = await QuickPhraseService.getAll() @@ -68,8 +70,8 @@ const QuickPhraseSettings: FC = () => { const reversedPhrases = [...phrasesList].reverse() return ( - - + + {t('settings.quickPhrase.title')}