@@ -9,6 +9,8 @@ import { executeActions } from "@kleros/kleros-sdk/src/dataMappings/executeActio
9
9
import { populateTemplate } from "@kleros/kleros-sdk/src/dataMappings/utils/populateTemplate" ;
10
10
import { Answer , DisputeDetails } from "@kleros/kleros-sdk/src/dataMappings/utils/disputeDetailsTypes" ;
11
11
import { alchemyApiKey } from "context/Web3Provider" ;
12
+ import { useDebounce } from "react-use" ;
13
+ import Skeleton from "react-loading-skeleton" ;
12
14
13
15
const Container = styled . div `
14
16
width: 50%;
@@ -110,57 +112,96 @@ const LongText = styled.div`
110
112
width: auto;
111
113
` ;
112
114
113
- const DisputeTemplateView : React . FC = ( ) => {
115
+ const DisputeTemplateView = ( ) => {
114
116
const [ disputeDetails , setDisputeDetails ] = useState < DisputeDetails | undefined > ( undefined ) ;
115
117
const [ disputeTemplateInput , setDisputeTemplateInput ] = useState < string > ( "" ) ;
116
118
const [ dataMappingsInput , setDataMappingsInput ] = useState < string > ( "" ) ;
117
-
118
119
const [ arbitrator , setArbitrator ] = useState ( "" ) ;
119
120
const [ arbitrable , setArbitrable ] = useState ( "" ) ;
120
121
const [ arbitrableDisputeID , setArbitrableDisputeID ] = useState ( "" ) ;
121
122
const [ externalDisputeID , setExternalDisputeID ] = useState ( "" ) ;
122
123
const [ templateID , setTemplateID ] = useState ( "" ) ;
123
124
const [ templateUri , setTemplateUri ] = useState ( "" ) ;
124
125
126
+ const [ debouncedArbitrator , setDebouncedArbitrator ] = useState ( arbitrator ) ;
127
+ const [ debouncedArbitrable , setDebouncedArbitrable ] = useState ( arbitrable ) ;
128
+ const [ debouncedArbitrableDisputeID , setDebouncedArbitrableDisputeID ] = useState ( arbitrableDisputeID ) ;
129
+ const [ debouncedExternalDisputeID , setDebouncedExternalDisputeID ] = useState ( externalDisputeID ) ;
130
+ const [ debouncedTemplateID , setDebouncedTemplateID ] = useState ( templateID ) ;
131
+ const [ debouncedTemplateUri , setDebouncedTemplateUri ] = useState ( templateUri ) ;
132
+ const [ loading , setLoading ] = useState ( false ) ;
133
+
134
+ useDebounce ( ( ) => setDebouncedArbitrator ( arbitrator ) , 350 , [ arbitrator ] ) ;
135
+ useDebounce ( ( ) => setDebouncedArbitrable ( arbitrable ) , 350 , [ arbitrable ] ) ;
136
+ useDebounce ( ( ) => setDebouncedArbitrableDisputeID ( arbitrableDisputeID ) , 350 , [ arbitrableDisputeID ] ) ;
137
+ useDebounce ( ( ) => setDebouncedExternalDisputeID ( externalDisputeID ) , 350 , [ externalDisputeID ] ) ;
138
+ useDebounce ( ( ) => setDebouncedTemplateID ( templateID ) , 350 , [ templateID ] ) ;
139
+ useDebounce ( ( ) => setDebouncedTemplateUri ( templateUri ) , 350 , [ templateUri ] ) ;
140
+
125
141
useEffect ( ( ) => {
126
142
configureSDK ( { apiKey : alchemyApiKey } ) ;
127
143
128
- const initialContext = {
129
- arbitrator : arbitrator ,
130
- arbitrable : arbitrable ,
131
- arbitrableDisputeID : parseInt ( arbitrableDisputeID ) ,
132
- externalDisputeID : parseInt ( externalDisputeID ) ,
133
- templateID : parseInt ( templateID ) ,
134
- templateUri : templateUri ,
135
- } ;
144
+ let isFetchDataScheduled = false ;
145
+
146
+ const scheduleFetchData = ( ) => {
147
+ if ( ! isFetchDataScheduled ) {
148
+ isFetchDataScheduled = true ;
136
149
137
- if ( ! disputeTemplateInput || ! dataMappingsInput ) return ;
150
+ setLoading ( true ) ;
138
151
139
- const fetchData = async ( ) => {
140
- try {
141
- const parsedMappings = JSON . parse ( dataMappingsInput ) ;
142
- const data = await executeActions ( parsedMappings , initialContext ) ;
143
- const finalDisputeDetails = populateTemplate ( disputeTemplateInput , data ) ;
144
- setDisputeDetails ( finalDisputeDetails ) ;
145
- console . log ( "finalTemplate: " , finalDisputeDetails ) ;
146
- } catch ( e ) {
147
- console . error ( e ) ;
148
- setDisputeDetails ( undefined ) ;
152
+ setTimeout ( ( ) => {
153
+ const initialContext = {
154
+ arbitrator : debouncedArbitrator ,
155
+ arbitrable : debouncedArbitrable ,
156
+ arbitrableDisputeID : debouncedArbitrableDisputeID ,
157
+ externalDisputeID : debouncedExternalDisputeID ,
158
+ templateID : debouncedTemplateID ,
159
+ templateUri : debouncedTemplateUri ,
160
+ } ;
161
+
162
+ const fetchData = async ( ) => {
163
+ try {
164
+ const parsedMappings = JSON . parse ( dataMappingsInput ) ;
165
+ const data = await executeActions ( parsedMappings , initialContext ) ;
166
+ const finalDisputeDetails = populateTemplate ( disputeTemplateInput , data ) ;
167
+ setDisputeDetails ( finalDisputeDetails ) ;
168
+ } catch ( e ) {
169
+ console . error ( e ) ;
170
+ setDisputeDetails ( undefined ) ;
171
+ } finally {
172
+ setLoading ( false ) ;
173
+ }
174
+ } ;
175
+
176
+ fetchData ( ) ;
177
+
178
+ isFetchDataScheduled = false ;
179
+ } , 350 ) ;
149
180
}
150
181
} ;
151
182
152
- fetchData ( ) ;
183
+ if (
184
+ disputeTemplateInput ||
185
+ dataMappingsInput ||
186
+ debouncedArbitrator ||
187
+ debouncedArbitrable ||
188
+ debouncedArbitrableDisputeID ||
189
+ debouncedExternalDisputeID ||
190
+ debouncedTemplateID ||
191
+ debouncedTemplateUri
192
+ ) {
193
+ scheduleFetchData ( ) ;
194
+ }
153
195
} , [
154
196
disputeTemplateInput ,
155
197
dataMappingsInput ,
156
- arbitrable ,
157
- arbitrator ,
158
- arbitrableDisputeID ,
159
- externalDisputeID ,
160
- templateID ,
161
- templateUri ,
198
+ debouncedArbitrator ,
199
+ debouncedArbitrable ,
200
+ debouncedArbitrableDisputeID ,
201
+ debouncedExternalDisputeID ,
202
+ debouncedTemplateID ,
203
+ debouncedTemplateUri ,
162
204
] ) ;
163
-
164
205
return (
165
206
< >
166
207
< StyledHeader > Dispute Preview</ StyledHeader >
@@ -238,7 +279,7 @@ const DisputeTemplateView: React.FC = () => {
238
279
placeholder = "Enter data mappings"
239
280
/>
240
281
</ LongText >
241
- < Overview disputeDetails = { disputeDetails } />
282
+ { loading ? < Skeleton width = { 300 } /> : < Overview disputeDetails = { disputeDetails } /> }
242
283
</ LongTextSections >
243
284
</ >
244
285
) ;
0 commit comments