From ccbeefc54685bf3c5c465b0f8353df09e6bdcd08 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Mon, 16 Dec 2024 15:08:40 +0800 Subject: [PATCH] feat: added long text paste control and threshold settings --- src/renderer/src/i18n/locales/en-us.json | 1 + src/renderer/src/i18n/locales/ru-ru.json | 1 + src/renderer/src/i18n/locales/zh-cn.json | 1 + src/renderer/src/i18n/locales/zh-tw.json | 1 + .../src/pages/home/Inputbar/Inputbar.tsx | 5 ++-- .../src/pages/home/Tabs/SettingsTab.tsx | 23 +++++++++++++++++-- src/renderer/src/store/migrate.ts | 1 + src/renderer/src/store/settings.ts | 8 ++++++- 8 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index 16ba54b2..df5d43fc 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -395,6 +395,7 @@ "messages.model.title": "Model Settings", "messages.title": "Message Settings", "messages.use_serif_font": "Use serif font", + "messages.input.paste_long_text_threshold": "Paste long text length", "model": "Default Model", "models.add.add_model": "Add Model", "models.add.group_name": "Group Name", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index cfa0553e..652427b4 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -395,6 +395,7 @@ "messages.model.title": "Настройки модели", "messages.title": "Настройки сообщений", "messages.use_serif_font": "Использовать serif шрифт", + "messages.input.paste_long_text_threshold": "Длина вставки длинного текста", "model": "Модель по умолчанию", "models.add.add_model": "Добавить модель", "models.add.group_name": "Имя группы", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 01ae0033..27b2f7c4 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -395,6 +395,7 @@ "messages.model.title": "模型设置", "messages.title": "消息设置", "messages.use_serif_font": "使用衬线字体", + "messages.input.paste_long_text_threshold": "长文本长度", "model": "默认模型", "models.add.add_model": "添加模型", "models.add.group_name": "分组名称", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index 2fd3038a..de60d1f8 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -395,6 +395,7 @@ "messages.model.title": "模型設定", "messages.title": "訊息設定", "messages.use_serif_font": "使用襯線字體", + "messages.input.paste_long_text_threshold": "長文本長度", "model": "預設模型", "models.add.add_model": "添加模型", "models.add.group_name": "群組名稱", diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 78bc4844..56a85255 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -57,6 +57,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { sendMessageShortcut, fontSize, pasteLongTextAsFile, + pasteLongTextThreshold, showInputEstimatedTokens, clickAssistantToShowTopic, language, @@ -291,7 +292,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { const item = event.clipboardData?.items[0] if (item && item.kind === 'string' && item.type === 'text/plain') { item.getAsString(async (pasteText) => { - if (pasteText.length > 1500) { + if (pasteText.length > pasteLongTextThreshold) { const tempFilePath = await window.api.file.create('pasted_text.txt') await window.api.file.write(tempFilePath, pasteText) const selectedFile = await window.api.file.get(tempFilePath) @@ -303,7 +304,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic }) => { } } }, - [pasteLongTextAsFile, supportExts, text] + [pasteLongTextAsFile, pasteLongTextThreshold, supportExts, text] ) const handleDragOver = (e: React.DragEvent) => { diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 35643417..5be2b38f 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -23,12 +23,13 @@ import { setMessageFont, setMessageStyle, setPasteLongTextAsFile, + setPasteLongTextThreshold, setRenderInputMessageAsMarkdown, setShowInputEstimatedTokens, setShowMessageDivider } from '@renderer/store/settings' import { Assistant, AssistantSettings, ThemeMode } from '@renderer/types' -import { Col, Row, Select, Slider, Switch, Tooltip } from 'antd' +import { Col, InputNumber, Row, Select, Slider, Switch, Tooltip } from 'antd' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -62,7 +63,8 @@ const SettingsTab: FC = (props) => { codeShowLineNumbers, codeCollapsible, mathEngine, - autoTranslateWithSpace + autoTranslateWithSpace, + pasteLongTextThreshold } = useSettings() const onUpdateAssistantSettings = (settings: Partial) => { @@ -320,6 +322,23 @@ const SettingsTab: FC = (props) => { onChange={(checked) => dispatch(setPasteLongTextAsFile(checked))} /> + {pasteLongTextAsFile && ( + <> + + + {t('settings.messages.input.paste_long_text_threshold')} + dispatch(setPasteLongTextThreshold(value ?? 500))} + style={{ width: 80 }} + /> + + + )} {t('settings.messages.markdown_rendering_input_message')} diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 5daa7596..6ce90ed7 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -753,6 +753,7 @@ const migrateConfig = { '49': (state: RootState) => { state.settings.showMinappIcon = true state.settings.showFilesIcon = true + state.settings.pasteLongTextThreshold = 1500 if (state.shortcuts) { state.shortcuts.shortcuts.push({ key: 'copy_last_message', diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index ad233b34..e22120ad 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -22,6 +22,7 @@ export interface SettingsState { topicPosition: 'left' | 'right' showTopicTime: boolean pasteLongTextAsFile: boolean + pasteLongTextThreshold: number clickAssistantToShowTopic: boolean manualUpdateCheck: boolean renderInputMessageAsMarkdown: boolean @@ -61,6 +62,7 @@ const initialState: SettingsState = { topicPosition: 'left', showTopicTime: false, pasteLongTextAsFile: false, + pasteLongTextThreshold: 1500, clickAssistantToShowTopic: false, manualUpdateCheck: false, renderInputMessageAsMarkdown: false, @@ -192,6 +194,9 @@ const settingsSlice = createSlice({ }, setShowFilesIcon: (state, action: PayloadAction) => { state.showFilesIcon = action.payload + }, + setPasteLongTextThreshold: (state, action: PayloadAction) => { + state.pasteLongTextThreshold = action.payload } } }) @@ -232,7 +237,8 @@ export const { setAutoTranslateWithSpace, setEnableTopicNaming, setShowMinappIcon, - setShowFilesIcon + setShowFilesIcon, + setPasteLongTextThreshold } = settingsSlice.actions export default settingsSlice.reducer