86133 | a611b01 | 2025-06-07 22:11:57 +0800 | [diff] [blame] | 1 | import React, { useEffect, useState } from 'react'; |
| 2 | import { Table, Spin, Alert } from 'antd'; |
| 3 | import {listBtTorrentPeers} from "@/pages/Peer/service"; |
| 4 | import {BtTorrentPeer} from "@/pages/Peer/data"; |
| 5 | |
| 6 | |
| 7 | interface PeerTableProps { |
| 8 | torrentId: number; |
| 9 | } |
| 10 | |
| 11 | const 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 | |
| 60 | export default PeerTable; |