import React, { useEffect, useState } from 'react'; import { Button, Form, Header, Message, Segment } from 'semantic-ui-react'; import { useNavigate, useParams } from 'react-router-dom'; import { API, copy, showError, showSuccess, timestamp2string } from '../../helpers'; import { renderQuotaWithPrompt } from '../../helpers/render'; const EditToken = () => { const params = useParams(); const tokenId = params.id; const isEdit = tokenId !== undefined; const [loading, setLoading] = useState(isEdit); const [modelOptions, setModelOptions] = useState([]); const originInputs = { name: '', remain_quota: isEdit ? 0 : 500000, expired_time: -1, unlimited_quota: false, models: [], subnet: "", }; const [inputs, setInputs] = useState(originInputs); const { name, remain_quota, expired_time, unlimited_quota } = inputs; const navigate = useNavigate(); const handleInputChange = (e, { name, value }) => { setInputs((inputs) => ({ ...inputs, [name]: value })); }; const handleCancel = () => { navigate('/token'); }; const setExpiredTime = (month, day, hour, minute) => { let now = new Date(); let timestamp = now.getTime() / 1000; let seconds = month * 30 * 24 * 60 * 60; seconds += day * 24 * 60 * 60; seconds += hour * 60 * 60; seconds += minute * 60; if (seconds !== 0) { timestamp += seconds; setInputs({ ...inputs, expired_time: timestamp2string(timestamp) }); } else { setInputs({ ...inputs, expired_time: -1 }); } }; const setUnlimitedQuota = () => { setInputs({ ...inputs, unlimited_quota: !unlimited_quota }); }; const loadToken = async () => { let res = await API.get(`/api/token/${tokenId}`); const { success, message, data } = res.data; if (success) { if (data.expired_time !== -1) { data.expired_time = timestamp2string(data.expired_time); } if (data.models === '') { data.models = []; } else { data.models = data.models.split(','); } setInputs(data); } else { showError(message); } setLoading(false); }; useEffect(() => { if (isEdit) { loadToken().then(); } loadAvailableModels().then(); }, []); const loadAvailableModels = async () => { let res = await API.get(`/api/user/available_models`); const { success, message, data } = res.data; if (success) { let options = data.map((model) => { return { key: model, text: model, value: model }; }); setModelOptions(options); } else { showError(message); } }; const submit = async () => { if (!isEdit && inputs.name === '') return; let localInputs = inputs; localInputs.remain_quota = parseInt(localInputs.remain_quota); if (localInputs.expired_time !== -1) { let time = Date.parse(localInputs.expired_time); if (isNaN(time)) { showError('过期时间格式错误!'); return; } localInputs.expired_time = Math.ceil(time / 1000); } localInputs.models = localInputs.models.join(','); let res; if (isEdit) { res = await API.put(`/api/token/`, { ...localInputs, id: parseInt(tokenId) }); } else { res = await API.post(`/api/token/`, localInputs); } const { success, message } = res.data; if (success) { if (isEdit) { showSuccess('令牌更新成功!'); } else { showSuccess('令牌创建成功,请在列表页面点击复制获取令牌!'); setInputs(originInputs); } } else { showError(message); } }; return ( <>
{isEdit ? '更新令牌信息' : '创建新的令牌'}
{ copy(value).then(); }} selection onChange={handleInputChange} value={inputs.models} autoComplete='new-password' options={modelOptions} />
注意,令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制。
); }; export default EditToken;