feat: added long text paste control and threshold settings

This commit is contained in:
kangfenmao 2024-12-16 15:08:40 +08:00
parent 7fdc2db522
commit ccbeefc546
8 changed files with 36 additions and 5 deletions

View File

@ -395,6 +395,7 @@
"messages.model.title": "Model Settings", "messages.model.title": "Model Settings",
"messages.title": "Message Settings", "messages.title": "Message Settings",
"messages.use_serif_font": "Use serif font", "messages.use_serif_font": "Use serif font",
"messages.input.paste_long_text_threshold": "Paste long text length",
"model": "Default Model", "model": "Default Model",
"models.add.add_model": "Add Model", "models.add.add_model": "Add Model",
"models.add.group_name": "Group Name", "models.add.group_name": "Group Name",

View File

@ -395,6 +395,7 @@
"messages.model.title": "Настройки модели", "messages.model.title": "Настройки модели",
"messages.title": "Настройки сообщений", "messages.title": "Настройки сообщений",
"messages.use_serif_font": "Использовать serif шрифт", "messages.use_serif_font": "Использовать serif шрифт",
"messages.input.paste_long_text_threshold": "Длина вставки длинного текста",
"model": "Модель по умолчанию", "model": "Модель по умолчанию",
"models.add.add_model": "Добавить модель", "models.add.add_model": "Добавить модель",
"models.add.group_name": "Имя группы", "models.add.group_name": "Имя группы",

View File

@ -395,6 +395,7 @@
"messages.model.title": "模型设置", "messages.model.title": "模型设置",
"messages.title": "消息设置", "messages.title": "消息设置",
"messages.use_serif_font": "使用衬线字体", "messages.use_serif_font": "使用衬线字体",
"messages.input.paste_long_text_threshold": "长文本长度",
"model": "默认模型", "model": "默认模型",
"models.add.add_model": "添加模型", "models.add.add_model": "添加模型",
"models.add.group_name": "分组名称", "models.add.group_name": "分组名称",

View File

@ -395,6 +395,7 @@
"messages.model.title": "模型設定", "messages.model.title": "模型設定",
"messages.title": "訊息設定", "messages.title": "訊息設定",
"messages.use_serif_font": "使用襯線字體", "messages.use_serif_font": "使用襯線字體",
"messages.input.paste_long_text_threshold": "長文本長度",
"model": "預設模型", "model": "預設模型",
"models.add.add_model": "添加模型", "models.add.add_model": "添加模型",
"models.add.group_name": "群組名稱", "models.add.group_name": "群組名稱",

View File

@ -57,6 +57,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
sendMessageShortcut, sendMessageShortcut,
fontSize, fontSize,
pasteLongTextAsFile, pasteLongTextAsFile,
pasteLongTextThreshold,
showInputEstimatedTokens, showInputEstimatedTokens,
clickAssistantToShowTopic, clickAssistantToShowTopic,
language, language,
@ -291,7 +292,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
const item = event.clipboardData?.items[0] const item = event.clipboardData?.items[0]
if (item && item.kind === 'string' && item.type === 'text/plain') { if (item && item.kind === 'string' && item.type === 'text/plain') {
item.getAsString(async (pasteText) => { item.getAsString(async (pasteText) => {
if (pasteText.length > 1500) { if (pasteText.length > pasteLongTextThreshold) {
const tempFilePath = await window.api.file.create('pasted_text.txt') const tempFilePath = await window.api.file.create('pasted_text.txt')
await window.api.file.write(tempFilePath, pasteText) await window.api.file.write(tempFilePath, pasteText)
const selectedFile = await window.api.file.get(tempFilePath) const selectedFile = await window.api.file.get(tempFilePath)
@ -303,7 +304,7 @@ const Inputbar: FC<Props> = ({ assistant: _assistant, setActiveTopic }) => {
} }
} }
}, },
[pasteLongTextAsFile, supportExts, text] [pasteLongTextAsFile, pasteLongTextThreshold, supportExts, text]
) )
const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => { const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {

View File

@ -23,12 +23,13 @@ import {
setMessageFont, setMessageFont,
setMessageStyle, setMessageStyle,
setPasteLongTextAsFile, setPasteLongTextAsFile,
setPasteLongTextThreshold,
setRenderInputMessageAsMarkdown, setRenderInputMessageAsMarkdown,
setShowInputEstimatedTokens, setShowInputEstimatedTokens,
setShowMessageDivider setShowMessageDivider
} from '@renderer/store/settings' } from '@renderer/store/settings'
import { Assistant, AssistantSettings, ThemeMode } from '@renderer/types' 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 { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -62,7 +63,8 @@ const SettingsTab: FC<Props> = (props) => {
codeShowLineNumbers, codeShowLineNumbers,
codeCollapsible, codeCollapsible,
mathEngine, mathEngine,
autoTranslateWithSpace autoTranslateWithSpace,
pasteLongTextThreshold
} = useSettings() } = useSettings()
const onUpdateAssistantSettings = (settings: Partial<AssistantSettings>) => { const onUpdateAssistantSettings = (settings: Partial<AssistantSettings>) => {
@ -320,6 +322,23 @@ const SettingsTab: FC<Props> = (props) => {
onChange={(checked) => dispatch(setPasteLongTextAsFile(checked))} onChange={(checked) => dispatch(setPasteLongTextAsFile(checked))}
/> />
</SettingRow> </SettingRow>
{pasteLongTextAsFile && (
<>
<SettingDivider />
<SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.paste_long_text_threshold')}</SettingRowTitleSmall>
<InputNumber
size="small"
min={500}
max={10000}
step={100}
value={pasteLongTextThreshold}
onChange={(value) => dispatch(setPasteLongTextThreshold(value ?? 500))}
style={{ width: 80 }}
/>
</SettingRow>
</>
)}
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.markdown_rendering_input_message')}</SettingRowTitleSmall> <SettingRowTitleSmall>{t('settings.messages.markdown_rendering_input_message')}</SettingRowTitleSmall>

View File

@ -753,6 +753,7 @@ const migrateConfig = {
'49': (state: RootState) => { '49': (state: RootState) => {
state.settings.showMinappIcon = true state.settings.showMinappIcon = true
state.settings.showFilesIcon = true state.settings.showFilesIcon = true
state.settings.pasteLongTextThreshold = 1500
if (state.shortcuts) { if (state.shortcuts) {
state.shortcuts.shortcuts.push({ state.shortcuts.shortcuts.push({
key: 'copy_last_message', key: 'copy_last_message',

View File

@ -22,6 +22,7 @@ export interface SettingsState {
topicPosition: 'left' | 'right' topicPosition: 'left' | 'right'
showTopicTime: boolean showTopicTime: boolean
pasteLongTextAsFile: boolean pasteLongTextAsFile: boolean
pasteLongTextThreshold: number
clickAssistantToShowTopic: boolean clickAssistantToShowTopic: boolean
manualUpdateCheck: boolean manualUpdateCheck: boolean
renderInputMessageAsMarkdown: boolean renderInputMessageAsMarkdown: boolean
@ -61,6 +62,7 @@ const initialState: SettingsState = {
topicPosition: 'left', topicPosition: 'left',
showTopicTime: false, showTopicTime: false,
pasteLongTextAsFile: false, pasteLongTextAsFile: false,
pasteLongTextThreshold: 1500,
clickAssistantToShowTopic: false, clickAssistantToShowTopic: false,
manualUpdateCheck: false, manualUpdateCheck: false,
renderInputMessageAsMarkdown: false, renderInputMessageAsMarkdown: false,
@ -192,6 +194,9 @@ const settingsSlice = createSlice({
}, },
setShowFilesIcon: (state, action: PayloadAction<boolean>) => { setShowFilesIcon: (state, action: PayloadAction<boolean>) => {
state.showFilesIcon = action.payload state.showFilesIcon = action.payload
},
setPasteLongTextThreshold: (state, action: PayloadAction<number>) => {
state.pasteLongTextThreshold = action.payload
} }
} }
}) })
@ -232,7 +237,8 @@ export const {
setAutoTranslateWithSpace, setAutoTranslateWithSpace,
setEnableTopicNaming, setEnableTopicNaming,
setShowMinappIcon, setShowMinappIcon,
setShowFilesIcon setShowFilesIcon,
setPasteLongTextThreshold
} = settingsSlice.actions } = settingsSlice.actions
export default settingsSlice.reducer export default settingsSlice.reducer