1
1
import { Fragment } from "react" ;
2
2
import { XdrLargeInt } from "@stellar/stellar-sdk" ;
3
3
import { parse , stringify } from "lossless-json" ;
4
+ import { v4 as uuidv4 } from "uuid" ;
4
5
5
6
import { SdsLink } from "@/components/SdsLink" ;
6
7
import { STELLAR_EXPERT } from "@/constants/settings" ;
@@ -14,8 +15,6 @@ import { AnyObject } from "@/types/types";
14
15
15
16
import "./styles.scss" ;
16
17
17
- // TODO: unique React key
18
-
19
18
/* Create contract storage JSON-like structure */
20
19
export const ScValPrettyJson = ( {
21
20
xdrString,
@@ -108,14 +107,16 @@ export const ScValPrettyJson = ({
108
107
) ;
109
108
}
110
109
111
- const renderedItems = item . map ( ( arrayItem : any , arrayIndex : number ) =>
112
- render ( {
113
- item : arrayItem ,
114
- parentKey,
115
- isKey,
116
- renderKey : `${ renderKey || "init" } -${ parentKey } -${ arrayIndex } ` ,
117
- } ) ,
118
- ) ;
110
+ const renderedItems = item . map ( ( arrayItem : any , arrayIndex : number ) => (
111
+ < Fragment key = { `${ renderKey } -${ arrayIndex } ` } >
112
+ { render ( {
113
+ item : arrayItem ,
114
+ parentKey,
115
+ isKey,
116
+ renderKey : `${ renderKey || "" } ${ parentKey || "" } -${ arrayIndex } ` ,
117
+ } ) }
118
+ </ Fragment >
119
+ ) ) ;
119
120
120
121
if ( isKey ) {
121
122
return renderedItems ;
@@ -173,7 +174,8 @@ export const ScValPrettyJson = ({
173
174
item : eVal ,
174
175
parentKey : eKey ,
175
176
isKey,
176
- renderKey : `${ renderKey } -${ parentKey } -${ eKey } ` ,
177
+ // Using UUID to make sure key will be unique
178
+ renderKey : `${ renderKey || parentKey || "" } ${ eKey } -${ uuidv4 ( ) } ` ,
177
179
} ) ;
178
180
case "bool" :
179
181
return (
@@ -256,30 +258,35 @@ export const ScValPrettyJson = ({
256
258
< Fragment key = { renderKey } >
257
259
< Bracket char = "{" />
258
260
< div className = "ScValPrettyJson__container" >
259
- { entries . map ( ( e ) => {
261
+ { entries . map ( ( e , eIdx ) => {
260
262
const [ eKey , eVal ] = e ;
263
+ const renKey = `${ renderKey } -${ parentKey } -${ eKey } -${ eIdx } ` ;
261
264
262
265
switch ( eKey ) {
263
266
// Don't render these keys
264
267
case "contract_instance" :
265
268
case "vec" :
266
269
case "wasm" :
267
270
case "symbol" :
268
- return render ( {
269
- item : eVal ,
270
- parentKey : eKey ,
271
- isKey,
272
- renderKey : `${ renderKey } -${ parentKey } -${ eKey } ` ,
273
- } ) ;
271
+ return (
272
+ < Fragment key = { renKey } >
273
+ { render ( {
274
+ item : eVal ,
275
+ parentKey : eKey ,
276
+ isKey,
277
+ renderKey : renKey ,
278
+ } ) }
279
+ </ Fragment >
280
+ ) ;
274
281
default :
275
282
return (
276
- < div className = "ScValPrettyJson__row" >
283
+ < div className = "ScValPrettyJson__row" key = { renKey } >
277
284
< div className = "ScValPrettyJson__key" > { eKey } </ div >
278
285
{ render ( {
279
286
item : eVal ,
280
287
parentKey : eKey ,
281
288
isKey,
282
- renderKey : ` ${ renderKey } - ${ parentKey } - ${ eKey } ` ,
289
+ renderKey : renKey ,
283
290
} ) }
284
291
</ div >
285
292
) ;
0 commit comments