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 ,
8
9
ClientRequestsManager ,
9
10
buildRequest ,
11
+ ClientDealsManager ,
12
+ ClientRequestRecord ,
10
13
} from '../../../src/index.js' ; // @windingtree /sdk
11
14
import {
12
15
RequestQuery ,
13
16
OfferOptions ,
14
17
contractsConfig ,
15
18
serverAddress ,
16
19
} from '../../shared/index.js' ;
17
- import { OfferData } from '../../../src/shared/types.js' ;
20
+ import { OfferData , RequestData } from '../../../src/shared/types.js' ;
18
21
import { useWallet } from './providers/WalletProvider/WalletProviderContext.js' ;
19
22
import { AccountWidget } from './providers/WalletProvider/AccountWidget.js' ;
20
23
import { FormValues , RequestForm } from './components/RequestForm.js' ;
@@ -42,6 +45,10 @@ export const App = () => {
42
45
const requestsManager = useRef <
43
46
ClientRequestsManager < RequestQuery , OfferOptions > | undefined
44
47
> ( ) ;
48
+ const dealsManager = useRef < ClientDealsManager <
49
+ RequestQuery ,
50
+ OfferOptions
51
+ > > ( ) ;
45
52
const { publicClient } = useWallet ( ) ;
46
53
const [ connected , setConnected ] = useState < boolean > ( false ) ;
47
54
const [ selectedTab , setSelectedTab ] = useState < number > ( 0 ) ;
@@ -57,6 +64,63 @@ export const App = () => {
57
64
58
65
/** This hook starts the client that will be available via `client.current` */
59
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
+
60
124
const startClient = async ( ) => {
61
125
try {
62
126
setError ( undefined ) ;
@@ -67,88 +131,47 @@ export const App = () => {
67
131
68
132
const store = await storageInitializer ( ) ;
69
133
70
- const clientRequestManager = new ClientRequestsManager <
134
+ requestsManager . current = new ClientRequestsManager <
71
135
RequestQuery ,
72
136
OfferOptions
73
137
> ( {
74
138
storage : store ,
75
139
prefix : 'wt_requests_' ,
76
140
} ) ;
77
141
78
- const options : ClientOptions = {
142
+ dealsManager . current = new ClientDealsManager <
143
+ RequestQuery ,
144
+ OfferOptions
145
+ > ( {
146
+ storage : store ,
147
+ prefix : 'wt_deals_' ,
148
+ checkInterval : '5s' ,
79
149
chain,
80
150
contracts : contractsConfig ,
81
- serverAddress,
82
- storageInitializer,
83
- dbKeysPrefix : 'wt_' ,
84
151
publicClient,
85
- } ;
86
-
87
- const updateRequests = ( ) => {
88
- setRequests ( clientRequestManager . getAll ( ) ) ;
89
- } ;
90
-
91
- const updateDeals = ( ) => {
92
- if ( client . current ) {
93
- client . current . deals
94
- . getAll ( )
95
- . then ( ( newDeals ) => {
96
- setDeals ( newDeals ) ;
97
- } )
98
- . catch ( console . error ) ;
99
- }
100
- } ;
101
-
102
- client . current = createClient < RequestQuery , OfferOptions > ( options ) ;
103
-
104
- client . current . addEventListener ( 'start' , ( ) => {
105
- console . log ( '🚀 Client started at:' , new Date ( ) . toISOString ( ) ) ;
106
- updateRequests ( ) ;
107
- updateDeals ( ) ;
108
- } ) ;
109
-
110
- client . current . addEventListener ( 'stop' , ( ) => {
111
- console . log ( '👋 Client stopped at:' , new Date ( ) . toISOString ( ) ) ;
112
152
} ) ;
113
153
114
- client . current . addEventListener ( 'connected' , ( ) => {
115
- setConnected ( true ) ;
116
- console . log (
117
- '🔗 Client connected to server at:' ,
118
- new Date ( ) . toISOString ( ) ,
119
- ) ;
120
- } ) ;
121
-
122
- client . current . addEventListener ( 'disconnected' , ( ) => {
123
- setConnected ( false ) ;
124
- console . log (
125
- '🔌 Client disconnected from server at:' ,
126
- new Date ( ) . toISOString ( ) ,
127
- ) ;
154
+ client . current = createClient < RequestQuery , OfferOptions > ( {
155
+ serverAddress,
128
156
} ) ;
129
157
130
- /** Listening for requests events and update tables */
131
- clientRequestManager . addEventListener ( 'request' , updateRequests ) ;
132
- clientRequestManager . addEventListener ( 'expire' , updateRequests ) ;
133
- clientRequestManager . addEventListener ( 'cancel' , updateRequests ) ;
134
- clientRequestManager . addEventListener ( 'delete' , updateRequests ) ;
135
- clientRequestManager . addEventListener ( 'clear' , updateRequests ) ;
136
- clientRequestManager . addEventListener ( 'offer' , updateRequests ) ;
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 ) ;
137
164
138
- clientRequestManager . addEventListener ( 'subscribe' , ( { detail } ) => {
139
- client . current ?. subscribe ( detail . data . id ) ;
140
- } ) ;
141
- clientRequestManager . addEventListener ( 'unsubscribe' , ( { detail } ) => {
142
- client . current ?. unsubscribe ( detail . data . id ) ;
143
- } ) ;
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 ) ;
144
173
145
- client . current . addEventListener ( 'publish' , ( { detail } ) => {
146
- clientRequestManager . add ( detail ) ;
147
- } ) ;
148
- client . current . addEventListener ( 'offer' , ( { detail } ) => {
149
- clientRequestManager . addOffer ( detail ) ;
150
- } ) ;
151
- client . current . addEventListener ( 'deal:changed' , updateDeals ) ;
174
+ dealsManager . current . addEventListener ( 'changed' , updateDeals ) ;
152
175
153
176
await client . current . start ( ) ;
154
177
} catch ( error ) {
@@ -164,7 +187,26 @@ export const App = () => {
164
187
startClient ( ) ;
165
188
166
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
+
167
208
stopClient ( ) . catch ( console . error ) ;
209
+ dealsManager . current ?. stop ( ) ;
168
210
} ;
169
211
} , [ publicClient ] ) ;
170
212
@@ -248,10 +290,10 @@ export const App = () => {
248
290
setOffers ( undefined ) ;
249
291
} }
250
292
/>
251
- < MakeDeal offer = { offer } client = { client . current } />
293
+ < MakeDeal offer = { offer } manager = { dealsManager . current } />
252
294
</ TabPanel >
253
295
< TabPanel id = { 1 } activeTab = { selectedTab } >
254
- < Deals deals = { deals } client = { client . current } />
296
+ < Deals deals = { deals } manager = { dealsManager . current } />
255
297
</ TabPanel >
256
298
257
299
{ error && < div style = { { marginTop : 20 } } > 🚨 { error } </ div > }
0 commit comments