@hyperlane-xyz/widgets 5.4.0 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chains/ChainAddMenu.d.ts +10 -0
- package/dist/chains/ChainAddMenu.d.ts.map +1 -0
- package/dist/chains/ChainAddMenu.js +102 -0
- package/dist/chains/ChainAddMenu.js.map +1 -0
- package/dist/chains/ChainDetailsMenu.d.ts +11 -0
- package/dist/chains/ChainDetailsMenu.d.ts.map +1 -0
- package/dist/chains/ChainDetailsMenu.js +224 -0
- package/dist/chains/ChainDetailsMenu.js.map +1 -0
- package/dist/{icons → chains}/ChainLogo.d.ts +3 -2
- package/dist/chains/ChainLogo.d.ts.map +1 -0
- package/dist/{icons → chains}/ChainLogo.js +8 -8
- package/dist/chains/ChainLogo.js.map +1 -0
- package/dist/chains/ChainSearchMenu.d.ts +22 -0
- package/dist/chains/ChainSearchMenu.d.ts.map +1 -0
- package/dist/chains/ChainSearchMenu.js +141 -0
- package/dist/chains/ChainSearchMenu.js.map +1 -0
- package/dist/chains/types.d.ts +5 -0
- package/dist/chains/types.d.ts.map +1 -0
- package/dist/chains/types.js +6 -0
- package/dist/chains/types.js.map +1 -0
- package/dist/color.d.ts +2 -1
- package/dist/color.d.ts.map +1 -1
- package/dist/color.js +2 -1
- package/dist/color.js.map +1 -1
- package/dist/components/Button.d.ts +5 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +12 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/CopyButton.d.ts +9 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +18 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/IconButton.d.ts +8 -0
- package/dist/components/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton.js +12 -0
- package/dist/components/IconButton.js.map +1 -0
- package/dist/components/LinkButton.d.ts +5 -0
- package/dist/components/LinkButton.d.ts.map +1 -0
- package/dist/components/LinkButton.js +12 -0
- package/dist/components/LinkButton.js.map +1 -0
- package/dist/components/SearchMenu.d.ts +38 -0
- package/dist/components/SearchMenu.d.ts.map +1 -0
- package/dist/components/SearchMenu.js +100 -0
- package/dist/components/SearchMenu.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +9 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +23 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/TextInput.d.ts +7 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +9 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/Tooltip.d.ts +9 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +12 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/icons/Airplane.d.ts +2 -7
- package/dist/icons/Airplane.d.ts.map +1 -1
- package/dist/icons/Airplane.js +2 -2
- package/dist/icons/Airplane.js.map +1 -1
- package/dist/icons/Arrow.d.ts +8 -0
- package/dist/icons/Arrow.d.ts.map +1 -0
- package/dist/icons/Arrow.js +25 -0
- package/dist/icons/Arrow.js.map +1 -0
- package/dist/icons/BoxArrow.d.ts +6 -0
- package/dist/icons/BoxArrow.d.ts.map +1 -0
- package/dist/icons/BoxArrow.js +9 -0
- package/dist/icons/BoxArrow.js.map +1 -0
- package/dist/icons/Checkmark.d.ts +6 -0
- package/dist/icons/Checkmark.d.ts.map +1 -0
- package/dist/icons/Checkmark.js +8 -0
- package/dist/icons/Checkmark.js.map +1 -0
- package/dist/icons/Chevron.d.ts +8 -0
- package/dist/icons/Chevron.d.ts.map +1 -0
- package/dist/icons/Chevron.js +25 -0
- package/dist/icons/Chevron.js.map +1 -0
- package/dist/icons/Circle.d.ts +2 -2
- package/dist/icons/Circle.d.ts.map +1 -1
- package/dist/icons/Circle.js +2 -2
- package/dist/icons/Circle.js.map +1 -1
- package/dist/icons/Copy.d.ts +6 -0
- package/dist/icons/Copy.d.ts.map +1 -0
- package/dist/icons/Copy.js +9 -0
- package/dist/icons/Copy.js.map +1 -0
- package/dist/icons/Envelope.d.ts +2 -7
- package/dist/icons/Envelope.d.ts.map +1 -1
- package/dist/icons/Envelope.js +2 -2
- package/dist/icons/Envelope.js.map +1 -1
- package/dist/icons/Filter.d.ts +6 -0
- package/dist/icons/Filter.d.ts.map +1 -0
- package/dist/icons/Filter.js +8 -0
- package/dist/icons/Filter.js.map +1 -0
- package/dist/icons/Funnel.d.ts +6 -0
- package/dist/icons/Funnel.d.ts.map +1 -0
- package/dist/icons/Funnel.js +8 -0
- package/dist/icons/Funnel.js.map +1 -0
- package/dist/icons/Gear.d.ts +6 -0
- package/dist/icons/Gear.d.ts.map +1 -0
- package/dist/icons/Gear.js +8 -0
- package/dist/icons/Gear.js.map +1 -0
- package/dist/icons/Lock.d.ts +2 -7
- package/dist/icons/Lock.d.ts.map +1 -1
- package/dist/icons/Lock.js +2 -2
- package/dist/icons/Lock.js.map +1 -1
- package/dist/icons/Pencil.d.ts +6 -0
- package/dist/icons/Pencil.d.ts.map +1 -0
- package/dist/icons/Pencil.js +9 -0
- package/dist/icons/Pencil.js.map +1 -0
- package/dist/icons/Plus.d.ts +6 -0
- package/dist/icons/Plus.d.ts.map +1 -0
- package/dist/icons/Plus.js +8 -0
- package/dist/icons/Plus.js.map +1 -0
- package/dist/icons/PlusCircle.d.ts +6 -0
- package/dist/icons/PlusCircle.d.ts.map +1 -0
- package/dist/icons/PlusCircle.js +8 -0
- package/dist/icons/PlusCircle.js.map +1 -0
- package/dist/icons/QuestionMark.d.ts +2 -7
- package/dist/icons/QuestionMark.d.ts.map +1 -1
- package/dist/icons/QuestionMark.js +3 -3
- package/dist/icons/QuestionMark.js.map +1 -1
- package/dist/icons/Search.d.ts +6 -0
- package/dist/icons/Search.d.ts.map +1 -0
- package/dist/icons/Search.js +8 -0
- package/dist/icons/Search.js.map +1 -0
- package/dist/icons/Shield.d.ts +2 -7
- package/dist/icons/Shield.d.ts.map +1 -1
- package/dist/icons/Shield.js +2 -2
- package/dist/icons/Shield.js.map +1 -1
- package/dist/icons/Spinner.d.ts +6 -0
- package/dist/icons/Spinner.d.ts.map +1 -0
- package/dist/icons/Spinner.js +9 -0
- package/dist/icons/Spinner.js.map +1 -0
- package/dist/icons/UpDownArrows.d.ts +6 -0
- package/dist/icons/UpDownArrows.d.ts.map +1 -0
- package/dist/icons/UpDownArrows.js +8 -0
- package/dist/icons/UpDownArrows.js.map +1 -0
- package/dist/icons/WideChevron.d.ts +4 -7
- package/dist/icons/WideChevron.d.ts.map +1 -1
- package/dist/icons/WideChevron.js +3 -3
- package/dist/icons/WideChevron.js.map +1 -1
- package/dist/icons/X.d.ts +6 -0
- package/dist/icons/X.d.ts.map +1 -0
- package/dist/icons/X.js +8 -0
- package/dist/icons/X.js.map +1 -0
- package/dist/icons/types.d.ts +5 -0
- package/dist/icons/types.d.ts.map +1 -0
- package/dist/icons/types.js +2 -0
- package/dist/icons/types.js.map +1 -0
- package/dist/index.d.ts +34 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/layout/DropdownMenu.d.ts +12 -0
- package/dist/layout/DropdownMenu.d.ts.map +1 -0
- package/dist/layout/DropdownMenu.js +9 -0
- package/dist/layout/DropdownMenu.js.map +1 -0
- package/dist/layout/Modal.d.ts +18 -0
- package/dist/layout/Modal.d.ts.map +1 -0
- package/dist/layout/Modal.js +23 -0
- package/dist/layout/Modal.js.map +1 -0
- package/dist/layout/Popover.d.ts +12 -0
- package/dist/layout/Popover.d.ts.map +1 -0
- package/dist/layout/Popover.js +9 -0
- package/dist/layout/Popover.js.map +1 -0
- package/dist/logos/Hyperlane.d.ts +6 -0
- package/dist/logos/Hyperlane.d.ts.map +1 -0
- package/dist/logos/Hyperlane.js +10 -0
- package/dist/logos/Hyperlane.js.map +1 -0
- package/dist/messages/useMessageStage.js +1 -1
- package/dist/messages/useMessageStage.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/clipboard.d.ts +4 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +25 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/explorers.d.ts.map +1 -1
- package/dist/utils/explorers.js +1 -1
- package/dist/utils/explorers.js.map +1 -1
- package/dist/utils/useChainConnectionTest.d.ts +4 -0
- package/dist/utils/useChainConnectionTest.d.ts.map +1 -0
- package/dist/utils/useChainConnectionTest.js +19 -0
- package/dist/utils/useChainConnectionTest.js.map +1 -0
- package/package.json +8 -4
- package/dist/icons/ChainLogo.d.ts.map +0 -1
- package/dist/icons/ChainLogo.js.map +0 -1
- package/dist/utils/timeout.d.ts +0 -2
- package/dist/utils/timeout.d.ts.map +0 -1
- package/dist/utils/timeout.js +0 -11
- package/dist/utils/timeout.js.map +0 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ChainMap, ChainMetadata } from '@hyperlane-xyz/sdk';
|
|
3
|
+
export interface ChainAddMenuProps {
|
|
4
|
+
chainMetadata: ChainMap<ChainMetadata>;
|
|
5
|
+
overrideChainMetadata?: ChainMap<Partial<ChainMetadata> | undefined>;
|
|
6
|
+
onChangeOverrideMetadata: (overrides?: ChainMap<Partial<ChainMetadata> | undefined>) => void;
|
|
7
|
+
onClickBack?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export declare function ChainAddMenu(props: ChainAddMenuProps): React.JSX.Element;
|
|
10
|
+
//# sourceMappingURL=ChainAddMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainAddMenu.d.ts","sourceRoot":"","sources":["../../src/chains/ChainAddMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,OAAO,EACL,QAAQ,EACR,aAAa,EAGd,MAAM,oBAAoB,CAAC;AAe5B,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvC,qBAAqB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC;IACrE,wBAAwB,EAAE,CACxB,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACrD,IAAI,CAAC;IACV,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,qBAOpD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { DEFAULT_GITHUB_REGISTRY } from '@hyperlane-xyz/registry';
|
|
4
|
+
import { ChainMetadataSchema, MultiProtocolProvider, } from '@hyperlane-xyz/sdk';
|
|
5
|
+
import { failure, success, tryParseJsonOrYaml, } from '@hyperlane-xyz/utils';
|
|
6
|
+
import { ColorPalette } from '../color.js';
|
|
7
|
+
import { Button } from '../components/Button.js';
|
|
8
|
+
import { CopyButton } from '../components/CopyButton.js';
|
|
9
|
+
import { LinkButton } from '../components/LinkButton.js';
|
|
10
|
+
import { ChevronIcon } from '../icons/Chevron.js';
|
|
11
|
+
import { PlusIcon } from '../icons/Plus.js';
|
|
12
|
+
export function ChainAddMenu(props) {
|
|
13
|
+
return (React.createElement("div", { className: "htw-space-y-4" },
|
|
14
|
+
React.createElement(Header, { ...props }),
|
|
15
|
+
React.createElement(Form, { ...props })));
|
|
16
|
+
}
|
|
17
|
+
function Header({ onClickBack }) {
|
|
18
|
+
return (React.createElement("div", null,
|
|
19
|
+
!!onClickBack && (React.createElement(LinkButton, { onClick: onClickBack, className: "htw-py-1 htw-mb-1.5" },
|
|
20
|
+
React.createElement("div", { className: "htw-flex htw-items-center htw-gap-1.5" },
|
|
21
|
+
React.createElement(ChevronIcon, { width: 12, height: 12, direction: "w", className: "htw-opacity-70" }),
|
|
22
|
+
React.createElement("span", { className: "htw-text-xs htw-text-gray-600" }, "Back")))),
|
|
23
|
+
React.createElement("h2", { className: "htw-text-lg htw-font-medium" }, "Add chain metadata"),
|
|
24
|
+
React.createElement("p", { className: "htw-mt-1 htw-text-sm htw-text-gray-500" },
|
|
25
|
+
"Add metadata for chains not yet included in the",
|
|
26
|
+
' ',
|
|
27
|
+
React.createElement("a", { href: DEFAULT_GITHUB_REGISTRY, target: "_blank", rel: "noopener noreferrer", className: "htw-underline htw-underline-offset-2" }, "Hyperlane Canonical Registry"),
|
|
28
|
+
". Note, this data will only be used locally in your own browser. It does not affect the registry.")));
|
|
29
|
+
}
|
|
30
|
+
function Form({ chainMetadata, overrideChainMetadata, onChangeOverrideMetadata, onClickBack, }) {
|
|
31
|
+
const [textInput, setTextInput] = useState('');
|
|
32
|
+
const [error, setError] = useState(null);
|
|
33
|
+
const onChangeInput = (e) => {
|
|
34
|
+
setTextInput(e.target.value);
|
|
35
|
+
setError(null);
|
|
36
|
+
};
|
|
37
|
+
const onClickAdd = () => {
|
|
38
|
+
const result = tryParseMetadataInput(textInput, chainMetadata);
|
|
39
|
+
if (result.success) {
|
|
40
|
+
onChangeOverrideMetadata({
|
|
41
|
+
...overrideChainMetadata,
|
|
42
|
+
[result.data.name]: result.data,
|
|
43
|
+
});
|
|
44
|
+
setTextInput('');
|
|
45
|
+
onClickBack?.();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
setError(`Invalid config: ${result.error}`);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return (React.createElement("div", { className: "htw-space-y-1.5" },
|
|
52
|
+
React.createElement("div", { className: "htw-relative" },
|
|
53
|
+
React.createElement("textarea", { className: clsx('htw-text-xs htw-resize htw-border htw-border-gray-200 focus:htw-border-gray-400 htw-rounded-sm htw-p-2 htw-w-full htw-min-h-72 htw-outline-none', error && 'htw-border-red-500'), placeholder: placeholderText, value: textInput, onChange: onChangeInput }),
|
|
54
|
+
error && React.createElement("div", { className: "htw-text-red-600 htw-text-sm" }, error),
|
|
55
|
+
React.createElement(CopyButton, { copyValue: textInput || placeholderText, width: 14, height: 14, className: "htw-absolute htw-right-6 htw-top-3" })),
|
|
56
|
+
React.createElement(Button, { onClick: onClickAdd, className: "htw-bg-gray-600 htw-px-3 htw-py-1.5 htw-gap-1 htw-text-white htw-text-sm" },
|
|
57
|
+
React.createElement(PlusIcon, { width: 20, height: 20, color: ColorPalette.White }),
|
|
58
|
+
React.createElement("span", null, "Add chain"))));
|
|
59
|
+
}
|
|
60
|
+
function tryParseMetadataInput(input, existingChainMetadata) {
|
|
61
|
+
const parsed = tryParseJsonOrYaml(input);
|
|
62
|
+
if (!parsed.success)
|
|
63
|
+
return parsed;
|
|
64
|
+
const result = ChainMetadataSchema.safeParse(parsed.data);
|
|
65
|
+
if (!result.success) {
|
|
66
|
+
console.error('Error validating chain config', result.error);
|
|
67
|
+
const firstIssue = result.error.issues[0];
|
|
68
|
+
return failure(`${firstIssue.path} => ${firstIssue.message}`);
|
|
69
|
+
}
|
|
70
|
+
const newMetadata = result.data;
|
|
71
|
+
const multiProvider = new MultiProtocolProvider(existingChainMetadata);
|
|
72
|
+
if (multiProvider.tryGetChainMetadata(newMetadata.name)) {
|
|
73
|
+
return failure('name is already in use by another chain');
|
|
74
|
+
}
|
|
75
|
+
if (multiProvider.tryGetChainMetadata(newMetadata.chainId)) {
|
|
76
|
+
return failure('chainId is already in use by another chain');
|
|
77
|
+
}
|
|
78
|
+
if (newMetadata.domainId &&
|
|
79
|
+
multiProvider.tryGetChainMetadata(newMetadata.domainId)) {
|
|
80
|
+
return failure('domainId is already in use by another chain');
|
|
81
|
+
}
|
|
82
|
+
return success(newMetadata);
|
|
83
|
+
}
|
|
84
|
+
const placeholderText = `# YAML data
|
|
85
|
+
---
|
|
86
|
+
chainId: 11155111
|
|
87
|
+
name: sepolia
|
|
88
|
+
displayName: Sepolia
|
|
89
|
+
protocol: ethereum
|
|
90
|
+
rpcUrls:
|
|
91
|
+
- http: https://foobar.com
|
|
92
|
+
blockExplorers:
|
|
93
|
+
- name: Sepolia Etherscan
|
|
94
|
+
family: etherscan
|
|
95
|
+
url: https://sepolia.etherscan.io
|
|
96
|
+
apiUrl: https://api-sepolia.etherscan.io/api
|
|
97
|
+
apiKey: '12345'
|
|
98
|
+
blocks:
|
|
99
|
+
confirmations: 1
|
|
100
|
+
estimateBlockTime: 13
|
|
101
|
+
`;
|
|
102
|
+
//# sourceMappingURL=ChainAddMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainAddMenu.js","sourceRoot":"","sources":["../../src/chains/ChainAddMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ChainMetadata } from '@hyperlane-xyz/sdk';
|
|
3
|
+
export interface ChainDetailsMenuProps {
|
|
4
|
+
chainMetadata: ChainMetadata;
|
|
5
|
+
overrideChainMetadata?: Partial<ChainMetadata>;
|
|
6
|
+
onChangeOverrideMetadata: (overrides?: Partial<ChainMetadata>) => void;
|
|
7
|
+
onClickBack?: () => void;
|
|
8
|
+
onRemoveChain?: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function ChainDetailsMenu(props: ChainDetailsMenuProps): React.JSX.Element;
|
|
11
|
+
//# sourceMappingURL=ChainDetailsMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainDetailsMenu.d.ts","sourceRoot":"","sources":["../../src/chains/ChainDetailsMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAA0D,MAAM,OAAO,CAAC;AAI/E,OAAO,EACL,aAAa,EAGd,MAAM,oBAAoB,CAAC;AA8B5B,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,aAAa,CAAC;IAC7B,qBAAqB,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/C,wBAAwB,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;IACvE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,qBAoB5D"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { stringify as yamlStringify } from 'yaml';
|
|
4
|
+
import { DEFAULT_GITHUB_REGISTRY } from '@hyperlane-xyz/registry';
|
|
5
|
+
import { isValidChainMetadata, mergeChainMetadata, } from '@hyperlane-xyz/sdk';
|
|
6
|
+
import { failure, isNullish, isUrl, objMerge, objOmit, success, tryParseJsonOrYaml, } from '@hyperlane-xyz/utils';
|
|
7
|
+
import { ColorPalette } from '../color.js';
|
|
8
|
+
import { CopyButton } from '../components/CopyButton.js';
|
|
9
|
+
import { IconButton } from '../components/IconButton.js';
|
|
10
|
+
import { LinkButton } from '../components/LinkButton.js';
|
|
11
|
+
import { TextInput } from '../components/TextInput.js';
|
|
12
|
+
import { Tooltip } from '../components/Tooltip.js';
|
|
13
|
+
import { BoxArrowIcon } from '../icons/BoxArrow.js';
|
|
14
|
+
import { CheckmarkIcon } from '../icons/Checkmark.js';
|
|
15
|
+
import { ChevronIcon } from '../icons/Chevron.js';
|
|
16
|
+
import { Circle } from '../icons/Circle.js';
|
|
17
|
+
import { PlusCircleIcon } from '../icons/PlusCircle.js';
|
|
18
|
+
import { Spinner } from '../icons/Spinner.js';
|
|
19
|
+
import { XIcon } from '../icons/X.js';
|
|
20
|
+
import { useConnectionHealthTest } from '../utils/useChainConnectionTest.js';
|
|
21
|
+
import { ChainLogo } from './ChainLogo.js';
|
|
22
|
+
import { ChainConnectionType } from './types.js';
|
|
23
|
+
export function ChainDetailsMenu(props) {
|
|
24
|
+
const mergedMetadata = useMemo(() => mergeChainMetadata(props.chainMetadata || {}, props.overrideChainMetadata || {}), [props]);
|
|
25
|
+
return (React.createElement("div", { className: "htw-space-y-4" },
|
|
26
|
+
React.createElement(ChainHeader, { ...props, chainMetadata: mergedMetadata }),
|
|
27
|
+
React.createElement(ButtonRow, { ...props, chainMetadata: mergedMetadata }),
|
|
28
|
+
React.createElement(ChainRpcs, { ...props, chainMetadata: mergedMetadata }),
|
|
29
|
+
React.createElement(ChainExplorers, { ...props, chainMetadata: mergedMetadata }),
|
|
30
|
+
React.createElement(ChainInfo, { ...props, chainMetadata: mergedMetadata }),
|
|
31
|
+
React.createElement(MetadataOverride, { ...props, chainMetadata: mergedMetadata })));
|
|
32
|
+
}
|
|
33
|
+
function ChainHeader({ chainMetadata, onClickBack, }) {
|
|
34
|
+
return (React.createElement("div", null,
|
|
35
|
+
!!onClickBack && (React.createElement(LinkButton, { onClick: onClickBack, className: "htw-py-1 htw-mb-1.5" },
|
|
36
|
+
React.createElement("div", { className: "htw-flex htw-items-center htw-gap-1.5" },
|
|
37
|
+
React.createElement(ChevronIcon, { width: 12, height: 12, direction: "w", className: "htw-opacity-70" }),
|
|
38
|
+
React.createElement("span", { className: "htw-text-xs htw-text-gray-600" }, "Back")))),
|
|
39
|
+
React.createElement("div", { className: "htw-flex htw-items-center htw-gap-3" },
|
|
40
|
+
React.createElement(ChainLogo, { chainName: chainMetadata.name, logoUri: chainMetadata.logoURI, size: 30 }),
|
|
41
|
+
React.createElement("h2", { className: "htw-text-lg htw-font-medium" }, `${chainMetadata.displayName} Metadata`))));
|
|
42
|
+
}
|
|
43
|
+
function ButtonRow({ chainMetadata, onRemoveChain }) {
|
|
44
|
+
const { name } = chainMetadata;
|
|
45
|
+
const copyValue = useMemo(() => yamlStringify(chainMetadata), [chainMetadata]);
|
|
46
|
+
return (React.createElement("div", { className: "htw-pl-0.5 htw-flex htw-items-center htw-gap-10" },
|
|
47
|
+
React.createElement("div", { className: "htw-flex htw-items-center htw-gap-1.5" },
|
|
48
|
+
React.createElement(BoxArrowIcon, { width: 13, height: 13 }),
|
|
49
|
+
React.createElement("a", {
|
|
50
|
+
// TODO support alternative registries here
|
|
51
|
+
href: `${DEFAULT_GITHUB_REGISTRY}/tree/main/chains/${name}`, target: "_blank", rel: "noopener noreferrer", className: "htw-text-sm hover:htw-underline htw-underline-offset-2 active:htw-opacity-70 htw-transition-all" }, "View in registry")),
|
|
52
|
+
React.createElement("div", { className: "htw-flex htw-items-center htw-gap-1" },
|
|
53
|
+
React.createElement(CopyButton, { width: 12, height: 12, copyValue: copyValue, className: "htw-text-sm hover:htw-underline htw-underline-offset-2 active:htw-opacity-70" }, "Copy Metadata")),
|
|
54
|
+
onRemoveChain && (React.createElement(LinkButton, { onClick: onRemoveChain, className: "htw-text-sm htw-text-red-500 htw-gap-1.5" },
|
|
55
|
+
React.createElement(XIcon, { width: 10, height: 10, color: ColorPalette.Red }),
|
|
56
|
+
React.createElement("span", null, "Delete Chain")))));
|
|
57
|
+
}
|
|
58
|
+
function ChainRpcs(props) {
|
|
59
|
+
return (React.createElement(ConnectionsSection, { ...props, header: "Connections", type: ChainConnectionType.RPC, tooltip: "Hyperlane tools require chain metadata<br/>with at least one healthy RPC connection." }));
|
|
60
|
+
}
|
|
61
|
+
function ChainExplorers(props) {
|
|
62
|
+
return (React.createElement(ConnectionsSection, { ...props, header: "Block Explorers", type: ChainConnectionType.Explorer, tooltip: "Explorers are used to provide transaction links and to query data." }));
|
|
63
|
+
}
|
|
64
|
+
function ConnectionsSection({ chainMetadata, overrideChainMetadata, onChangeOverrideMetadata, header, type, tooltip, }) {
|
|
65
|
+
const values = getConnectionValues(chainMetadata, type);
|
|
66
|
+
return (React.createElement("div", { className: "htw-space-y-1.5" },
|
|
67
|
+
React.createElement(SectionHeader, { tooltip: tooltip }, header),
|
|
68
|
+
values.map((_, i) => (React.createElement(ConnectionRow, { key: i, chainMetadata: chainMetadata, overrideChainMetadata: overrideChainMetadata, onChangeOverrideMetadata: onChangeOverrideMetadata, index: i, type: type }))),
|
|
69
|
+
React.createElement(AddConnectionButton, { chainMetadata: chainMetadata, overrideChainMetadata: overrideChainMetadata, onChangeOverrideMetadata: onChangeOverrideMetadata, type: type })));
|
|
70
|
+
}
|
|
71
|
+
function AddConnectionButton({ chainMetadata, overrideChainMetadata, onChangeOverrideMetadata, type, }) {
|
|
72
|
+
const [isAdding, setIsAdding] = useState(false);
|
|
73
|
+
const [isInvalid, setIsInvalid] = useState(false);
|
|
74
|
+
const [url, setUrl] = useState('');
|
|
75
|
+
const onClickDismiss = () => {
|
|
76
|
+
setIsAdding(false);
|
|
77
|
+
setIsInvalid(false);
|
|
78
|
+
setUrl('');
|
|
79
|
+
};
|
|
80
|
+
const onClickAdd = (e) => {
|
|
81
|
+
e?.preventDefault();
|
|
82
|
+
const currentValues = getConnectionValues(chainMetadata, type);
|
|
83
|
+
const newValue = url?.trim();
|
|
84
|
+
if (!newValue || !isUrl(newValue) || currentValues.includes(newValue)) {
|
|
85
|
+
setIsInvalid(true);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
let newOverrides = {};
|
|
89
|
+
if (type === ChainConnectionType.RPC) {
|
|
90
|
+
newOverrides = {
|
|
91
|
+
rpcUrls: [{ http: newValue }],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
else if (type === ChainConnectionType.Explorer) {
|
|
95
|
+
const hostName = new URL(newValue).hostname;
|
|
96
|
+
newOverrides = {
|
|
97
|
+
blockExplorers: [{ url: newValue, apiUrl: newValue, name: hostName }],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
onChangeOverrideMetadata(objMerge(overrideChainMetadata || {}, newOverrides, 10, true));
|
|
101
|
+
onClickDismiss();
|
|
102
|
+
};
|
|
103
|
+
if (!isAdding) {
|
|
104
|
+
return (React.createElement(LinkButton, { className: "htw-gap-3", onClick: () => setIsAdding(true) },
|
|
105
|
+
React.createElement(PlusCircleIcon, { width: 15, height: 15, color: ColorPalette.LightGray }),
|
|
106
|
+
React.createElement("div", { className: "htw-text-sm" }, `Add new ${type}`)));
|
|
107
|
+
}
|
|
108
|
+
return (React.createElement("form", { className: "htw-flex htw-items-center htw-gap-2", onSubmit: (e) => onClickAdd(e) },
|
|
109
|
+
React.createElement(PlusCircleIcon, { width: 15, height: 15, color: ColorPalette.LightGray }),
|
|
110
|
+
React.createElement("div", { className: "htw-flex htw-items-stretch htw-gap-1" },
|
|
111
|
+
React.createElement(TextInput, { className: `htw-w-64 htw-text-sm htw-px-1 htw-rounded-sm ${isInvalid && 'htw-text-red-500'}`, placeholder: `Enter ${type} URL`, value: url, onChange: setUrl }),
|
|
112
|
+
React.createElement(IconButton, { onClick: () => onClickAdd(), className: "htw-bg-gray-600 htw-rounded-sm htw-px-1" },
|
|
113
|
+
React.createElement(CheckmarkIcon, { width: 20, height: 20, color: ColorPalette.White })),
|
|
114
|
+
React.createElement(IconButton, { onClick: onClickDismiss, className: "htw-bg-gray-600 htw-rounded-sm htw-px-1" },
|
|
115
|
+
React.createElement(XIcon, { width: 9, height: 9, color: ColorPalette.White })))));
|
|
116
|
+
}
|
|
117
|
+
function ChainInfo({ chainMetadata }) {
|
|
118
|
+
const { chainId, domainId, deployer, isTestnet } = chainMetadata;
|
|
119
|
+
return (React.createElement("div", { className: "htw-space-y-1.5" },
|
|
120
|
+
React.createElement(SectionHeader, null, "Chain Information"),
|
|
121
|
+
React.createElement("div", { className: "htw-grid htw-grid-cols-2 htw-gap-1.5" },
|
|
122
|
+
React.createElement("div", null,
|
|
123
|
+
React.createElement(SectionHeader, { className: "htw-text-xs" }, "Chain Id"),
|
|
124
|
+
React.createElement("span", { className: "htw-text-sm" }, chainId)),
|
|
125
|
+
React.createElement("div", null,
|
|
126
|
+
React.createElement(SectionHeader, { className: "htw-text-xs" }, "Domain Id"),
|
|
127
|
+
React.createElement("span", { className: "htw-text-sm" }, domainId)),
|
|
128
|
+
React.createElement("div", null,
|
|
129
|
+
React.createElement(SectionHeader, { className: "htw-text-xs" }, "Contract Deployer"),
|
|
130
|
+
React.createElement("a", { href: deployer?.url, target: "_blank", rel: "noopener noreferrer", className: "htw-text-sm hover:htw-underline htw-underline-offset-2" }, deployer?.name || 'Unknown')),
|
|
131
|
+
React.createElement("div", null,
|
|
132
|
+
React.createElement(SectionHeader, { className: "htw-text-xs" }, "Chain Type"),
|
|
133
|
+
React.createElement("span", { className: "htw-text-sm" }, isTestnet ? 'Testnet' : 'Mainnet')))));
|
|
134
|
+
}
|
|
135
|
+
function MetadataOverride({ chainMetadata, overrideChainMetadata, onChangeOverrideMetadata, }) {
|
|
136
|
+
const stringified = overrideChainMetadata
|
|
137
|
+
? yamlStringify(overrideChainMetadata)
|
|
138
|
+
: '';
|
|
139
|
+
const [overrideInput, setOverrideInput] = useState(stringified);
|
|
140
|
+
const showButton = overrideInput !== stringified;
|
|
141
|
+
const [isInvalid, setIsInvalid] = useState(false);
|
|
142
|
+
// Keep input in sync with external changes
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
setOverrideInput(stringified);
|
|
145
|
+
}, [stringified]);
|
|
146
|
+
const onChangeInput = (e) => {
|
|
147
|
+
setOverrideInput(e.target.value);
|
|
148
|
+
setIsInvalid(false);
|
|
149
|
+
};
|
|
150
|
+
const onClickSetOverride = () => {
|
|
151
|
+
const trimmed = overrideInput?.trim();
|
|
152
|
+
if (!trimmed) {
|
|
153
|
+
onChangeOverrideMetadata(undefined);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const result = tryParseInput(trimmed, chainMetadata);
|
|
157
|
+
if (result.success) {
|
|
158
|
+
onChangeOverrideMetadata(result.data);
|
|
159
|
+
setOverrideInput(trimmed);
|
|
160
|
+
setIsInvalid(false);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
setIsInvalid(true);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
return (React.createElement("div", { className: "htw-space-y-1.5" },
|
|
167
|
+
React.createElement(SectionHeader, { tooltip: "You can set data here to locally override the metadata from the registry." }, "Metadata Overrides"),
|
|
168
|
+
React.createElement("div", { className: "htw-relative" },
|
|
169
|
+
React.createElement("textarea", { className: clsx('htw-text-xs htw-resize htw-border htw-border-gray-200 focus:htw-border-gray-400 htw-rounded-sm htw-p-1.5 htw-w-full htw-h-12 htw-outline-none', isInvalid && 'htw-border-red-500'), placeholder: `blocks:\n confirmations: 10`, value: overrideInput, onChange: onChangeInput }),
|
|
170
|
+
React.createElement(IconButton, { onClick: onClickSetOverride, className: clsx('htw-right-3.5 htw-top-2 htw-bg-gray-600 htw-rounded-sm htw-px-1', showButton ? 'htw-absolute' : 'htw-hidden') },
|
|
171
|
+
React.createElement(CheckmarkIcon, { width: 20, height: 20, color: ColorPalette.White })))));
|
|
172
|
+
}
|
|
173
|
+
function SectionHeader({ children, className, tooltip, }) {
|
|
174
|
+
return (React.createElement("div", { className: "htw-flex htw-items-center htw-gap-3" },
|
|
175
|
+
React.createElement("h3", { className: `htw-text-sm htw-text-gray-500 ${className}` }, children),
|
|
176
|
+
tooltip && React.createElement(Tooltip, { id: "metadata-help", content: tooltip })));
|
|
177
|
+
}
|
|
178
|
+
function ConnectionRow({ chainMetadata, overrideChainMetadata = {}, onChangeOverrideMetadata, index, type, }) {
|
|
179
|
+
const isHealthy = useConnectionHealthTest(chainMetadata, index, type);
|
|
180
|
+
const value = getConnectionValues(chainMetadata, type)[index];
|
|
181
|
+
const isRemovable = isOverrideConnection(overrideChainMetadata, type, value);
|
|
182
|
+
const onClickRemove = () => {
|
|
183
|
+
let toOmit = {};
|
|
184
|
+
if (type === ChainConnectionType.RPC) {
|
|
185
|
+
toOmit = {
|
|
186
|
+
rpcUrls: [
|
|
187
|
+
overrideChainMetadata.rpcUrls.find((r) => r.http === value),
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
else if (type === ChainConnectionType.Explorer) {
|
|
192
|
+
toOmit = {
|
|
193
|
+
blockExplorers: [
|
|
194
|
+
overrideChainMetadata.blockExplorers.find((r) => r.url === value),
|
|
195
|
+
],
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
onChangeOverrideMetadata(objOmit(overrideChainMetadata, toOmit, 10, true));
|
|
199
|
+
};
|
|
200
|
+
return (React.createElement("div", { className: "htw-flex htw-items-center htw-gap-3" },
|
|
201
|
+
isNullish(isHealthy) && type == ChainConnectionType.RPC && (React.createElement(Spinner, { width: 14, height: 14 })),
|
|
202
|
+
isNullish(isHealthy) && type == ChainConnectionType.Explorer && (React.createElement(Circle, { size: 14, className: "htw-bg-gray-400" })),
|
|
203
|
+
!isNullish(isHealthy) && (React.createElement(Circle, { size: 14, className: isHealthy ? 'htw-bg-green-500' : 'htw-bg-red-500' })),
|
|
204
|
+
React.createElement("div", { className: "htw-text-sm htw-truncate" }, value),
|
|
205
|
+
isRemovable && (React.createElement(IconButton, { className: "htw-bg-gray-600 htw-rounded-sm htw-p-1 htw-mt-0.5", onClick: onClickRemove },
|
|
206
|
+
React.createElement(XIcon, { width: 8, height: 8, color: ColorPalette.White })))));
|
|
207
|
+
}
|
|
208
|
+
function getConnectionValues(chainMetadata, type) {
|
|
209
|
+
return ((type === ChainConnectionType.RPC
|
|
210
|
+
? chainMetadata.rpcUrls?.map((r) => r.http)
|
|
211
|
+
: chainMetadata.blockExplorers?.map((b) => b.url)) || []);
|
|
212
|
+
}
|
|
213
|
+
function isOverrideConnection(overrides, type, value) {
|
|
214
|
+
return getConnectionValues(overrides || {}, type).includes(value);
|
|
215
|
+
}
|
|
216
|
+
function tryParseInput(input, existingChainMetadata) {
|
|
217
|
+
const parsed = tryParseJsonOrYaml(input);
|
|
218
|
+
if (!parsed.success)
|
|
219
|
+
return parsed;
|
|
220
|
+
const merged = mergeChainMetadata(existingChainMetadata, parsed.data);
|
|
221
|
+
const isValid = isValidChainMetadata(merged);
|
|
222
|
+
return isValid ? success(parsed.data) : failure('Invalid metadata overrides');
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=ChainDetailsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainDetailsMenu.js","sourceRoot":"","sources":["../../src/chains/ChainDetailsMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,EAAqB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAEL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUjD,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CACH,kBAAkB,CAChB,KAAK,CAAC,aAAa,IAAI,EAAE,EACzB,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAClC,EACH,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,eAAe;QAC5B,oBAAC,WAAW,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI;QACzD,oBAAC,SAAS,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI;QACvD,oBAAC,SAAS,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI;QACvD,oBAAC,cAAc,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI;QAC5D,oBAAC,SAAS,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI;QACvD,oBAAC,gBAAgB,OAAK,KAAK,EAAE,aAAa,EAAE,cAAc,GAAI,CAC1D,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EACnB,aAAa,EACb,WAAW,GACkD;IAC7D,OAAO,CACL;QACG,CAAC,CAAC,WAAW,IAAI,CAChB,oBAAC,UAAU,IAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,qBAAqB;YAC/D,6BAAK,SAAS,EAAC,uCAAuC;gBACpD,oBAAC,WAAW,IACV,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,SAAS,EAAC,GAAG,EACb,SAAS,EAAC,gBAAgB,GAC1B;gBACF,8BAAM,SAAS,EAAC,+BAA+B,WAAY,CACvD,CACK,CACd;QACD,6BAAK,SAAS,EAAC,qCAAqC;YAClD,oBAAC,SAAS,IACR,SAAS,EAAE,aAAa,CAAC,IAAI,EAC7B,OAAO,EAAE,aAAa,CAAC,OAAO,EAC9B,IAAI,EAAE,EAAE,GACR;YACF,4BAAI,SAAS,EAAC,6BAA6B,IAAE,GAAG,aAAa,CAAC,WAAW,WAAW,CAAM,CACtF,CACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,aAAa,EAAE,aAAa,EAAyB;IACxE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;IAE/B,MAAM,SAAS,GAAG,OAAO,CACvB,GAAG,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,EAClC,CAAC,aAAa,CAAC,CAChB,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,iDAAiD;QAC9D,6BAAK,SAAS,EAAC,uCAAuC;YACpD,oBAAC,YAAY,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI;YACvC;gBACE,2CAA2C;gBAC3C,IAAI,EAAE,GAAG,uBAAuB,qBAAqB,IAAI,EAAE,EAC3D,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,iGAAiG,uBAGzG,CACA;QACN,6BAAK,SAAS,EAAC,qCAAqC;YAClD,oBAAC,UAAU,IACT,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,EACV,SAAS,EAAE,SAAS,EACpB,SAAS,EAAC,8EAA8E,oBAG7E,CACT;QACL,aAAa,IAAI,CAChB,oBAAC,UAAU,IACT,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,0CAA0C;YAEpD,oBAAC,KAAK,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,GAAI;YACzD,iDAAyB,CACd,CACd,CACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAA4B;IAC7C,OAAO,CACL,oBAAC,kBAAkB,OACb,KAAK,EACT,MAAM,EAAC,aAAa,EACpB,IAAI,EAAE,mBAAmB,CAAC,GAAG,EAC7B,OAAO,EAAC,sFAAsF,GAC9F,CACH,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAA4B;IAClD,OAAO,CACL,oBAAC,kBAAkB,OACb,KAAK,EACT,MAAM,EAAC,iBAAiB,EACxB,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAClC,OAAO,EAAC,oEAAoE,GAC5E,CACH,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,MAAM,EACN,IAAI,EACJ,OAAO,GAKR;IACC,MAAM,MAAM,GAAG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAExD,OAAO,CACL,6BAAK,SAAS,EAAC,iBAAiB;QAC9B,oBAAC,aAAa,IAAC,OAAO,EAAE,OAAO,IAAG,MAAM,CAAiB;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,oBAAC,aAAa,IACZ,GAAG,EAAE,CAAC,EACN,aAAa,EAAE,aAAa,EAC5B,qBAAqB,EAAE,qBAAqB,EAC5C,wBAAwB,EAAE,wBAAwB,EAClD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,IAAI,GACV,CACH,CAAC;QACF,oBAAC,mBAAmB,IAClB,aAAa,EAAE,aAAa,EAC5B,qBAAqB,EAAE,qBAAqB,EAC5C,wBAAwB,EAAE,wBAAwB,EAClD,IAAI,EAAE,IAAI,GACV,CACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,EAC3B,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,IAAI,GAGL;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEnC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,WAAW,CAAC,KAAK,CAAC,CAAC;QACnB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,CAAoC,EAAE,EAAE;QAC1D,CAAC,EAAE,cAAc,EAAE,CAAC;QAEpB,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,YAAY,GAA2B,EAAE,CAAC;QAC9C,IAAI,IAAI,KAAK,mBAAmB,CAAC,GAAG,EAAE,CAAC;YACrC,YAAY,GAAG;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aAC9B,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;YAC5C,YAAY,GAAG;gBACb,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;aACtE,CAAC;QACJ,CAAC;QACD,wBAAwB,CACtB,QAAQ,CACN,qBAAqB,IAAI,EAAE,EAC3B,YAAY,EACZ,EAAE,EACF,IAAI,CACL,CACF,CAAC;QACF,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CACL,oBAAC,UAAU,IAAC,SAAS,EAAC,WAAW,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;YAChE,oBAAC,cAAc,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,GAAI;YACxE,6BAAK,SAAS,EAAC,aAAa,IAAE,WAAW,IAAI,EAAE,CAAO,CAC3C,CACd,CAAC;IACJ,CAAC;IAED,OAAO,CACL,8BACE,SAAS,EAAC,qCAAqC,EAC/C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAE9B,oBAAC,cAAc,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,GAAI;QACxE,6BAAK,SAAS,EAAC,sCAAsC;YACnD,oBAAC,SAAS,IACR,SAAS,EAAE,gDACT,SAAS,IAAI,kBACf,EAAE,EACF,WAAW,EAAE,SAAS,IAAI,MAAM,EAChC,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,MAAM,GAChB;YACF,oBAAC,UAAU,IACT,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAC3B,SAAS,EAAC,yCAAyC;gBAEnD,oBAAC,aAAa,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,CACxD;YACb,oBAAC,UAAU,IACT,OAAO,EAAE,cAAc,EACvB,SAAS,EAAC,yCAAyC;gBAEnD,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,CAC9C,CACT,CACD,CACR,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,aAAa,EAAoC;IACpE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;IAEjE,OAAO,CACL,6BAAK,SAAS,EAAC,iBAAiB;QAC9B,oBAAC,aAAa,4BAAkC;QAChD,6BAAK,SAAS,EAAC,sCAAsC;YACnD;gBACE,oBAAC,aAAa,IAAC,SAAS,EAAC,aAAa,eAAyB;gBAC/D,8BAAM,SAAS,EAAC,aAAa,IAAE,OAAO,CAAQ,CAC1C;YACN;gBACE,oBAAC,aAAa,IAAC,SAAS,EAAC,aAAa,gBAA0B;gBAChE,8BAAM,SAAS,EAAC,aAAa,IAAE,QAAQ,CAAQ,CAC3C;YACN;gBACE,oBAAC,aAAa,IAAC,SAAS,EAAC,aAAa,wBAEtB;gBAChB,2BACE,IAAI,EAAE,QAAQ,EAAE,GAAG,EACnB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,wDAAwD,IAEjE,QAAQ,EAAE,IAAI,IAAI,SAAS,CAC1B,CACA;YACN;gBACE,oBAAC,aAAa,IAAC,SAAS,EAAC,aAAa,iBAA2B;gBACjE,8BAAM,SAAS,EAAC,aAAa,IAC1B,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAC7B,CACH,CACF,CACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,GACF;IACtB,MAAM,WAAW,GAAG,qBAAqB;QACvC,CAAC,CAAC,aAAa,CAAC,qBAAqB,CAAC;QACtC,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,aAAa,KAAK,WAAW,CAAC;IACjD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,2CAA2C;IAC3C,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,MAAM,aAAa,GAAG,CAAC,CAAyC,EAAE,EAAE;QAClE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,MAAM,OAAO,GAAG,aAAa,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,wBAAwB,CAAC,SAAS,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACtC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,iBAAiB;QAC9B,oBAAC,aAAa,IAAC,OAAO,EAAC,2EAA2E,yBAElF;QAChB,6BAAK,SAAS,EAAC,cAAc;YAC3B,kCACE,SAAS,EAAE,IAAI,CACb,+IAA+I,EAC/I,SAAS,IAAI,oBAAoB,CAClC,EACD,WAAW,EAAE,8BAA8B,EAC3C,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,aAAa,GACb;YACZ,oBAAC,UAAU,IACT,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,IAAI,CACb,iEAAiE,EACjE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAC3C;gBAED,oBAAC,aAAa,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,CACxD,CACT,CACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,OAAO,GACqD;IAC5D,OAAO,CACL,6BAAK,SAAS,EAAC,qCAAqC;QAClD,4BAAI,SAAS,EAAE,iCAAiC,SAAS,EAAE,IACxD,QAAQ,CACN;QACJ,OAAO,IAAI,oBAAC,OAAO,IAAC,EAAE,EAAC,eAAe,EAAC,OAAO,EAAE,OAAO,GAAI,CACxD,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,aAAa,EACb,qBAAqB,GAAG,EAAE,EAC1B,wBAAwB,EACxB,KAAK,EACL,IAAI,GAIL;IACC,MAAM,SAAS,GAAG,uBAAuB,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAE7E,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,MAAM,GAA2B,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,mBAAmB,CAAC,GAAG,EAAE,CAAC;YACrC,MAAM,GAAG;gBACP,OAAO,EAAE;oBACP,qBAAqB,CAAC,OAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAE;iBAC9D;aACF,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,mBAAmB,CAAC,QAAQ,EAAE,CAAC;YACjD,MAAM,GAAG;gBACP,cAAc,EAAE;oBACd,qBAAqB,CAAC,cAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAE;iBACpE;aACF,CAAC;QACJ,CAAC;QACD,wBAAwB,CACtB,OAAO,CAAyB,qBAAqB,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CACzE,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAC,qCAAqC;QACjD,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,mBAAmB,CAAC,GAAG,IAAI,CAC1D,oBAAC,OAAO,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,CACnC;QACA,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,IAAI,mBAAmB,CAAC,QAAQ,IAAI,CAC/D,oBAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,iBAAiB,GAAG,CACjD;QACA,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CACxB,oBAAC,MAAM,IACL,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,GAC5D,CACH;QACD,6BAAK,SAAS,EAAC,0BAA0B,IAAE,KAAK,CAAO;QACtD,WAAW,IAAI,CACd,oBAAC,UAAU,IACT,SAAS,EAAC,mDAAmD,EAC7D,OAAO,EAAE,aAAa;YAEtB,oBAAC,KAAK,IAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,GAAI,CAC9C,CACd,CACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,aAAqC,EACrC,IAAyB;IAEzB,OAAO,CACL,CAAC,IAAI,KAAK,mBAAmB,CAAC,GAAG;QAC/B,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,aAAa,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAC3D,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,SAA6C,EAC7C,IAAyB,EACzB,KAAa;IAEb,OAAO,mBAAmB,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,aAAa,CACpB,KAAa,EACb,qBAAoC;IAEpC,MAAM,MAAM,GAAG,kBAAkB,CAAyB,KAAK,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,MAAM,GAAG,kBAAkB,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -7,11 +7,12 @@ type SvgIcon = (props: {
|
|
|
7
7
|
}) => ReactElement;
|
|
8
8
|
export interface ChainLogoProps {
|
|
9
9
|
chainName: string;
|
|
10
|
-
|
|
10
|
+
logoUri?: string;
|
|
11
|
+
registry?: IRegistry;
|
|
11
12
|
size?: number;
|
|
12
13
|
background?: boolean;
|
|
13
14
|
Icon?: SvgIcon;
|
|
14
15
|
}
|
|
15
|
-
export declare function ChainLogo({ chainName, registry, size, background, Icon, }: ChainLogoProps): React.JSX.Element;
|
|
16
|
+
export declare function ChainLogo({ chainName, logoUri, registry, size, background, Icon, }: ChainLogoProps): React.JSX.Element;
|
|
16
17
|
export {};
|
|
17
18
|
//# sourceMappingURL=ChainLogo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainLogo.d.ts","sourceRoot":"","sources":["../../src/chains/ChainLogo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAuB,MAAM,OAAO,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAK,YAAY,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EACxB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,IAAS,EACT,UAAkB,EAClB,IAAI,GACL,EAAE,cAAc,qBA8ChB"}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import React, { useEffect, useState } from 'react';
|
|
2
|
-
import { Circle } from '
|
|
3
|
-
import { QuestionMarkIcon } from '
|
|
4
|
-
export function ChainLogo({ chainName, registry, size = 32, background = false, Icon, }) {
|
|
2
|
+
import { Circle } from '../icons/Circle.js';
|
|
3
|
+
import { QuestionMarkIcon } from '../icons/QuestionMark.js';
|
|
4
|
+
export function ChainLogo({ chainName, logoUri, registry, size = 32, background = false, Icon, }) {
|
|
5
5
|
const title = chainName || 'Unknown';
|
|
6
6
|
const bgColorSeed = title.charCodeAt(0);
|
|
7
7
|
const iconSize = Math.floor(size / 1.9);
|
|
8
8
|
const [svgLogos, setSvgLogos] = useState({});
|
|
9
|
-
const
|
|
9
|
+
const uri = logoUri || svgLogos[chainName];
|
|
10
10
|
useEffect(() => {
|
|
11
|
-
if (!chainName || svgLogos[chainName] || Icon)
|
|
11
|
+
if (!chainName || svgLogos[chainName] || logoUri || Icon || !registry)
|
|
12
12
|
return;
|
|
13
13
|
registry
|
|
14
14
|
.getChainLogoUri(chainName)
|
|
15
15
|
.then((uri) => uri && setSvgLogos({ ...svgLogos, [chainName]: uri }))
|
|
16
16
|
.catch((err) => console.error(err));
|
|
17
17
|
}, [chainName, registry, svgLogos, Icon]);
|
|
18
|
-
if (!
|
|
18
|
+
if (!uri && !Icon) {
|
|
19
19
|
return (React.createElement(Circle, { size: size, title: title, bgColorSeed: bgColorSeed }, chainName ? (React.createElement("div", { style: { fontSize: iconSize } }, chainName[0].toUpperCase())) : (React.createElement(QuestionMarkIcon, { width: iconSize, height: iconSize }))));
|
|
20
20
|
}
|
|
21
21
|
if (background) {
|
|
22
|
-
return (React.createElement(Circle, { size: size, title: title,
|
|
22
|
+
return (React.createElement(Circle, { size: size, title: title, className: "htw-bg-gray-100" }, Icon ? (React.createElement(Icon, { width: iconSize, height: iconSize, title: title })) : (React.createElement("img", { src: uri, alt: title, width: iconSize, height: iconSize }))));
|
|
23
23
|
}
|
|
24
24
|
else {
|
|
25
|
-
return Icon ? (React.createElement(Icon, { width: size, height: size, title: title })) : (React.createElement("img", { src:
|
|
25
|
+
return Icon ? (React.createElement(Icon, { width: size, height: size, title: title })) : (React.createElement("img", { src: uri, alt: title, width: size, height: size }));
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=ChainLogo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainLogo.js","sourceRoot":"","sources":["../../src/chains/ChainLogo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAgB,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIjE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiB5D,MAAM,UAAU,SAAS,CAAC,EACxB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,IAAI,GAAG,EAAE,EACT,UAAU,GAAG,KAAK,EAClB,IAAI,GACW;IACf,MAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC;IACrC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAExC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,OAAO,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,QAAQ;YACnE,OAAO;QACT,QAAQ;aACL,eAAe,CAAC,SAAS,CAAC;aAC1B,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aACpE,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1C,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CACL,oBAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,IACvD,SAAS,CAAC,CAAC,CAAC,CACX,6BAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAG,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAO,CACvE,CAAC,CAAC,CAAC,CACF,oBAAC,gBAAgB,IAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAI,CACxD,CACM,CACV,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CACL,oBAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,iBAAiB,IAC1D,IAAI,CAAC,CAAC,CAAC,CACN,oBAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAI,CAC1D,CAAC,CAAC,CAAC,CACF,6BAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAI,CACjE,CACM,CACV,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,CAAC,CAAC,CACZ,oBAAC,IAAI,IAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAI,CAClD,CAAC,CAAC,CAAC,CACF,6BAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAI,CACzD,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ChainMap, ChainMetadata, ChainName } from '@hyperlane-xyz/sdk';
|
|
3
|
+
interface CustomListItemField {
|
|
4
|
+
header: string;
|
|
5
|
+
data: ChainMap<{
|
|
6
|
+
display: string;
|
|
7
|
+
sortValue: number;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export interface ChainSearchMenuProps {
|
|
11
|
+
chainMetadata: ChainMap<ChainMetadata>;
|
|
12
|
+
overrideChainMetadata?: ChainMap<Partial<ChainMetadata> | undefined>;
|
|
13
|
+
onChangeOverrideMetadata: (overrides?: ChainMap<Partial<ChainMetadata> | undefined>) => void;
|
|
14
|
+
onClickChain: (chain: ChainMetadata) => void;
|
|
15
|
+
customListItemField?: CustomListItemField;
|
|
16
|
+
showChainDetails?: ChainName;
|
|
17
|
+
showAddChainMenu?: boolean;
|
|
18
|
+
showAddChainButton?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function ChainSearchMenu({ chainMetadata, onChangeOverrideMetadata, overrideChainMetadata, onClickChain, customListItemField, showChainDetails, showAddChainButton, showAddChainMenu, }: ChainSearchMenuProps): React.JSX.Element;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=ChainSearchMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChainSearchMenu.d.ts","sourceRoot":"","sources":["../../src/chains/ChainSearchMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAEpD,OAAO,EACL,QAAQ,EACR,aAAa,EACb,SAAS,EAEV,MAAM,oBAAoB,CAAC;AAmC5B,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IACvC,qBAAqB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC;IACrE,wBAAwB,EAAE,CACxB,SAAS,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,KACrD,IAAI,CAAC;IACV,YAAY,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAE7C,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAE1C,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,eAAe,CAAC,EAC9B,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,EAAE,oBAAoB,qBAwEtB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import React, { useCallback, useMemo } from 'react';
|
|
2
|
+
import { mergeChainMetadataMap, } from '@hyperlane-xyz/sdk';
|
|
3
|
+
import { ProtocolType } from '@hyperlane-xyz/utils';
|
|
4
|
+
import { SearchMenu, SortOrderOption, } from '../components/SearchMenu.js';
|
|
5
|
+
import { SegmentedControl } from '../components/SegmentedControl.js';
|
|
6
|
+
import { ChainAddMenu } from './ChainAddMenu.js';
|
|
7
|
+
import { ChainDetailsMenu } from './ChainDetailsMenu.js';
|
|
8
|
+
import { ChainLogo } from './ChainLogo.js';
|
|
9
|
+
var ChainSortByOption;
|
|
10
|
+
(function (ChainSortByOption) {
|
|
11
|
+
ChainSortByOption["Name"] = "name";
|
|
12
|
+
ChainSortByOption["ChainId"] = "chain id";
|
|
13
|
+
ChainSortByOption["Protocol"] = "protocol";
|
|
14
|
+
})(ChainSortByOption || (ChainSortByOption = {}));
|
|
15
|
+
var FilterTestnetOption;
|
|
16
|
+
(function (FilterTestnetOption) {
|
|
17
|
+
FilterTestnetOption["Testnet"] = "testnet";
|
|
18
|
+
FilterTestnetOption["Mainnet"] = "mainnet";
|
|
19
|
+
})(FilterTestnetOption || (FilterTestnetOption = {}));
|
|
20
|
+
const defaultFilterState = {
|
|
21
|
+
type: undefined,
|
|
22
|
+
protocol: undefined,
|
|
23
|
+
};
|
|
24
|
+
export function ChainSearchMenu({ chainMetadata, onChangeOverrideMetadata, overrideChainMetadata, onClickChain, customListItemField, showChainDetails, showAddChainButton, showAddChainMenu, }) {
|
|
25
|
+
const [drilldownChain, setDrilldownChain] = React.useState(showChainDetails);
|
|
26
|
+
const [addChain, setAddChain] = React.useState(showAddChainMenu || false);
|
|
27
|
+
const { listData, mergedMetadata } = useMemo(() => {
|
|
28
|
+
const mergedMetadata = mergeChainMetadataMap(chainMetadata, overrideChainMetadata);
|
|
29
|
+
return { mergedMetadata, listData: Object.values(mergedMetadata) };
|
|
30
|
+
}, [chainMetadata]);
|
|
31
|
+
const { ListComponent, searchFn, sortOptions, defaultSortState } = useCustomizedListItems(customListItemField);
|
|
32
|
+
if (drilldownChain && mergedMetadata[drilldownChain]) {
|
|
33
|
+
const isLocalOverrideChain = !chainMetadata[drilldownChain];
|
|
34
|
+
const onRemoveChain = () => {
|
|
35
|
+
const newOverrides = { ...overrideChainMetadata };
|
|
36
|
+
delete newOverrides[drilldownChain];
|
|
37
|
+
onChangeOverrideMetadata(newOverrides);
|
|
38
|
+
};
|
|
39
|
+
return (React.createElement(ChainDetailsMenu, { chainMetadata: chainMetadata[drilldownChain], overrideChainMetadata: overrideChainMetadata?.[drilldownChain], onChangeOverrideMetadata: (o) => onChangeOverrideMetadata({
|
|
40
|
+
...overrideChainMetadata,
|
|
41
|
+
[drilldownChain]: o,
|
|
42
|
+
}), onClickBack: () => setDrilldownChain(undefined), onRemoveChain: isLocalOverrideChain ? onRemoveChain : undefined }));
|
|
43
|
+
}
|
|
44
|
+
if (addChain) {
|
|
45
|
+
return (React.createElement(ChainAddMenu, { chainMetadata: chainMetadata, overrideChainMetadata: overrideChainMetadata, onChangeOverrideMetadata: onChangeOverrideMetadata, onClickBack: () => setAddChain(false) }));
|
|
46
|
+
}
|
|
47
|
+
return (React.createElement(SearchMenu, { data: listData, ListComponent: ListComponent, searchFn: searchFn, onClickItem: onClickChain, onClickEditItem: (chain) => setDrilldownChain(chain.name), sortOptions: sortOptions, defaultSortState: defaultSortState, FilterComponent: ChainFilters, defaultFilterState: defaultFilterState, placeholder: "Chain Name or ID", onClickAddItem: showAddChainButton ? () => setAddChain(true) : undefined }));
|
|
48
|
+
}
|
|
49
|
+
function ChainListItem({ data: chain, customField, }) {
|
|
50
|
+
return (React.createElement(React.Fragment, null,
|
|
51
|
+
React.createElement("div", { className: "htw-flex htw-items-center" },
|
|
52
|
+
React.createElement("div", { className: "htw-shrink-0" },
|
|
53
|
+
React.createElement(ChainLogo, { chainName: chain.name, logoUri: chain.logoURI, size: 32 })),
|
|
54
|
+
React.createElement("div", { className: "htw-ml-3 htw-text-left htw-overflow-hidden" },
|
|
55
|
+
React.createElement("div", { className: "htw-text-sm htw-font-medium truncate" }, chain.displayName),
|
|
56
|
+
React.createElement("div", { className: "htw-text-[0.7rem] htw-text-gray-500" }, chain.isTestnet ? 'Testnet' : 'Mainnet'))),
|
|
57
|
+
React.createElement("div", { className: "htw-text-left htw-overflow-hidden" },
|
|
58
|
+
React.createElement("div", { className: "htw-text-sm truncate" }, customField
|
|
59
|
+
? customField.data[chain.name].display || 'Unknown'
|
|
60
|
+
: chain.deployer?.name || 'Unknown deployer'),
|
|
61
|
+
React.createElement("div", { className: "htw-text-[0.7rem] htw-text-gray-500" }, customField ? customField.header : 'Deployer'))));
|
|
62
|
+
}
|
|
63
|
+
function ChainFilters({ value, onChange, }) {
|
|
64
|
+
return (React.createElement("div", { className: "htw-py-3 htw-px-2.5 htw-space-y-4" },
|
|
65
|
+
React.createElement("div", { className: "htw-flex htw-flex-col htw-items-start htw-gap-2" },
|
|
66
|
+
React.createElement("label", { className: "htw-text-sm htw-text-gray-600 htw-pl-px" }, "Type"),
|
|
67
|
+
React.createElement(SegmentedControl, { options: Object.values(FilterTestnetOption), onChange: (selected) => onChange({ ...value, type: selected }), allowEmpty: true })),
|
|
68
|
+
React.createElement("div", { className: "htw-flex htw-flex-col htw-items-start htw-gap-2" },
|
|
69
|
+
React.createElement("label", { className: "htw-text-sm htw-text-gray-600 htw-pl-px" }, "Protocol"),
|
|
70
|
+
React.createElement(SegmentedControl, { options: Object.values(ProtocolType), onChange: (selected) => onChange({ ...value, protocol: selected }), allowEmpty: true }))));
|
|
71
|
+
}
|
|
72
|
+
function chainSearch({ data, query, sort, filter, customListItemField, }) {
|
|
73
|
+
const queryFormatted = query.trim().toLowerCase();
|
|
74
|
+
return (data
|
|
75
|
+
// Query search
|
|
76
|
+
.filter((chain) => chain.name.includes(queryFormatted) ||
|
|
77
|
+
chain.displayName?.toLowerCase().includes(queryFormatted) ||
|
|
78
|
+
chain.chainId.toString().includes(queryFormatted) ||
|
|
79
|
+
chain.domainId?.toString().includes(queryFormatted))
|
|
80
|
+
// Filter options
|
|
81
|
+
.filter((chain) => {
|
|
82
|
+
let included = true;
|
|
83
|
+
if (filter.type) {
|
|
84
|
+
included &&=
|
|
85
|
+
!!chain.isTestnet === (filter.type === FilterTestnetOption.Testnet);
|
|
86
|
+
}
|
|
87
|
+
if (filter.protocol) {
|
|
88
|
+
included &&= chain.protocol === filter.protocol;
|
|
89
|
+
}
|
|
90
|
+
return included;
|
|
91
|
+
})
|
|
92
|
+
// Sort options
|
|
93
|
+
.sort((c1, c2) => {
|
|
94
|
+
// Special case handling for if the chains are being sorted by the
|
|
95
|
+
// custom field provided to ChainSearchMenu
|
|
96
|
+
if (customListItemField && sort.sortBy === customListItemField.header) {
|
|
97
|
+
const result = customListItemField.data[c1.name].sortValue -
|
|
98
|
+
customListItemField.data[c2.name].sortValue;
|
|
99
|
+
return sort.sortOrder === SortOrderOption.Asc ? result : -result;
|
|
100
|
+
}
|
|
101
|
+
// Otherwise sort by the default options
|
|
102
|
+
let sortValue1 = c1.name;
|
|
103
|
+
let sortValue2 = c2.name;
|
|
104
|
+
if (sort.sortBy === ChainSortByOption.ChainId) {
|
|
105
|
+
sortValue1 = c1.chainId.toString();
|
|
106
|
+
sortValue2 = c2.chainId.toString();
|
|
107
|
+
}
|
|
108
|
+
else if (sort.sortBy === ChainSortByOption.Protocol) {
|
|
109
|
+
sortValue1 = c1.protocol;
|
|
110
|
+
sortValue2 = c2.protocol;
|
|
111
|
+
}
|
|
112
|
+
return sort.sortOrder === SortOrderOption.Asc
|
|
113
|
+
? sortValue1.localeCompare(sortValue2)
|
|
114
|
+
: sortValue2.localeCompare(sortValue1);
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* This hook creates closures around the provided customListItemField data
|
|
119
|
+
* This is useful because SearchMenu will do handle the list item rendering and
|
|
120
|
+
* management but the custom data is more or a chain-search-specific concern
|
|
121
|
+
*/
|
|
122
|
+
function useCustomizedListItems(customListItemField) {
|
|
123
|
+
// Create closure of ChainListItem but with customField pre-bound
|
|
124
|
+
const ListComponent = useCallback(({ data }) => (React.createElement(ChainListItem, { data: data, customField: customListItemField })), [ChainListItem, customListItemField]);
|
|
125
|
+
// Bind the custom field to the search function
|
|
126
|
+
const searchFn = useCallback((args) => chainSearch({ ...args, customListItemField }), [customListItemField]);
|
|
127
|
+
// Merge the custom field into the sort options if a custom field exists
|
|
128
|
+
const sortOptions = useMemo(() => [
|
|
129
|
+
...(customListItemField ? [customListItemField.header] : []),
|
|
130
|
+
...Object.values(ChainSortByOption),
|
|
131
|
+
], [customListItemField]);
|
|
132
|
+
// Sort by the custom field by default, if one is provided
|
|
133
|
+
const defaultSortState = useMemo(() => customListItemField
|
|
134
|
+
? {
|
|
135
|
+
sortBy: customListItemField.header,
|
|
136
|
+
sortOrder: SortOrderOption.Desc,
|
|
137
|
+
}
|
|
138
|
+
: undefined, [customListItemField]);
|
|
139
|
+
return { ListComponent, searchFn, sortOptions, defaultSortState };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=ChainSearchMenu.js.map
|