import React, { useEffect, useState } from 'react'; import { Button, Form, Label, Popup, Pagination, Table } from 'semantic-ui-react'; import { Link } from 'react-router-dom'; import { API, copy, showError, showInfo, showSuccess, showWarning, timestamp2string } from '../helpers'; import { ITEMS_PER_PAGE } from '../constants'; import { renderQuota } from '../helpers/render'; 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 [redemptions, setRedemptions] = useState([]); const [loading, setLoading] = useState(true); const [activePage, setActivePage] = useState(1); const [searchKeyword, setSearchKeyword] = useState(''); const [searching, setSearching] = useState(false); const loadRedemptions = async (startIdx) => { const res = await API.get(`/api/redemption/?p=${startIdx}`); const { success, message, data } = res.data; if (success) { if (startIdx === 0) { setRedemptions(data); } else { let newRedemptions = redemptions; newRedemptions.push(...data); setRedemptions(newRedemptions); } } else { showError(message); } setLoading(false); }; 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 manageRedemption = async (id, action, idx) => { 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') { newRedemptions[realIdx].deleted = true; } else { newRedemptions[realIdx].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 (e, { value }) => { setSearchKeyword(value.trim()); }; const sortRedemption = (key) => { if (redemptions.length === 0) return; setLoading(true); let sortedRedemptions = [...redemptions]; sortedRedemptions.sort((a, b) => { if (!isNaN(a[key])) { // If the value is numeric, subtract to sort return a[key] - b[key]; } else { // If the value is not numeric, sort as strings return ('' + a[key]).localeCompare(b[key]); } }); if (sortedRedemptions[0].id === redemptions[0].id) { sortedRedemptions.reverse(); } setRedemptions(sortedRedemptions); setLoading(false); }; return ( <>