@@ -2,16 +2,18 @@ import Head from 'next/head'
2
2
import { CheckCircleIcon , XCircleIcon } from '@heroicons/react/20/solid'
3
3
import Nav from '@/components/nav'
4
4
import { useLibp2pContext } from '@/context/ctx'
5
- import { useInterval } from 'usehooks-ts'
6
- import type { PeerId } from '@libp2p/interface-peer-id'
7
5
import type { Connection } from '@libp2p/interface-connection'
8
6
import { usePeerContext } from '../context/peer-ctx'
9
- import { useEffect } from 'react'
7
+ import { useCallback , useEffect , useState } from 'react'
8
+ import Image from 'next/image'
9
+ import { multiaddr } from '@multiformats/multiaddr'
10
+ import { connectToMultiaddr } from '../lib/libp2p'
10
11
11
12
12
13
export default function Home ( ) {
13
14
const { libp2p } = useLibp2pContext ( )
14
15
const { peerStats, setPeerStats } = usePeerContext ( )
16
+ const [ maddr , setMultiaddr ] = useState ( '' )
15
17
16
18
useEffect ( ( ) => {
17
19
const peerConnectedCB = ( evt : CustomEvent < Connection > ) => {
@@ -36,14 +38,15 @@ export default function Home() {
36
38
37
39
connections . forEach ( ( conn ) => {
38
40
const exists = protoNames . get ( conn . remotePeer . toString ( ) )
41
+ const dedupedProtonames = [ ...new Set ( conn . remoteAddr . protoNames ( ) ) ]
39
42
40
- if ( exists ) {
41
- const namesToAdd = exists . filter (
42
- ( name ) => ! conn . remoteAddr . protoNames ( ) . includes ( name ) ,
43
- )
43
+ if ( exists ?. length ) {
44
+ const namesToAdd = dedupedProtonames . filter ( ( name ) => ! exists . includes ( name ) )
45
+ console . log ( 'namesToAdd: ' , namesToAdd )
44
46
protoNames . set ( conn . remotePeer . toString ( ) , [ ...exists , ...namesToAdd ] )
47
+
45
48
} else {
46
- protoNames . set ( conn . remotePeer . toString ( ) , conn . remoteAddr . protoNames ( ) )
49
+ protoNames . set ( conn . remotePeer . toString ( ) , dedupedProtonames )
47
50
}
48
51
} )
49
52
@@ -54,12 +57,38 @@ export default function Home() {
54
57
55
58
}
56
59
60
+ const handleConnectToMultiaddr = useCallback (
61
+ async ( e : React . MouseEvent < HTMLButtonElement > ) => {
62
+ if ( ! maddr ) {
63
+ return
64
+ }
65
+
66
+ try {
67
+ const connection = await connectToMultiaddr ( libp2p ) ( multiaddr ( maddr ) )
68
+ console . log ( 'connection: ' , connection )
69
+
70
+ return connection
71
+ } catch ( e ) {
72
+ console . error ( e )
73
+ }
74
+ } ,
75
+ [ libp2p , maddr ] ,
76
+ )
77
+
78
+ // handleConnectToMultiaddr
79
+
80
+ const handleMultiaddrChange = useCallback (
81
+ ( e : React . ChangeEvent < HTMLInputElement > ) => {
82
+ setMultiaddr ( e . target . value )
83
+ } ,
84
+ [ setMultiaddr ] ,
85
+ )
57
86
58
87
return (
59
88
< >
60
89
< Head >
61
- < title > js-libp2p-nextjs-example </ title >
62
- < meta name = "description" content = "js-libp2p-nextjs-example " />
90
+ < title > Universal Connectivity </ title >
91
+ < meta name = "description" content = "universal connectivity " />
63
92
< meta name = "viewport" content = "width=device-width, initial-scale=1" />
64
93
< link rel = "icon" href = "/favicon.ico" />
65
94
</ Head >
@@ -68,8 +97,14 @@ export default function Home() {
68
97
< div className = "py-10" >
69
98
< header >
70
99
< div className = "mx-auto max-w-7xl px-2 sm:px-6 lg:px-8" >
71
- < h1 className = "text-3xl font-bold leading-tight tracking-tight text-gray-900" >
72
- Libp2p WebTransport Example
100
+ < h1 className = "text-3xl font-bold leading-tight tracking-tight text-gray-900 flex flex-row" >
101
+ < p className = "mr-4" > Universal Connectivity</ p >
102
+ < Image
103
+ src = "/libp2p-hero.svg"
104
+ alt = "libp2p logo"
105
+ height = "46"
106
+ width = "46"
107
+ />
73
108
</ h1 >
74
109
</ div >
75
110
</ header >
@@ -78,6 +113,33 @@ export default function Home() {
78
113
< ul className = "my-2 space-y-2 break-all" >
79
114
< li className = "" > This PeerID: { libp2p . peerId . toString ( ) } </ li >
80
115
</ ul >
116
+ < div className = "my-6 w-1/2" >
117
+ < label
118
+ htmlFor = "peer-id"
119
+ className = "block text-sm font-medium leading-6 text-gray-900"
120
+ >
121
+ multiaddr to connect to
122
+ </ label >
123
+ < div className = "mt-2" >
124
+ < input
125
+ value = { maddr }
126
+ type = "text"
127
+ name = "peer-id"
128
+ id = "peer-id"
129
+ className = "block w-full rounded-md border-0 py-1.5 px-3 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"
130
+ placeholder = "12D3Koo..."
131
+ aria-describedby = "multiaddr-id-description"
132
+ onChange = { handleMultiaddrChange }
133
+ />
134
+ </ div >
135
+ < button
136
+ type = "button"
137
+ className = "rounded-md bg-indigo-600 my-2 py-2 px-3 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
138
+ onClick = { handleConnectToMultiaddr }
139
+ >
140
+ Connect to multiaddr
141
+ </ button >
142
+ </ div >
81
143
82
144
83
145
< div className = "my-4 inline-flex items-center text-xl" >
0 commit comments