import { useState, useEffect } from 'react'; import { showError, showSuccess } from 'utils/common'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableContainer from '@mui/material/TableContainer'; import PerfectScrollbar from 'react-perfect-scrollbar'; import TablePagination from '@mui/material/TablePagination'; import LinearProgress from '@mui/material/LinearProgress'; import Alert from '@mui/material/Alert'; import ButtonGroup from '@mui/material/ButtonGroup'; import Toolbar from '@mui/material/Toolbar'; import { Button, Card, Box, Stack, Container, Typography } from '@mui/material'; import TokensTableRow from './component/TableRow'; import TokenTableHead from './component/TableHead'; import TableToolBar from 'ui-component/TableToolBar'; import { API } from 'utils/api'; import { ITEMS_PER_PAGE } from 'constants'; import { IconRefresh, IconPlus } from '@tabler/icons-react'; import EditeModal from './component/EditModal'; import { useSelector } from 'react-redux'; export default function Token() { const [tokens, setTokens] = useState([]); const [activePage, setActivePage] = useState(0); const [searching, setSearching] = useState(false); const [searchKeyword, setSearchKeyword] = useState(''); const [openModal, setOpenModal] = useState(false); const [editTokenId, setEditTokenId] = useState(0); const siteInfo = useSelector((state) => state.siteInfo); const loadTokens = async (startIdx) => { setSearching(true); try { const res = await API.get(`/api/token/?p=${startIdx}`); const { success, message, data } = res.data; if (success) { if (startIdx === 0) { setTokens(data); } else { let newTokens = [...tokens]; newTokens.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); setTokens(newTokens); } } else { showError(message); } } catch (error) { console.log(error); } setSearching(false); }; useEffect(() => { loadTokens(0) .then() .catch((reason) => { showError(reason); }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const onPaginationChange = (event, activePage) => { (async () => { if (activePage === Math.ceil(tokens.length / ITEMS_PER_PAGE)) { // In this case we have to load more data and then append them. await loadTokens(activePage); } setActivePage(activePage); })(); }; const searchTokens = async (event) => { event.preventDefault(); if (searchKeyword === '') { await loadTokens(0); setActivePage(0); return; } setSearching(true); try { const res = await API.get(`/api/token/search?keyword=${searchKeyword}`); const { success, message, data } = res.data; if (success) { setTokens(data); setActivePage(0); } else { showError(message); } } catch (error) { return; } setSearching(false); }; const handleSearchKeyword = (event) => { setSearchKeyword(event.target.value); }; const manageToken = async (id, action, value) => { const url = '/api/token/'; let data = { id }; let res; try { switch (action) { case 'delete': res = await API.delete(url + id); break; case 'status': res = await API.put(url + `?status_only=true`, { ...data, status: value }); break; } const { success, message } = res.data; if (success) { showSuccess('操作成功完成!'); if (action === 'delete') { await handleRefresh(); } } else { showError(message); } return res.data; } catch (error) { return; } }; // 处理刷新 const handleRefresh = async () => { await loadTokens(activePage); }; const handleOpenModal = (tokenId) => { setEditTokenId(tokenId); setOpenModal(true); }; const handleCloseModal = () => { setOpenModal(false); setEditTokenId(0); }; const handleOkModal = (status) => { if (status === true) { handleCloseModal(); handleRefresh(); } }; return ( <> 令牌 将OpenAI API基础地址https://api.openai.com替换为{siteInfo.server_address},复制下面的密钥即可使用。 theme.spacing(0, 1, 0, 3) }} > {searching && } {tokens.slice(activePage * ITEMS_PER_PAGE, (activePage + 1) * ITEMS_PER_PAGE).map((row) => ( ))}
); }