import { useState, useEffect } from 'react'; import SubCard from 'ui-component/cards/SubCard'; import { Stack, FormControl, InputLabel, OutlinedInput, Checkbox, Button, FormControlLabel, TextField } from '@mui/material'; import { showSuccess, showError, verifyJSON } from 'utils/common'; import { API } from 'utils/api'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker'; import dayjs from 'dayjs'; require('dayjs/locale/zh-cn'); const OperationSetting = () => { let now = new Date(); let [inputs, setInputs] = useState({ QuotaForNewUser: 0, QuotaForInviter: 0, QuotaForInvitee: 0, QuotaRemindThreshold: 0, PreConsumedQuota: 0, GroupRatio: '', TopUpLink: '', ChatLink: '', QuotaPerUnit: 0, AutomaticDisableChannelEnabled: '', AutomaticEnableChannelEnabled: '', ChannelDisableThreshold: 0, LogConsumeEnabled: '', DisplayInCurrencyEnabled: '', DisplayTokenStatEnabled: '', ApproximateTokenEnabled: '', RetryTimes: 0, RetryCooldownSeconds: 0, MjNotifyEnabled: '' }); const [originInputs, setOriginInputs] = useState({}); let [loading, setLoading] = useState(false); let [historyTimestamp, setHistoryTimestamp] = useState(now.getTime() / 1000 - 30 * 24 * 3600); // a month ago new Date().getTime() / 1000 + 3600 const getOptions = async () => { try { const res = await API.get('/api/option/'); const { success, message, data } = res.data; if (success) { let newInputs = {}; data.forEach((item) => { if (item.key === 'GroupRatio') { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } newInputs[item.key] = item.value; }); setInputs(newInputs); setOriginInputs(newInputs); } else { showError(message); } } catch (error) { return; } }; useEffect(() => { getOptions().then(); }, []); const updateOption = async (key, value) => { setLoading(true); if (key.endsWith('Enabled')) { value = inputs[key] === 'true' ? 'false' : 'true'; } try { const res = await API.put('/api/option/', { key, value }); const { success, message } = res.data; if (success) { setInputs((inputs) => ({ ...inputs, [key]: value })); } else { showError(message); } } catch (error) { return; } setLoading(false); }; const handleInputChange = async (event) => { let { name, value } = event.target; if (name.endsWith('Enabled')) { await updateOption(name, value); showSuccess('设置成功!'); } else { setInputs((inputs) => ({ ...inputs, [name]: value })); } }; const submitConfig = async (group) => { switch (group) { case 'monitor': if (originInputs['ChannelDisableThreshold'] !== inputs.ChannelDisableThreshold) { await updateOption('ChannelDisableThreshold', inputs.ChannelDisableThreshold); } if (originInputs['QuotaRemindThreshold'] !== inputs.QuotaRemindThreshold) { await updateOption('QuotaRemindThreshold', inputs.QuotaRemindThreshold); } break; case 'ratio': if (originInputs['GroupRatio'] !== inputs.GroupRatio) { if (!verifyJSON(inputs.GroupRatio)) { showError('分组倍率不是合法的 JSON 字符串'); return; } await updateOption('GroupRatio', inputs.GroupRatio); } break; case 'quota': if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) { await updateOption('QuotaForNewUser', inputs.QuotaForNewUser); } if (originInputs['QuotaForInvitee'] !== inputs.QuotaForInvitee) { await updateOption('QuotaForInvitee', inputs.QuotaForInvitee); } if (originInputs['QuotaForInviter'] !== inputs.QuotaForInviter) { await updateOption('QuotaForInviter', inputs.QuotaForInviter); } if (originInputs['PreConsumedQuota'] !== inputs.PreConsumedQuota) { await updateOption('PreConsumedQuota', inputs.PreConsumedQuota); } break; case 'general': if (inputs.QuotaPerUnit < 0 || inputs.RetryTimes < 0 || inputs.RetryCooldownSeconds < 0) { showError('单位额度、重试次数、冷却时间不能为负数'); return; } if (originInputs['TopUpLink'] !== inputs.TopUpLink) { await updateOption('TopUpLink', inputs.TopUpLink); } if (originInputs['ChatLink'] !== inputs.ChatLink) { await updateOption('ChatLink', inputs.ChatLink); } if (originInputs['QuotaPerUnit'] !== inputs.QuotaPerUnit) { await updateOption('QuotaPerUnit', inputs.QuotaPerUnit); } if (originInputs['RetryTimes'] !== inputs.RetryTimes) { await updateOption('RetryTimes', inputs.RetryTimes); } if (originInputs['RetryCooldownSeconds'] !== inputs.RetryCooldownSeconds) { await updateOption('RetryCooldownSeconds', inputs.RetryCooldownSeconds); } break; } showSuccess('保存成功!'); }; const deleteHistoryLogs = async () => { try { const res = await API.delete(`/api/log/?target_timestamp=${Math.floor(historyTimestamp)}`); const { success, message, data } = res.data; if (success) { showSuccess(`${data} 条日志已清理!`); return; } showError('日志清理失败:' + message); } catch (error) { return; } }; return ( 充值链接 聊天链接 单位额度 重试次数 重试间隔(秒) } /> } /> } /> } /> } /> { setHistoryTimestamp(newValue === null ? null : newValue.unix()); }} slotProps={{ actionBar: { actions: ['today', 'clear', 'accept'] } }} /> 最长响应时间 额度提醒阈值 } /> } /> 新用户初始额度 请求预扣费额度 邀请新用户奖励额度 新用户使用邀请码奖励额度 ); }; export default OperationSetting;