mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-04-19 09:48:39 +00:00
feat: Enhance SettingsChats edit interface
This commit is contained in:
@@ -36,6 +36,7 @@ import {
|
|||||||
IconEdit,
|
IconEdit,
|
||||||
IconDelete,
|
IconDelete,
|
||||||
IconSearch,
|
IconSearch,
|
||||||
|
IconSaveStroked,
|
||||||
} from '@douyinfe/semi-icons';
|
} from '@douyinfe/semi-icons';
|
||||||
import {
|
import {
|
||||||
compareObjects,
|
compareObjects,
|
||||||
@@ -55,7 +56,7 @@ export default function SettingsChats(props) {
|
|||||||
});
|
});
|
||||||
const refForm = useRef();
|
const refForm = useRef();
|
||||||
const [inputsRow, setInputsRow] = useState(inputs);
|
const [inputsRow, setInputsRow] = useState(inputs);
|
||||||
const [editMode, setEditMode] = useState('json');
|
const [editMode, setEditMode] = useState('visual');
|
||||||
const [chatConfigs, setChatConfigs] = useState([]);
|
const [chatConfigs, setChatConfigs] = useState([]);
|
||||||
const [modalVisible, setModalVisible] = useState(false);
|
const [modalVisible, setModalVisible] = useState(false);
|
||||||
const [editingConfig, setEditingConfig] = useState(null);
|
const [editingConfig, setEditingConfig] = useState(null);
|
||||||
@@ -167,7 +168,9 @@ export default function SettingsChats(props) {
|
|||||||
}
|
}
|
||||||
setInputs(currentInputs);
|
setInputs(currentInputs);
|
||||||
setInputsRow(structuredClone(currentInputs));
|
setInputsRow(structuredClone(currentInputs));
|
||||||
refForm.current.setValues(currentInputs);
|
if (refForm.current) {
|
||||||
|
refForm.current.setValues(currentInputs);
|
||||||
|
}
|
||||||
|
|
||||||
// 同步到可视化配置
|
// 同步到可视化配置
|
||||||
const configs = jsonToConfigs(currentInputs.Chats || '[]');
|
const configs = jsonToConfigs(currentInputs.Chats || '[]');
|
||||||
@@ -220,6 +223,18 @@ export default function SettingsChats(props) {
|
|||||||
modalFormRef.current
|
modalFormRef.current
|
||||||
.validate()
|
.validate()
|
||||||
.then((values) => {
|
.then((values) => {
|
||||||
|
// 检查名称是否重复
|
||||||
|
const isDuplicate = chatConfigs.some(
|
||||||
|
(config) =>
|
||||||
|
config.name === values.name &&
|
||||||
|
(!isEdit || config.id !== editingConfig.id)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isDuplicate) {
|
||||||
|
showError(t('聊天应用名称已存在,请使用其他名称'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (isEdit) {
|
if (isEdit) {
|
||||||
const newConfigs = chatConfigs.map((config) =>
|
const newConfigs = chatConfigs.map((config) =>
|
||||||
config.id === editingConfig.id
|
config.id === editingConfig.id
|
||||||
@@ -263,6 +278,28 @@ export default function SettingsChats(props) {
|
|||||||
config.name.toLowerCase().includes(searchText.toLowerCase()),
|
config.name.toLowerCase().includes(searchText.toLowerCase()),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const highlightKeywords = (text) => {
|
||||||
|
if (!text) return text;
|
||||||
|
|
||||||
|
const parts = text.split(/(\{address\}|\{key\})/g);
|
||||||
|
return parts.map((part, index) => {
|
||||||
|
if (part === '{address}') {
|
||||||
|
return (
|
||||||
|
<span key={index} style={{ color: '#0077cc', fontWeight: 600 }}>
|
||||||
|
{part}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
} else if (part === '{key}') {
|
||||||
|
return (
|
||||||
|
<span key={index} style={{ color: '#ff6b35', fontWeight: 600 }}>
|
||||||
|
{part}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return part;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
title: t('聊天应用名称'),
|
title: t('聊天应用名称'),
|
||||||
@@ -275,7 +312,9 @@ export default function SettingsChats(props) {
|
|||||||
dataIndex: 'url',
|
dataIndex: 'url',
|
||||||
key: 'url',
|
key: 'url',
|
||||||
render: (text) => (
|
render: (text) => (
|
||||||
<div style={{ maxWidth: 300, wordBreak: 'break-all' }}>{text}</div>
|
<div style={{ maxWidth: 300, wordBreak: 'break-all' }}>
|
||||||
|
{highlightKeywords(text)}
|
||||||
|
</div>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -351,6 +390,14 @@ export default function SettingsChats(props) {
|
|||||||
>
|
>
|
||||||
{t('添加聊天配置')}
|
{t('添加聊天配置')}
|
||||||
</Button>
|
</Button>
|
||||||
|
<Button
|
||||||
|
type='primary'
|
||||||
|
theme='solid'
|
||||||
|
icon={<IconSaveStroked />}
|
||||||
|
onClick={onSubmit}
|
||||||
|
>
|
||||||
|
{t('保存聊天设置')}
|
||||||
|
</Button>
|
||||||
<Input
|
<Input
|
||||||
prefix={<IconSearch />}
|
prefix={<IconSearch />}
|
||||||
placeholder={t('搜索聊天应用名称')}
|
placeholder={t('搜索聊天应用名称')}
|
||||||
@@ -410,11 +457,17 @@ export default function SettingsChats(props) {
|
|||||||
)}
|
)}
|
||||||
</Form.Section>
|
</Form.Section>
|
||||||
|
|
||||||
<Space>
|
{editMode === 'json' && (
|
||||||
<Button type='primary' onClick={onSubmit}>
|
<Space>
|
||||||
{t('保存聊天设置')}
|
<Button
|
||||||
</Button>
|
type='primary'
|
||||||
</Space>
|
icon={<IconSaveStroked />}
|
||||||
|
onClick={onSubmit}
|
||||||
|
>
|
||||||
|
{t('保存聊天设置')}
|
||||||
|
</Button>
|
||||||
|
</Space>
|
||||||
|
)}
|
||||||
</Space>
|
</Space>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
Reference in New Issue
Block a user