1
1
import React , { useEffect , useState } from "react" ;
2
2
import { withRouter , RouteComponentProps } from "react-router" ;
3
- import { Row , Col , Typography , PageHeader , Descriptions } from "antd" ;
3
+ import {
4
+ Row ,
5
+ Col ,
6
+ Typography ,
7
+ PageHeader ,
8
+ Descriptions ,
9
+ Tag ,
10
+ Icon ,
11
+ Button
12
+ } from "antd" ;
4
13
import { Peer } from "../types" ;
5
14
import { ApiService } from "../utils/api" ;
6
15
import { useAppConfig } from "../hooks/dignose" ;
7
16
import { SearchPeerList } from "../components/search-peer-list" ;
8
17
import { MainLayout } from "../components/main-layout" ;
9
- import { Btn } from "../atoms/buttons" ;
10
18
11
19
const { Text } = Typography ;
12
20
13
21
function BaseDmeshPage ( props : RouteComponentProps ) : React . ReactElement {
14
- const [ track , setTrack ] = useState ( false ) ;
22
+ const [ visualize , setVisualize ] = useState ( false ) ;
23
+ const [ connected , setConnected ] = useState ( false ) ;
15
24
const [ peers , setPeers ] = useState < Peer [ ] > ( [ ] ) ;
16
25
const [ headBlockNum , setHeadBlockNum ] = useState ( 0 ) ;
17
26
18
27
const appConfig = useAppConfig ( ) ;
19
28
20
- const peerIndex = ( peerHost : string ) : number => {
21
- return peers . findIndex ( peer => peer . host === peerHost ) ;
22
- } ;
23
-
24
29
const deletePeer = ( peer : Peer ) => {
25
- const index = peerIndex ( peer . host ) ;
26
- if ( index >= 0 ) {
27
- setPeers ( currentPeers => {
28
- return [ ...currentPeers . slice ( index , 1 ) ] ;
30
+ setPeers ( currentPeers => {
31
+ const newCurrentPeers = currentPeers . map ( peerItem => {
32
+ if ( peerItem . key === peer . key ) {
33
+ return { ...peerItem , deleted : true , ready : false } ;
34
+ }
35
+ return peerItem ;
29
36
} ) ;
30
- }
37
+ return newCurrentPeers ;
38
+ } ) ;
31
39
} ;
32
40
33
41
const updatePeer = ( peer : Peer ) => {
34
42
if ( peer . headBlockNum > headBlockNum ) {
35
43
setHeadBlockNum ( peer . headBlockNum ) ;
36
44
}
37
45
setPeers ( currentPeers => {
38
- const newCUrrentPeers = currentPeers . map ( peerItem => {
39
- if ( peerItem . host === peer . host ) {
46
+ let foundPeer = false ;
47
+ let newCurrentPeers = currentPeers . map ( peerItem => {
48
+ if ( peerItem . key === peer . key ) {
49
+ foundPeer = true ;
40
50
return peer ;
41
51
}
42
52
return peerItem ;
43
53
} ) ;
44
- return newCUrrentPeers ;
54
+ if ( ! foundPeer ) {
55
+ newCurrentPeers = [ ...newCurrentPeers , peer ] ;
56
+ }
57
+ return newCurrentPeers ;
45
58
} ) ;
46
59
} ;
47
60
@@ -55,63 +68,79 @@ function BaseDmeshPage(props: RouteComponentProps): React.ReactElement {
55
68
} ;
56
69
57
70
useEffect ( ( ) => {
58
- let stream : WebSocket ;
59
- if ( track ) {
60
- setPeers ( [ ] ) ;
61
- stream = ApiService . stream ( {
62
- route : "search_peers" ,
63
- onComplete : ( ) => {
64
- setTrack ( false ) ;
65
- } ,
66
- onData : resp => {
67
- switch ( resp . type ) {
68
- case "Transaction" :
69
- break ;
70
- case "BlockRange" :
71
- break ;
72
- case "Message" :
73
- break ;
74
- case "PeerEvent" :
75
- if ( resp . payload . EventName === "sync" ) {
76
- addPeer ( resp . payload . Peer ) ;
77
- } else if ( resp . payload . EventName === "update" ) {
78
- updatePeer ( resp . payload . Peer ) ;
79
- } else if ( resp . payload . EventName === "delete" ) {
80
- deletePeer ( resp . payload . Peer ) ;
81
- }
82
- break ;
83
- }
71
+ setPeers ( [ ] ) ;
72
+ setConnected ( true ) ;
73
+ const stream = ApiService . stream ( {
74
+ route : "search_peers" ,
75
+ onError : ( ) => {
76
+ setConnected ( false ) ;
77
+ } ,
78
+ onComplete : ( ) => {
79
+ setConnected ( false ) ;
80
+ } ,
81
+ onData : resp => {
82
+ let localPeer ;
83
+ switch ( resp . type ) {
84
+ case "Transaction" :
85
+ break ;
86
+ case "BlockRange" :
87
+ break ;
88
+ case "Message" :
89
+ break ;
90
+ case "PeerEvent" :
91
+ localPeer = resp . payload . Peer ;
92
+ localPeer . key = resp . payload . PeerKey ;
93
+ if ( resp . payload . EventName === "sync" ) {
94
+ console . log (
95
+ `[SYNC] for peer ${ resp . payload . PeerKey } - ${ resp . payload . Peer . host } `
96
+ ) ;
97
+ addPeer ( localPeer ) ;
98
+ } else if ( resp . payload . EventName === "update" ) {
99
+ updatePeer ( localPeer ) ;
100
+ } else if ( resp . payload . EventName === "delete" ) {
101
+ console . log (
102
+ `[DELETED] for peer ${ resp . payload . PeerKey } - ${ resp . payload . Peer . host } `
103
+ ) ;
104
+ deletePeer ( localPeer ) ;
105
+ }
106
+ break ;
84
107
}
85
- } ) ;
86
- }
87
-
108
+ }
109
+ } ) ;
88
110
return ( ) => {
89
111
if ( stream ) {
90
- console . log ( "closing stream" ) ;
91
112
stream . close ( ) ;
92
113
}
93
114
} ;
94
- } , [ track ] ) ;
115
+ } , [ ] ) ;
95
116
96
117
return (
97
118
< MainLayout config = { appConfig } { ...props } >
98
119
< PageHeader
99
120
title = "Dmesh Peers"
121
+ tags = {
122
+ connected ? (
123
+ < Tag color = "geekblue" >
124
+ < Icon type = "sync" spin /> connected
125
+ </ Tag >
126
+ ) : (
127
+ < Tag color = "red" >
128
+ < Icon type = "disconnect" /> disconnected
129
+ </ Tag >
130
+ )
131
+ }
100
132
extra = { [
101
- < Btn
102
- key = { 1 }
103
- stopText = "Stop Tracking Dmesh"
104
- startText = "Track Dmesh"
105
- loading = { track }
106
- onStart = { e => {
107
- e . preventDefault ( ) ;
108
- setTrack ( true ) ;
109
- } }
110
- onStop = { e => {
133
+ < Button
134
+ key = "1"
135
+ onClick = { e => {
111
136
e . preventDefault ( ) ;
112
- setTrack ( false ) ;
137
+ setVisualize ( ! visualize ) ;
113
138
} }
114
- />
139
+ size = "small"
140
+ type = "ghost"
141
+ >
142
+ < Icon type = "sliders" />
143
+ </ Button >
115
144
] }
116
145
>
117
146
< Descriptions size = "small" column = { 3 } >
@@ -127,7 +156,11 @@ function BaseDmeshPage(props: RouteComponentProps): React.ReactElement {
127
156
< Row >
128
157
< Col >
129
158
< div style = { { marginTop : "10px" } } >
130
- < SearchPeerList peers = { peers } headBlockNum = { headBlockNum } />
159
+ < SearchPeerList
160
+ peers = { peers }
161
+ headBlockNum = { headBlockNum }
162
+ visualize = { visualize }
163
+ />
131
164
</ div >
132
165
</ Col >
133
166
</ Row >
0 commit comments