blob: dec06ca1ccd3d470fb1fc579d55d63268dca7959 [file] [log] [blame]
86133a611b012025-06-07 22:11:57 +08001import React, { useEffect, useState } from 'react';
2import { Table, Spin, Alert } from 'antd';
3import {listBtTorrentPeers} from "@/pages/Peer/service";
4import {BtTorrentPeer} from "@/pages/Peer/data";
5
6
7interface PeerTableProps {
8 torrentId: number;
9}
10
11const PeerTable: React.FC<PeerTableProps> = ({ torrentId }) => {
12 const [loading, setLoading] = useState<boolean>(false);
13 const [peers, setPeers] = useState<BtTorrentPeer[]>([]);
14 const [error, setError] = useState<string | null>(null);
15
16 useEffect(() => {
17 const fetchPeers = async () => {
18 setLoading(true);
19 try {
20 const data = await listBtTorrentPeers();
21
22 setPeers(data.rows);
23 } catch (err) {
24 setError('Failed to load peer data.');
25 } finally {
26 setLoading(false);
27 }
28 };
29
30 fetchPeers();
31 }, [torrentId]);
32
33 const columns = [
34 { title: 'Peer Key', dataIndex: 'peerKey', key: 'peerKey' },
35 { title: 'IP Address', dataIndex: 'ip', key: 'ip' },
36 { title: 'Port', dataIndex: 'port', key: 'port' },
37 { title: 'Uploaded', dataIndex: 'uploaded', key: 'uploaded' },
38 { title: 'Downloaded', dataIndex: 'downloaded', key: 'downloaded' },
39 { title: 'Left', dataIndex: 'left', key: 'left' },
40 { title: 'Last Seen', dataIndex: 'lastSeen', key: 'lastSeen' },
41 ];
42
43 return (
44 <div>
45 {error && <Alert message={error} type="error" />}
46 {loading ? (
47 <Spin size="large" />
48 ) : (
49 <Table<BtTorrentPeer>
50 columns={columns}
51 dataSource={peers}
52 rowKey="peerKey"
53 pagination={false}
54 />
55 )}
56 </div>
57 );
58};
59
60export default PeerTable;