1
1
import { useState , useEffect , useRef } from 'react' ;
2
2
import { hardhat , polygonZkEvmTestnet } from 'viem/chains' ;
3
+ import { EventHandler } from '@libp2p/interfaces/events' ;
3
4
import {
4
5
Client ,
5
6
ClientOptions ,
6
7
createClient ,
7
8
storage ,
9
+ ClientRequestsManager ,
10
+ buildRequest ,
11
+ ClientDealsManager ,
12
+ ClientRequestRecord ,
8
13
} from '../../../src/index.js' ; // @windingtree /sdk
9
14
import {
10
15
RequestQuery ,
11
16
OfferOptions ,
12
17
contractsConfig ,
13
18
serverAddress ,
14
19
} from '../../shared/index.js' ;
15
- import { OfferData } from '../../../src/shared/types.js' ;
20
+ import { OfferData , RequestData } from '../../../src/shared/types.js' ;
16
21
import { useWallet } from './providers/WalletProvider/WalletProviderContext.js' ;
17
22
import { AccountWidget } from './providers/WalletProvider/AccountWidget.js' ;
18
23
import { FormValues , RequestForm } from './components/RequestForm.js' ;
@@ -37,6 +42,13 @@ const defaultTopic = 'hello';
37
42
*/
38
43
export const App = ( ) => {
39
44
const client = useRef < Client < RequestQuery , OfferOptions > | undefined > ( ) ;
45
+ const requestsManager = useRef <
46
+ ClientRequestsManager < RequestQuery , OfferOptions > | undefined
47
+ > ( ) ;
48
+ const dealsManager = useRef < ClientDealsManager <
49
+ RequestQuery ,
50
+ OfferOptions
51
+ > > ( ) ;
40
52
const { publicClient } = useWallet ( ) ;
41
53
const [ connected , setConnected ] = useState < boolean > ( false ) ;
42
54
const [ selectedTab , setSelectedTab ] = useState < number > ( 0 ) ;
@@ -52,77 +64,114 @@ export const App = () => {
52
64
53
65
/** This hook starts the client that will be available via `client.current` */
54
66
useEffect ( ( ) => {
67
+ const updateRequests = ( ) => {
68
+ setRequests ( requestsManager . current ?. getAll ( ) || [ ] ) ;
69
+ } ;
70
+
71
+ const updateDeals = ( ) => {
72
+ if ( dealsManager . current ) {
73
+ dealsManager . current
74
+ . getAll ( )
75
+ . then ( ( newDeals ) => {
76
+ setDeals ( newDeals ) ;
77
+ } )
78
+ . catch ( console . error ) ;
79
+ }
80
+ } ;
81
+
82
+ const onClientStart = ( ) => {
83
+ console . log ( '🚀 Client started at:' , new Date ( ) . toISOString ( ) ) ;
84
+ updateRequests ( ) ;
85
+ updateDeals ( ) ;
86
+ } ;
87
+
88
+ const onClientStop = ( ) => {
89
+ console . log ( '👋 Client stopped at:' , new Date ( ) . toISOString ( ) ) ;
90
+ } ;
91
+
92
+ const onClientConnected = ( ) => {
93
+ setConnected ( true ) ;
94
+ console . log (
95
+ '🔗 Client connected to server at:' ,
96
+ new Date ( ) . toISOString ( ) ,
97
+ ) ;
98
+ } ;
99
+
100
+ const onClientDisconnected = ( ) => {
101
+ setConnected ( false ) ;
102
+ console . log (
103
+ '🔌 Client disconnected from server at:' ,
104
+ new Date ( ) . toISOString ( ) ,
105
+ ) ;
106
+ } ;
107
+
108
+ const onRequestSubscribe : EventHandler < CustomEvent < ClientRequestRecord > > = ( { detail } ) => {
109
+ client . current ?. subscribe ( detail . data . id ) ;
110
+ } ;
111
+
112
+ const onRequestUnsubscribe : EventHandler < CustomEvent < ClientRequestRecord > > = ( { detail } ) => {
113
+ client . current ?. unsubscribe ( detail . data . id ) ;
114
+ } ;
115
+
116
+ const onRequestPublish : EventHandler < CustomEvent < RequestData < RequestQuery > > > = ( { detail } ) => {
117
+ requestsManager . current ?. add ( detail ) ;
118
+ } ;
119
+
120
+ const onOffer : EventHandler < CustomEvent < OfferData < RequestQuery , OfferOptions > > > = ( { detail } ) => {
121
+ requestsManager . current ?. addOffer ( detail ) ;
122
+ } ;
123
+
55
124
const startClient = async ( ) => {
56
125
try {
57
126
setError ( undefined ) ;
58
127
59
- const options : ClientOptions = {
60
- chain,
61
- contracts : contractsConfig ,
62
- serverAddress,
63
- storageInitializer : storage . localStorage . createInitializer ( {
64
- session : false , // session or local storage
65
- } ) ,
66
- dbKeysPrefix : 'wt_' ,
67
- publicClient,
68
- } ;
69
-
70
- const updateRequests = ( ) => {
71
- if ( client . current ) {
72
- setRequests ( client . current . requests . getAll ( ) ) ;
73
- }
74
- } ;
75
-
76
- const updateDeals = ( ) => {
77
- if ( client . current ) {
78
- client . current . deals
79
- . getAll ( )
80
- . then ( ( newDeals ) => {
81
- setDeals ( newDeals ) ;
82
- } )
83
- . catch ( console . error ) ;
84
- }
85
- } ;
128
+ const storageInitializer = storage . localStorage . createInitializer ( {
129
+ session : false , // session or local storage
130
+ } ) ;
86
131
87
- client . current = createClient < RequestQuery , OfferOptions > ( options ) ;
132
+ const store = await storageInitializer ( ) ;
88
133
89
- client . current . addEventListener ( 'start' , ( ) => {
90
- console . log ( '🚀 Client started at:' , new Date ( ) . toISOString ( ) ) ;
91
- updateRequests ( ) ;
92
- updateDeals ( ) ;
134
+ requestsManager . current = new ClientRequestsManager <
135
+ RequestQuery ,
136
+ OfferOptions
137
+ > ( {
138
+ storage : store ,
139
+ prefix : 'wt_requests_' ,
93
140
} ) ;
94
141
95
- client . current . addEventListener ( 'stop' , ( ) => {
96
- console . log ( '👋 Client stopped at:' , new Date ( ) . toISOString ( ) ) ;
142
+ dealsManager . current = new ClientDealsManager <
143
+ RequestQuery ,
144
+ OfferOptions
145
+ > ( {
146
+ storage : store ,
147
+ prefix : 'wt_deals_' ,
148
+ checkInterval : '5s' ,
149
+ chain,
150
+ contracts : contractsConfig ,
151
+ publicClient,
97
152
} ) ;
98
153
99
- client . current . addEventListener ( 'connected' , ( ) => {
100
- setConnected ( true ) ;
101
- console . log (
102
- '🔗 Client connected to server at:' ,
103
- new Date ( ) . toISOString ( ) ,
104
- ) ;
154
+ client . current = createClient < RequestQuery , OfferOptions > ( {
155
+ serverAddress,
105
156
} ) ;
106
157
107
- client . current . addEventListener ( 'disconnected' , ( ) => {
108
- setConnected ( false ) ;
109
- console . log (
110
- '🔌 Client disconnected from server at:' ,
111
- new Date ( ) . toISOString ( ) ,
112
- ) ;
113
- } ) ;
158
+ client . current . addEventListener ( 'start' , onClientStart ) ;
159
+ client . current . addEventListener ( 'stop' , onClientStop ) ;
160
+ client . current . addEventListener ( 'connected' , onClientConnected ) ;
161
+ client . current . addEventListener ( 'disconnected' , onClientDisconnected ) ;
162
+ client . current . addEventListener ( 'publish' , onRequestPublish ) ;
163
+ client . current . addEventListener ( 'offer' , onOffer ) ;
114
164
115
- /** Listening for requests events and update tables */
116
- client . current . addEventListener ( 'request:create' , updateRequests ) ;
117
- client . current . addEventListener ( 'request:subscribe' , updateRequests ) ;
118
- client . current . addEventListener ( 'request:publish' , updateRequests ) ;
119
- client . current . addEventListener ( 'request:unsubscribe' , updateRequests ) ;
120
- client . current . addEventListener ( 'request:expire' , updateRequests ) ;
121
- client . current . addEventListener ( 'request:cancel' , updateRequests ) ;
122
- client . current . addEventListener ( 'request:delete' , updateRequests ) ;
123
- client . current . addEventListener ( 'request:offer' , updateRequests ) ;
124
- client . current . addEventListener ( 'request:clear' , updateRequests ) ;
125
- client . current . addEventListener ( 'deal:changed' , updateDeals ) ;
165
+ requestsManager . current . addEventListener ( 'request' , updateRequests ) ;
166
+ requestsManager . current . addEventListener ( 'expire' , updateRequests ) ;
167
+ requestsManager . current . addEventListener ( 'cancel' , updateRequests ) ;
168
+ requestsManager . current . addEventListener ( 'delete' , updateRequests ) ;
169
+ requestsManager . current . addEventListener ( 'clear' , updateRequests ) ;
170
+ requestsManager . current . addEventListener ( 'offer' , updateRequests ) ;
171
+ requestsManager . current . addEventListener ( 'subscribe' , onRequestSubscribe ) ;
172
+ requestsManager . current . addEventListener ( 'unsubscribe' , onRequestUnsubscribe ) ;
173
+
174
+ dealsManager . current . addEventListener ( 'changed' , updateDeals ) ;
126
175
127
176
await client . current . start ( ) ;
128
177
} catch ( error ) {
@@ -131,7 +180,34 @@ export const App = () => {
131
180
}
132
181
} ;
133
182
183
+ const stopClient = async ( ) => {
184
+ client . current ?. stop ( ) ;
185
+ } ;
186
+
134
187
startClient ( ) ;
188
+
189
+ return ( ) => {
190
+ client . current ?. removeEventListener ( 'start' , onClientStart ) ;
191
+ client . current ?. removeEventListener ( 'stop' , onClientStop ) ;
192
+ client . current ?. removeEventListener ( 'connected' , onClientConnected ) ;
193
+ client . current ?. removeEventListener ( 'disconnected' , onClientDisconnected ) ;
194
+ client . current ?. removeEventListener ( 'publish' , onRequestPublish ) ;
195
+ client . current ?. removeEventListener ( 'offer' , onOffer ) ;
196
+
197
+ requestsManager . current ?. removeEventListener ( 'request' , updateRequests ) ;
198
+ requestsManager . current ?. removeEventListener ( 'expire' , updateRequests ) ;
199
+ requestsManager . current ?. removeEventListener ( 'cancel' , updateRequests ) ;
200
+ requestsManager . current ?. removeEventListener ( 'delete' , updateRequests ) ;
201
+ requestsManager . current ?. removeEventListener ( 'clear' , updateRequests ) ;
202
+ requestsManager . current ?. removeEventListener ( 'offer' , updateRequests ) ;
203
+ requestsManager . current ?. removeEventListener ( 'subscribe' , onRequestSubscribe ) ;
204
+ requestsManager . current ?. removeEventListener ( 'unsubscribe' , onRequestUnsubscribe ) ;
205
+
206
+ dealsManager . current ?. removeEventListener ( 'changed' , updateDeals ) ;
207
+
208
+ stopClient ( ) . catch ( console . error ) ;
209
+ dealsManager . current ?. stop ( ) ;
210
+ } ;
135
211
} , [ publicClient ] ) ;
136
212
137
213
/** Publishing of request */
@@ -143,7 +219,7 @@ export const App = () => {
143
219
throw new Error ( 'The client is not initialized yet' ) ;
144
220
}
145
221
146
- const request = await client . current . requests . create ( {
222
+ const request = await buildRequest < RequestQuery > ( {
147
223
topic,
148
224
expire : defaultExpire ,
149
225
nonce : BigInt ( 1 ) ,
@@ -152,7 +228,7 @@ export const App = () => {
152
228
} ,
153
229
} ) ;
154
230
155
- client . current . requests . publish ( request ) ;
231
+ client . current . publish ( request ) ;
156
232
} catch ( error ) {
157
233
console . log ( '@@@' , error ) ;
158
234
setError ( ( error as Error ) . message ) ;
@@ -193,15 +269,15 @@ export const App = () => {
193
269
< TabPanel id = { 0 } activeTab = { selectedTab } >
194
270
< Requests
195
271
requests = { requests }
196
- subscribed = { ( id ) => client . current ?. requests . subscribed ( id ) || false }
272
+ subscribed = { ( id ) =>
273
+ requestsManager . current ?. get ( id ) ?. subscribed || false
274
+ }
197
275
onClear = { ( ) => {
198
- if ( client . current ) {
199
- client . current ?. requests . clear ( ) ;
200
- }
276
+ requestsManager . current ?. clear ( ) ;
201
277
} }
202
278
onCancel = { ( id ) => {
203
279
if ( client . current ) {
204
- client . current . requests . cancel ( id ) ;
280
+ requestsManager . current ? .cancel ( id ) ;
205
281
}
206
282
} }
207
283
onOffers = { setOffers }
@@ -214,10 +290,10 @@ export const App = () => {
214
290
setOffers ( undefined ) ;
215
291
} }
216
292
/>
217
- < MakeDeal offer = { offer } client = { client . current } />
293
+ < MakeDeal offer = { offer } manager = { dealsManager . current } />
218
294
</ TabPanel >
219
295
< TabPanel id = { 1 } activeTab = { selectedTab } >
220
- < Deals deals = { deals } client = { client . current } />
296
+ < Deals deals = { deals } manager = { dealsManager . current } />
221
297
</ TabPanel >
222
298
223
299
{ error && < div style = { { marginTop : 20 } } > 🚨 { error } </ div > }
0 commit comments