import React, {useEffect, useState} from 'react'; import {API, copy, showError, showInfo, showSuccess, showWarning, timestamp2string} from '../helpers'; import {ITEMS_PER_PAGE} from '../constants'; import {renderQuota} from '../helpers/render'; import {Button, Modal, Popconfirm, Popover, Table, Tag, Form} from "@douyinfe/semi-ui"; import EditRedemption from "../pages/Redemption/EditRedemption"; function renderTimestamp(timestamp) { return ( <> {timestamp2string(timestamp)} ); } function renderStatus(status) { switch (status) { case 1: return 未使用; case 2: return 已禁用 ; case 3: return 已使用 ; default: return 未知状态 ; } } const RedemptionsTable = () => { const columns = [ { title: 'ID', dataIndex: 'id', }, { title: '名称', dataIndex: 'name', }, { title: '状态', dataIndex: 'status', key: 'status', render: (text, record, index) => { return (
{renderStatus(text)}
); }, }, { title: '额度', dataIndex: 'quota', render: (text, record, index) => { return (
{renderQuota(parseInt(text))}
); }, }, { title: '创建时间', dataIndex: 'created_time', render: (text, record, index) => { return (
{renderTimestamp(text)}
); }, }, { title: '兑换人ID', dataIndex: 'used_user_id', render: (text, record, index) => { return (
{text === 0 ? '无' : text}
); }, }, { title: '', dataIndex: 'operate', render: (text, record, index) => (
{ manageRedemption(record.id, 'delete', record).then( () => { removeRecord(record.key); } ) }} > { record.status === 1 ? : }
), }, ]; const [redemptions, setRedemptions] = useState([]); const [loading, setLoading] = useState(true); const [activePage, setActivePage] = useState(1); const [searchKeyword, setSearchKeyword] = useState(''); const [searching, setSearching] = useState(false); const [tokenCount, setTokenCount] = useState(ITEMS_PER_PAGE); const [selectedKeys, setSelectedKeys] = useState([]); const [editingRedemption, setEditingRedemption] = useState({ id: undefined, }); const [showEdit, setShowEdit] = useState(false); const closeEdit = () => { setShowEdit(false); } // const setCount = (data) => { // if (data.length >= (activePage) * ITEMS_PER_PAGE) { // setTokenCount(data.length + 1); // } else { // setTokenCount(data.length); // } // } const setRedemptionFormat = (redeptions) => { // for (let i = 0; i < redeptions.length; i++) { // redeptions[i].key = '' + redeptions[i].id; // } // data.key = '' + data.id setRedemptions(redeptions); if (redeptions.length >= (activePage) * ITEMS_PER_PAGE) { setTokenCount(redeptions.length + 1); } else { setTokenCount(redeptions.length); } } const loadRedemptions = async (startIdx) => { const res = await API.get(`/api/redemption/?p=${startIdx}`); const {success, message, data} = res.data; if (success) { if (startIdx === 0) { setRedemptionFormat(data); } else { let newRedemptions = redemptions; newRedemptions.push(...data); setRedemptionFormat(newRedemptions); } } else { showError(message); } setLoading(false); }; const removeRecord = key => { let newDataSource = [...redemptions]; if (key != null) { let idx = newDataSource.findIndex(data => data.key === key); if (idx > -1) { newDataSource.splice(idx, 1); setRedemptions(newDataSource); } } }; const copyText = async (text) => { if (await copy(text)) { showSuccess('已复制到剪贴板!'); } else { // setSearchKeyword(text); Modal.error({title: '无法复制到剪贴板,请手动复制', content: text}); } } const onPaginationChange = (e, {activePage}) => { (async () => { if (activePage === Math.ceil(redemptions.length / ITEMS_PER_PAGE) + 1) { // In this case we have to load more data and then append them. await loadRedemptions(activePage - 1); } setActivePage(activePage); })(); }; useEffect(() => { loadRedemptions(0) .then() .catch((reason) => { showError(reason); }); }, []); const refresh = async () => { await loadRedemptions(activePage - 1); }; const manageRedemption = async (id, action, record) => { let data = {id}; let res; switch (action) { case 'delete': res = await API.delete(`/api/redemption/${id}/`); break; case 'enable': data.status = 1; res = await API.put('/api/redemption/?status_only=true', data); break; case 'disable': data.status = 2; res = await API.put('/api/redemption/?status_only=true', data); break; } const {success, message} = res.data; if (success) { showSuccess('操作成功完成!'); let redemption = res.data.data; let newRedemptions = [...redemptions]; // let realIdx = (activePage - 1) * ITEMS_PER_PAGE + idx; if (action === 'delete') { } else { record.status = redemption.status; } setRedemptions(newRedemptions); } else { showError(message); } }; const searchRedemptions = async () => { if (searchKeyword === '') { // if keyword is blank, load files instead. await loadRedemptions(0); setActivePage(1); return; } setSearching(true); const res = await API.get(`/api/redemption/search?keyword=${searchKeyword}`); const {success, message, data} = res.data; if (success) { setRedemptions(data); setActivePage(1); } else { showError(message); } setSearching(false); }; const handleKeywordChange = async (value) => { setSearchKeyword(value.trim()); }; const sortRedemption = (key) => { if (redemptions.length === 0) return; setLoading(true); let sortedRedemptions = [...redemptions]; sortedRedemptions.sort((a, b) => { return ('' + a[key]).localeCompare(b[key]); }); if (sortedRedemptions[0].id === redemptions[0].id) { sortedRedemptions.reverse(); } setRedemptions(sortedRedemptions); setLoading(false); }; const handlePageChange = page => { setActivePage(page); if (page === Math.ceil(redemptions.length / ITEMS_PER_PAGE) + 1) { // In this case we have to load more data and then append them. loadRedemptions(page - 1).then(r => { }); } }; let pageData = redemptions.slice((activePage - 1) * ITEMS_PER_PAGE, activePage * ITEMS_PER_PAGE); const rowSelection = { onSelect: (record, selected) => { }, onSelectAll: (selected, selectedRows) => { }, onChange: (selectedRowKeys, selectedRows) => { setSelectedKeys(selectedRows); }, }; const handleRow = (record, index) => { if (record.status !== 1) { return { style: { background: 'var(--semi-color-disabled-border)', }, }; } else { return {}; } }; return ( <>
`第 ${page.currentStart} - ${page.currentEnd} 条,共 ${redemptions.length} 条`, // onPageSizeChange: (size) => { // setPageSize(size); // setActivePage(1); // }, onPageChange: handlePageChange, }} loading={loading} rowSelection={rowSelection} onRow={handleRow}>
); }; export default RedemptionsTable;