main
tsx 141 lines 3.53 KB
Raw
1 import { peerIdFromString } from '@libp2p/peer-id'
2 import { Component } from 'react'
3 import { Button } from '../button.js'
4 import { Panel } from '../panel.js'
5 import { SmallError, SmallSuccess } from '../status.js'
6 import { TextInput } from '../text-input.js'
7 import type { MetricsRPC } from '@ipshipyard/libp2p-inspector-metrics'
8 import type { PeerId } from '@libp2p/interface'
9 import type { FormEvent, ReactElement, JSX } from 'react'
10
11 export interface FindPeerProps {
12 metrics: MetricsRPC
13 }
14
15 export interface FindPeerState {
16 target: string
17 error: string
18 details: JSX.Element[]
19 }
20
21 export class FindPeer extends Component<FindPeerProps, FindPeerState> {
22 constructor (props: FindPeerProps) {
23 super(props)
24
25 this.state = {
26 target: '',
27 error: '',
28 details: []
29 }
30 }
31
32 componentDidMount (): void {
33 this.setState({
34 target: '',
35 error: '',
36 details: []
37 })
38 }
39
40 private findPeer (evt: FormEvent | Event, arg0: string): boolean {
41 evt.preventDefault()
42
43 this.setState({
44 error: '',
45 details: []
46 })
47
48 arg0 = arg0?.trim()
49
50 if (arg0 == null || arg0 === '') {
51 this.setState({
52 error: 'Please enter a key'
53 })
54
55 return false
56 }
57
58 let peerId: PeerId
59
60 try {
61 peerId = peerIdFromString(arg0)
62 } catch {
63 this.setState({
64 error: 'PeerId invalid'
65 })
66
67 return false
68 }
69
70 this.props.metrics.peerRouting.findPeer(peerId, {
71 onProgress: (event) => {
72 let message: string = event.type
73
74 if (event.type === 'dial:already-connected') {
75 message = 'Already connected to this peer'
76 } else if (event.type === 'dial:add-to-dial-queue') {
77 message = 'Adding dial to queue'
78 } else if (event.type === 'dial:already-in-dial-queue') {
79 message = 'Dial to this peer already in queue'
80 } else if (event.type === 'dial:calculate-addresses') {
81 message = 'Calculating addresses'
82 } else if (event.type === 'dial:selected-transport') {
83 message = `Selected transport ${event.detail}`
84 }
85
86 this.setState(s => {
87 return {
88 details: [
89 ...s.details,
90 <p key={`event-${s.details.length}`}>{message}</p>
91 ]
92 }
93 })
94 }
95 })
96 .then((peerInfo) => {
97 this.setState(s => {
98 return {
99 error: '',
100 details: [
101 ...s.details,
102 <pre key='results'><code>{JSON.stringify(peerInfo, null, 2)}</code></pre>,
103 <SmallSuccess key={`event-${s.details.length}`} message='Get successful' />
104 ]
105 }
106 })
107 })
108 .catch(err => {
109 this.setState(s => {
110 return {
111 details: [
112 ...s.details,
113 <SmallError key={`event-${s.details.length}`} error={err} />
114 ]
115 }
116 })
117 })
118
119 return false
120 }
121
122 render (): ReactElement {
123 return (
124 <Panel>
125 <p>Enter a PeerId:</p>
126 <form onSubmit={(evt) => this.findPeer(evt, this.state.target)}>
127 <TextInput
128 type='text' value={this.state.target} placeholder='123Foo...' onChange={(e) => {
129 this.setState({
130 target: e.target.value
131 })
132 }}
133 />
134 <Button onClick={(evt) => this.findPeer(evt, this.state.target)} primary>Get</Button>
135 </form>
136 {this.state.error != null ? <SmallError error={this.state.error} /> : undefined}
137 {this.state.details}
138 </Panel>
139 )
140 }
141 }