diff --git a/web/src/components/settings/PersonalSetting.js b/web/src/components/settings/PersonalSetting.js index 3b67812a..7e2b85fd 100644 --- a/web/src/components/settings/PersonalSetting.js +++ b/web/src/components/settings/PersonalSetting.js @@ -967,7 +967,7 @@ const PersonalSetting = () => { {systemToken && (
{ {/* BASE URL 与端点选择 */}
{ {t('邀请链接')} { const { t } = useTranslation(); - const originInputs = { + const formApiRef = useRef(null); + const [loading, setLoading] = useState(false); + + const getInitValues = () => ({ username: '', display_name: '', password: '', remark: '', - }; - const [inputs, setInputs] = useState(originInputs); - const [loading, setLoading] = useState(false); - const { username, display_name, password, remark } = inputs; + }); - const handleInputChange = (name, value) => { - setInputs((inputs) => ({ ...inputs, [name]: value })); - }; - - const submit = async () => { + const submit = async (values) => { setLoading(true); - if (inputs.username === '' || inputs.password === '') { - setLoading(false); - showError(t('用户名和密码不能为空!')); - return; - } - const res = await API.post(`/api/user/`, inputs); + const res = await API.post(`/api/user/`, values); const { success, message } = res.data; if (success) { showSuccess(t('用户账户创建成功!')); - setInputs(originInputs); + formApiRef.current?.setValues(getInitValues()); props.refresh(); props.handleClose(); } else { @@ -85,7 +78,7 @@ const AddUser = (props) => {
} closeIcon={null} - onCancel={() => handleCancel()} + onCancel={handleCancel} > -
- - {/* Header: Basic Info */} -
- - - -
- {t('基本信息')} -
{t('用户的基本账户信息')}
-
-
- -
-
- {t('用户名')} - handleInputChange('username', value)} - value={username} - autoComplete="new-password" - className="!rounded-lg" - showClear - /> -
- -
- {t('密码')} - handleInputChange('password', value)} - value={password} - autoComplete="new-password" - className="!rounded-lg" - /> -
- -
- {t('显示名称')} - handleInputChange('display_name', value)} - value={display_name} - autoComplete="new-password" - className="!rounded-lg" - showClear - /> -
- -
- {t('备注')} - handleInputChange('remark', value)} - value={remark} - autoComplete="off" - className="!rounded-lg" - showClear - /> -
-
-
- - {userId && ( - - {/* Header: Permission Settings */} -
- - - -
- {t('权限设置')} -
{t('用户分组和额度管理')}
-
-
- -
-
- {t('分组')} - handleInputChange('quota', value)} - value={quota} - type="number" - autoComplete="new-password" - className="flex-1 !rounded-lg" +
+ + + + - + + + + + + + + + + + + + + + + + {/* 权限设置 */} + {userId && ( + +
+ + + +
+ {t('权限设置')} +
{t('用户分组和额度管理')}
+
+
+ + + + + + + + + + + + +
-
+ + + {['github_id', 'oidc_id', 'wechat_id', 'email', 'telegram_id'].map((field) => ( + + + + ))} + + +
)} - - - {/* Header: Bindings */} -
- - - -
- {t('绑定信息')} -
{t('第三方账户绑定状态(只读)')}
-
-
- -
-
- {t('已绑定的 GitHub 账户')} - -
- -
- {t('已绑定的 OIDC 账户')} - -
- -
- {t('已绑定的微信账户')} - -
- -
- {t('已绑定的邮箱账户')} - -
- -
- {t('已绑定的 Telegram 账户')} - -
-
-
-
+ + {/* 添加额度模态框 */} { addLocalQuota(); @@ -398,26 +319,30 @@ const EditUser = (props) => { onCancel={() => setIsModalOpen(false)} closable={null} title={ -
- +
+ {t('添加额度')}
} > -
- - {`${t('新额度')}${renderQuota(quota)} + ${renderQuota(addQuotaLocal)} = ${renderQuota(quota + parseInt(addQuotaLocal || 0))}`} - +
+ { + (() => { + const current = formApiRef.current?.getValue('quota') || 0; + return ( + + {`${t('新额度')}${renderQuota(current)} + ${renderQuota(addQuotaLocal)} = ${renderQuota(current + parseInt(addQuotaLocal || 0))}`} + + ); + })() + }
{ - setAddQuotaLocal(value); - }} + type='number' value={addQuotaLocal} - type="number" - autoComplete="new-password" - className="!rounded-lg" + onChange={setAddQuotaLocal} + showClear />