import PropTypes from "prop-types"; import { useState } from "react"; import { showInfo, showError, renderNumber } from "utils/common"; import { API } from "utils/api"; import { CHANNEL_OPTIONS } from "constants/ChannelConstants"; import { Popover, TableRow, MenuItem, TableCell, IconButton, TextField, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, Tooltip, Button, } from "@mui/material"; import Label from "ui-component/Label"; import TableSwitch from "ui-component/Switch"; import ResponseTimeLabel from "./ResponseTimeLabel"; import GroupLabel from "./GroupLabel"; import NameLabel from "./NameLabel"; import { IconDotsVertical, IconEdit, IconTrash } from "@tabler/icons-react"; export default function ChannelTableRow({ item, manageChannel, handleOpenModal, setModalChannelId, }) { const [open, setOpen] = useState(null); const [openDelete, setOpenDelete] = useState(false); const [statusSwitch, setStatusSwitch] = useState(item.status); const [priorityValve, setPriority] = useState(item.priority); const [responseTimeData, setResponseTimeData] = useState({ test_time: item.test_time, response_time: item.response_time, }); const [itemBalance, setItemBalance] = useState(item.balance); const handleDeleteOpen = () => { handleCloseMenu(); setOpenDelete(true); }; const handleDeleteClose = () => { setOpenDelete(false); }; const handleOpenMenu = (event) => { setOpen(event.currentTarget); }; const handleCloseMenu = () => { setOpen(null); }; const handleStatus = async () => { const switchVlue = statusSwitch === 1 ? 2 : 1; const { success } = await manageChannel(item.id, "status", switchVlue); if (success) { setStatusSwitch(switchVlue); } }; const handlePriority = async (event) => { const currentValue = parseInt(event.target.value); if (isNaN(currentValue) || currentValue === priorityValve) { return; } if (currentValue < 0) { showError("优先级不能小于 0"); return; } await manageChannel(item.id, "priority", currentValue); setPriority(currentValue); }; const handleResponseTime = async () => { const { success, time } = await manageChannel(item.id, "test", ""); if (success) { setResponseTimeData({ test_time: Date.now() / 1000, response_time: time * 1000, }); showInfo(`渠道 ${item.name} 测试成功,耗时 ${time.toFixed(2)} 秒。`); } }; const updateChannelBalance = async () => { const res = await API.get(`/api/channel/update_balance/${item.id}`); const { success, message, balance } = res.data; if (success) { setItemBalance(balance); showInfo(`余额更新成功!`); } else { showError(message); } }; const handleDelete = async () => { handleCloseMenu(); await manageChannel(item.id, "delete", ""); }; return ( <> {item.id} {!CHANNEL_OPTIONS[item.type] ? ( ) : ( )} { switch (statusSwitch) { case 1: return "已启用"; case 2: return "本渠道被手动禁用"; case 3: return "本渠道被程序自动禁用"; default: return "未知"; } })()} placement="top" > {renderNumber(item.used_quota)} {renderBalance(item.type, itemBalance)} { handleCloseMenu(); handleOpenModal(); setModalChannelId(item.id); }} > 编辑 删除 删除渠道 是否删除渠道 {item.name}? ); } ChannelTableRow.propTypes = { item: PropTypes.object, manageChannel: PropTypes.func, handleOpenModal: PropTypes.func, setModalChannelId: PropTypes.func, }; function renderBalance(type, balance) { switch (type) { case 1: // OpenAI return ${balance.toFixed(2)}; case 4: // CloseAI return ¥{balance.toFixed(2)}; case 8: // 自定义 return ${balance.toFixed(2)}; case 5: // OpenAI-SB return ¥{(balance / 10000).toFixed(2)}; case 10: // AI Proxy return {renderNumber(balance)}; case 12: // API2GPT return ¥{balance.toFixed(2)}; case 13: // AIGC2D return {renderNumber(balance)}; default: return 不支持; } }