Skip to content

Commit b9b4c33

Browse files
committed
Handle React keys
1 parent 008356b commit b9b4c33

File tree

3 files changed

+33
-20
lines changed

3 files changed

+33
-20
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"react": "^18.3.1",
4141
"react-dom": "^18.3.1",
4242
"tslib": "^2.7.0",
43+
"uuid": "^11.0.5",
4344
"zustand": "^4.5.5",
4445
"zustand-querystring": "^0.0.19"
4546
},

src/components/ScValPrettyJson/index.tsx

+27-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Fragment } from "react";
22
import { XdrLargeInt } from "@stellar/stellar-sdk";
33
import { parse, stringify } from "lossless-json";
4+
import { v4 as uuidv4 } from "uuid";
45

56
import { SdsLink } from "@/components/SdsLink";
67
import { STELLAR_EXPERT } from "@/constants/settings";
@@ -14,8 +15,6 @@ import { AnyObject } from "@/types/types";
1415

1516
import "./styles.scss";
1617

17-
// TODO: unique React key
18-
1918
/* Create contract storage JSON-like structure */
2019
export const ScValPrettyJson = ({
2120
xdrString,
@@ -108,14 +107,16 @@ export const ScValPrettyJson = ({
108107
);
109108
}
110109

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+
));
119120

120121
if (isKey) {
121122
return renderedItems;
@@ -173,7 +174,8 @@ export const ScValPrettyJson = ({
173174
item: eVal,
174175
parentKey: eKey,
175176
isKey,
176-
renderKey: `${renderKey}-${parentKey}-${eKey}`,
177+
// Using UUID to make sure key will be unique
178+
renderKey: `${renderKey || parentKey || ""}${eKey}-${uuidv4()}`,
177179
});
178180
case "bool":
179181
return (
@@ -256,30 +258,35 @@ export const ScValPrettyJson = ({
256258
<Fragment key={renderKey}>
257259
<Bracket char="{" />
258260
<div className="ScValPrettyJson__container">
259-
{entries.map((e) => {
261+
{entries.map((e, eIdx) => {
260262
const [eKey, eVal] = e;
263+
const renKey = `${renderKey}-${parentKey}-${eKey}-${eIdx}`;
261264

262265
switch (eKey) {
263266
// Don't render these keys
264267
case "contract_instance":
265268
case "vec":
266269
case "wasm":
267270
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+
);
274281
default:
275282
return (
276-
<div className="ScValPrettyJson__row">
283+
<div className="ScValPrettyJson__row" key={renKey}>
277284
<div className="ScValPrettyJson__key">{eKey}</div>
278285
{render({
279286
item: eVal,
280287
parentKey: eKey,
281288
isKey,
282-
renderKey: `${renderKey}-${parentKey}-${eKey}`,
289+
renderKey: renKey,
283290
})}
284291
</div>
285292
);

yarn.lock

+5
Original file line numberDiff line numberDiff line change
@@ -5975,6 +5975,11 @@ util@^0.12.5:
59755975
is-typed-array "^1.1.3"
59765976
which-typed-array "^1.1.2"
59775977

5978+
uuid@^11.0.5:
5979+
version "11.0.5"
5980+
resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.0.5.tgz#07b46bdfa6310c92c3fb3953a8720f170427fc62"
5981+
integrity sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==
5982+
59785983
uuid@^8.3.2:
59795984
version "8.3.2"
59805985
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"

0 commit comments

Comments
 (0)