import React, { useEffect, useState, useContext } from 'react'; import { useNavigate } from 'react-router-dom'; import { API, copy, showError, showSuccess, timestamp2string, renderGroup, renderQuota } from '../../helpers'; import { ITEMS_PER_PAGE } from '../../constants'; import { Button, Card, Dropdown, Modal, Space, SplitButtonGroup, Table, Tag, Input, Divider, Avatar, } from '@douyinfe/semi-ui'; import { IconPlus, IconCopy, IconSearch, IconTreeTriangleDown, IconEyeOpened, IconEdit, IconDelete, IconStop, IconPlay, IconMore, IconMoneyExchangeStroked, IconHistogram, IconRotate, } from '@douyinfe/semi-icons'; import EditToken from '../../pages/Token/EditToken'; import { useTranslation } from 'react-i18next'; import { UserContext } from '../../context/User'; function renderTimestamp(timestamp) { return <>{timestamp2string(timestamp)}; } const TokensTable = () => { const { t } = useTranslation(); const navigate = useNavigate(); const [userState, userDispatch] = useContext(UserContext); const renderStatus = (status, model_limits_enabled = false) => { switch (status) { case 1: if (model_limits_enabled) { return ( {t('已启用:限制模型')} ); } else { return ( {t('已启用')} ); } case 2: return ( {t('已禁用')} ); case 3: return ( {t('已过期')} ); case 4: return ( {t('已耗尽')} ); default: return ( {t('未知状态')} ); } }; const columns = [ { title: t('名称'), dataIndex: 'name', width: 180, }, { title: t('状态'), dataIndex: 'status', key: 'status', width: 200, render: (text, record, index) => { return (
{renderStatus(text, record.model_limits_enabled)} {renderGroup(record.group)}
); }, }, { title: t('已用额度'), dataIndex: 'used_quota', width: 120, render: (text, record, index) => { return
{renderQuota(parseInt(text))}
; }, }, { title: t('剩余额度'), dataIndex: 'remain_quota', width: 120, render: (text, record, index) => { return (
{record.unlimited_quota ? ( {t('无限制')} ) : ( {renderQuota(parseInt(text))} )}
); }, }, { title: t('创建时间'), dataIndex: 'created_time', width: 180, render: (text, record, index) => { return
{renderTimestamp(text)}
; }, }, { title: t('过期时间'), dataIndex: 'expired_time', width: 180, render: (text, record, index) => { return (
{record.expired_time === -1 ? t('永不过期') : renderTimestamp(text)}
); }, }, { title: '', dataIndex: 'operate', width: 320, render: (text, record, index) => { let chats = localStorage.getItem('chats'); let chatsArray = []; let shouldUseCustom = true; if (shouldUseCustom) { try { chats = JSON.parse(chats); if (Array.isArray(chats)) { for (let i = 0; i < chats.length; i++) { let chat = {}; chat.node = 'item'; for (let key in chats[i]) { if (chats[i].hasOwnProperty(key)) { chat.key = i; chat.name = key; chat.onClick = () => { onOpenLink(key, chats[i][key], record); }; } } chatsArray.push(chat); } } } catch (e) { console.log(e); showError(t('聊天链接配置错误,请联系管理员')); } } // 创建更多操作的下拉菜单项 const moreMenuItems = [ { node: 'item', name: t('查看'), icon: , onClick: () => { Modal.info({ title: t('令牌详情'), content: 'sk-' + record.key, size: 'large', }); }, }, { node: 'item', name: t('删除'), icon: , type: 'danger', onClick: () => { Modal.confirm({ title: t('确定是否要删除此令牌?'), content: t('此修改将不可逆'), onOk: () => { manageToken(record.id, 'delete', record).then(() => { removeRecord(record.key); }); }, }); }, } ]; // 动态添加启用/禁用按钮 if (record.status === 1) { moreMenuItems.push({ node: 'item', name: t('禁用'), icon: , type: 'warning', onClick: () => { manageToken(record.id, 'disable', record); }, }); } else { moreMenuItems.push({ node: 'item', name: t('启用'), icon: , type: 'secondary', onClick: () => { manageToken(record.id, 'enable', record); }, }); } return (
} placeholder={t('搜索关键字')} value={searchKeyword} onChange={handleKeywordChange} className="!rounded-full" showClear />
} placeholder={t('密钥')} value={searchToken} onChange={handleSearchTokenChange} className="!rounded-full" showClear />
); return ( <> t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, total: tokens.length, }), onPageSizeChange: (size) => { setPageSize(size); setActivePage(1); }, onPageChange: handlePageChange, }} loading={loading} rowSelection={rowSelection} onRow={handleRow} className="rounded-xl overflow-hidden" size="middle" >
); }; export default TokensTable;