mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-04-18 22:07:26 +00:00
- Added new components for GroupRatioSettings and ModelRatioSettings to manage group and model ratios. - Integrated tabs in OperationSetting to switch between model and visual ratio settings. - Updated translations for new settings and improved existing ones in the English locale file. - Refactored ModelSettingsVisualEditor to support dynamic pricing and ratio configurations. This update improves the user interface for managing operational settings, enhancing usability and localization support.
131 lines
4.2 KiB
JavaScript
131 lines
4.2 KiB
JavaScript
import React, { useEffect, useState, useRef } from 'react';
|
|
import { Button, Col, Form, Row, Spin } from '@douyinfe/semi-ui';
|
|
import {
|
|
compareObjects,
|
|
API,
|
|
showError,
|
|
showSuccess,
|
|
showWarning,
|
|
verifyJSON,
|
|
} from '../../../helpers';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
export default function GroupRatioSettings(props) {
|
|
const { t } = useTranslation();
|
|
const [loading, setLoading] = useState(false);
|
|
const [inputs, setInputs] = useState({
|
|
GroupRatio: '',
|
|
UserUsableGroups: ''
|
|
});
|
|
const refForm = useRef();
|
|
const [inputsRow, setInputsRow] = useState(inputs);
|
|
|
|
async function onSubmit() {
|
|
try {
|
|
await refForm.current.validate().then(() => {
|
|
const updateArray = compareObjects(inputs, inputsRow);
|
|
if (!updateArray.length) return showWarning(t('你似乎并没有修改什么'));
|
|
|
|
const requestQueue = updateArray.map((item) => {
|
|
const value = typeof inputs[item.key] === 'boolean'
|
|
? String(inputs[item.key])
|
|
: inputs[item.key];
|
|
return API.put('/api/option/', { key: item.key, value });
|
|
});
|
|
|
|
setLoading(true);
|
|
Promise.all(requestQueue)
|
|
.then((res) => {
|
|
if (res.includes(undefined)) {
|
|
return showError(requestQueue.length > 1 ? t('部分保存失败,请重试') : t('保存失败'));
|
|
}
|
|
|
|
for (let i = 0; i < res.length; i++) {
|
|
if (!res[i].data.success) {
|
|
return showError(res[i].data.message);
|
|
}
|
|
}
|
|
|
|
showSuccess(t('保存成功'));
|
|
props.refresh();
|
|
})
|
|
.catch(error => {
|
|
console.error('Unexpected error:', error);
|
|
showError(t('保存失败,请重试'));
|
|
})
|
|
.finally(() => {
|
|
setLoading(false);
|
|
});
|
|
}).catch(() => {
|
|
showError(t('请检查输入'));
|
|
});
|
|
} catch (error) {
|
|
showError(t('请检查输入'));
|
|
console.error(error);
|
|
}
|
|
}
|
|
|
|
useEffect(() => {
|
|
const currentInputs = {};
|
|
for (let key in props.options) {
|
|
if (Object.keys(inputs).includes(key)) {
|
|
currentInputs[key] = props.options[key];
|
|
}
|
|
}
|
|
setInputs(currentInputs);
|
|
setInputsRow(structuredClone(currentInputs));
|
|
refForm.current.setValues(currentInputs);
|
|
}, [props.options]);
|
|
|
|
return (
|
|
<Spin spinning={loading}>
|
|
<Form
|
|
values={inputs}
|
|
getFormApi={(formAPI) => (refForm.current = formAPI)}
|
|
style={{ marginBottom: 15 }}
|
|
>
|
|
<Form.Section text={t('分组设置')}>
|
|
<Row gutter={16}>
|
|
<Col span={16}>
|
|
<Form.TextArea
|
|
label={t('分组倍率')}
|
|
placeholder={t('为一个 JSON 文本,键为分组名称,值为倍率')}
|
|
field={'GroupRatio'}
|
|
autosize={{ minRows: 6, maxRows: 12 }}
|
|
trigger='blur'
|
|
stopValidateWithError
|
|
rules={[
|
|
{
|
|
validator: (rule, value) => verifyJSON(value),
|
|
message: t('不是合法的 JSON 字符串')
|
|
}
|
|
]}
|
|
onChange={(value) => setInputs({ ...inputs, GroupRatio: value })}
|
|
/>
|
|
</Col>
|
|
</Row>
|
|
<Row gutter={16}>
|
|
<Col span={16}>
|
|
<Form.TextArea
|
|
label={t('用户可选分组')}
|
|
placeholder={t('为一个 JSON 文本,键为分组名称,值为分组描述')}
|
|
field={'UserUsableGroups'}
|
|
autosize={{ minRows: 6, maxRows: 12 }}
|
|
trigger='blur'
|
|
stopValidateWithError
|
|
rules={[
|
|
{
|
|
validator: (rule, value) => verifyJSON(value),
|
|
message: t('不是合法的 JSON 字符串')
|
|
}
|
|
]}
|
|
onChange={(value) => setInputs({ ...inputs, UserUsableGroups: value })}
|
|
/>
|
|
</Col>
|
|
</Row>
|
|
</Form.Section>
|
|
</Form>
|
|
<Button onClick={onSubmit}>{t('保存分组倍率设置')}</Button>
|
|
</Spin>
|
|
);
|
|
}
|