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, ModelRatio: "", CompletionRatio: "", GroupRatio: "", TopUpLink: "", ChatLink: "", QuotaPerUnit: 0, AutomaticDisableChannelEnabled: "", AutomaticEnableChannelEnabled: "", ChannelDisableThreshold: 0, LogConsumeEnabled: "", DisplayInCurrencyEnabled: "", DisplayTokenStatEnabled: "", ApproximateTokenEnabled: "", RetryTimes: 0, }); 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 () => { const res = await API.get("/api/option/"); const { success, message, data } = res.data; if (success) { let newInputs = {}; data.forEach((item) => { if (item.key === "ModelRatio" || item.key === "GroupRatio" || item.key === "CompletionRatio") { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } if (item.value === '{}') { item.value = ''; } newInputs[item.key] = item.value; }); setInputs(newInputs); setOriginInputs(newInputs); } else { showError(message); } }; useEffect(() => { getOptions().then(); }, []); const updateOption = async (key, value) => { setLoading(true); if (key.endsWith("Enabled")) { value = inputs[key] === "true" ? "false" : "true"; } const res = await API.put("/api/option/", { key, value, }); const { success, message } = res.data; if (success) { setInputs((inputs) => ({ ...inputs, [key]: value })); } else { showError(message); } 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["ModelRatio"] !== inputs.ModelRatio) { if (!verifyJSON(inputs.ModelRatio)) { showError("模型倍率不是合法的 JSON 字符串"); return; } await updateOption("ModelRatio", inputs.ModelRatio); } if (originInputs["GroupRatio"] !== inputs.GroupRatio) { if (!verifyJSON(inputs.GroupRatio)) { showError("分组倍率不是合法的 JSON 字符串"); return; } await updateOption("GroupRatio", inputs.GroupRatio); } if (originInputs['CompletionRatio'] !== inputs.CompletionRatio) { if (!verifyJSON(inputs.CompletionRatio)) { showError('补全倍率不是合法的 JSON 字符串'); return; } await updateOption('CompletionRatio', inputs.CompletionRatio); } 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 (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); } break; } showSuccess("保存成功!"); }; const deleteHistoryLogs = async () => { 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); }; return ( 充值链接 聊天链接 单位额度 重试次数 } /> } /> } /> } /> { setHistoryTimestamp( newValue === null ? null : newValue.unix() ); }} slotProps={{ actionBar: { actions: ["today", "clear", "accept"], }, }} /> 最长响应时间 额度提醒阈值 } /> } /> 新用户初始额度 请求预扣费额度 邀请新用户奖励额度 新用户使用邀请码奖励额度 ); }; export default OperationSetting;