@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.
Files changed (189) hide show
  1. package/dist/chains/ChainAddMenu.d.ts +10 -0
  2. package/dist/chains/ChainAddMenu.d.ts.map +1 -0
  3. package/dist/chains/ChainAddMenu.js +102 -0
  4. package/dist/chains/ChainAddMenu.js.map +1 -0
  5. package/dist/chains/ChainDetailsMenu.d.ts +11 -0
  6. package/dist/chains/ChainDetailsMenu.d.ts.map +1 -0
  7. package/dist/chains/ChainDetailsMenu.js +224 -0
  8. package/dist/chains/ChainDetailsMenu.js.map +1 -0
  9. package/dist/{icons → chains}/ChainLogo.d.ts +3 -2
  10. package/dist/chains/ChainLogo.d.ts.map +1 -0
  11. package/dist/{icons → chains}/ChainLogo.js +8 -8
  12. package/dist/chains/ChainLogo.js.map +1 -0
  13. package/dist/chains/ChainSearchMenu.d.ts +22 -0
  14. package/dist/chains/ChainSearchMenu.d.ts.map +1 -0
  15. package/dist/chains/ChainSearchMenu.js +141 -0
  16. package/dist/chains/ChainSearchMenu.js.map +1 -0
  17. package/dist/chains/types.d.ts +5 -0
  18. package/dist/chains/types.d.ts.map +1 -0
  19. package/dist/chains/types.js +6 -0
  20. package/dist/chains/types.js.map +1 -0
  21. package/dist/color.d.ts +2 -1
  22. package/dist/color.d.ts.map +1 -1
  23. package/dist/color.js +2 -1
  24. package/dist/color.js.map +1 -1
  25. package/dist/components/Button.d.ts +5 -0
  26. package/dist/components/Button.d.ts.map +1 -0
  27. package/dist/components/Button.js +12 -0
  28. package/dist/components/Button.js.map +1 -0
  29. package/dist/components/CopyButton.d.ts +9 -0
  30. package/dist/components/CopyButton.d.ts.map +1 -0
  31. package/dist/components/CopyButton.js +18 -0
  32. package/dist/components/CopyButton.js.map +1 -0
  33. package/dist/components/IconButton.d.ts +8 -0
  34. package/dist/components/IconButton.d.ts.map +1 -0
  35. package/dist/components/IconButton.js +12 -0
  36. package/dist/components/IconButton.js.map +1 -0
  37. package/dist/components/LinkButton.d.ts +5 -0
  38. package/dist/components/LinkButton.d.ts.map +1 -0
  39. package/dist/components/LinkButton.js +12 -0
  40. package/dist/components/LinkButton.js.map +1 -0
  41. package/dist/components/SearchMenu.d.ts +38 -0
  42. package/dist/components/SearchMenu.d.ts.map +1 -0
  43. package/dist/components/SearchMenu.js +100 -0
  44. package/dist/components/SearchMenu.js.map +1 -0
  45. package/dist/components/SegmentedControl.d.ts +9 -0
  46. package/dist/components/SegmentedControl.d.ts.map +1 -0
  47. package/dist/components/SegmentedControl.js +23 -0
  48. package/dist/components/SegmentedControl.js.map +1 -0
  49. package/dist/components/TextInput.d.ts +7 -0
  50. package/dist/components/TextInput.d.ts.map +1 -0
  51. package/dist/components/TextInput.js +9 -0
  52. package/dist/components/TextInput.js.map +1 -0
  53. package/dist/components/Tooltip.d.ts +9 -0
  54. package/dist/components/Tooltip.d.ts.map +1 -0
  55. package/dist/components/Tooltip.js +12 -0
  56. package/dist/components/Tooltip.js.map +1 -0
  57. package/dist/icons/Airplane.d.ts +2 -7
  58. package/dist/icons/Airplane.d.ts.map +1 -1
  59. package/dist/icons/Airplane.js +2 -2
  60. package/dist/icons/Airplane.js.map +1 -1
  61. package/dist/icons/Arrow.d.ts +8 -0
  62. package/dist/icons/Arrow.d.ts.map +1 -0
  63. package/dist/icons/Arrow.js +25 -0
  64. package/dist/icons/Arrow.js.map +1 -0
  65. package/dist/icons/BoxArrow.d.ts +6 -0
  66. package/dist/icons/BoxArrow.d.ts.map +1 -0
  67. package/dist/icons/BoxArrow.js +9 -0
  68. package/dist/icons/BoxArrow.js.map +1 -0
  69. package/dist/icons/Checkmark.d.ts +6 -0
  70. package/dist/icons/Checkmark.d.ts.map +1 -0
  71. package/dist/icons/Checkmark.js +8 -0
  72. package/dist/icons/Checkmark.js.map +1 -0
  73. package/dist/icons/Chevron.d.ts +8 -0
  74. package/dist/icons/Chevron.d.ts.map +1 -0
  75. package/dist/icons/Chevron.js +25 -0
  76. package/dist/icons/Chevron.js.map +1 -0
  77. package/dist/icons/Circle.d.ts +2 -2
  78. package/dist/icons/Circle.d.ts.map +1 -1
  79. package/dist/icons/Circle.js +2 -2
  80. package/dist/icons/Circle.js.map +1 -1
  81. package/dist/icons/Copy.d.ts +6 -0
  82. package/dist/icons/Copy.d.ts.map +1 -0
  83. package/dist/icons/Copy.js +9 -0
  84. package/dist/icons/Copy.js.map +1 -0
  85. package/dist/icons/Envelope.d.ts +2 -7
  86. package/dist/icons/Envelope.d.ts.map +1 -1
  87. package/dist/icons/Envelope.js +2 -2
  88. package/dist/icons/Envelope.js.map +1 -1
  89. package/dist/icons/Filter.d.ts +6 -0
  90. package/dist/icons/Filter.d.ts.map +1 -0
  91. package/dist/icons/Filter.js +8 -0
  92. package/dist/icons/Filter.js.map +1 -0
  93. package/dist/icons/Funnel.d.ts +6 -0
  94. package/dist/icons/Funnel.d.ts.map +1 -0
  95. package/dist/icons/Funnel.js +8 -0
  96. package/dist/icons/Funnel.js.map +1 -0
  97. package/dist/icons/Gear.d.ts +6 -0
  98. package/dist/icons/Gear.d.ts.map +1 -0
  99. package/dist/icons/Gear.js +8 -0
  100. package/dist/icons/Gear.js.map +1 -0
  101. package/dist/icons/Lock.d.ts +2 -7
  102. package/dist/icons/Lock.d.ts.map +1 -1
  103. package/dist/icons/Lock.js +2 -2
  104. package/dist/icons/Lock.js.map +1 -1
  105. package/dist/icons/Pencil.d.ts +6 -0
  106. package/dist/icons/Pencil.d.ts.map +1 -0
  107. package/dist/icons/Pencil.js +9 -0
  108. package/dist/icons/Pencil.js.map +1 -0
  109. package/dist/icons/Plus.d.ts +6 -0
  110. package/dist/icons/Plus.d.ts.map +1 -0
  111. package/dist/icons/Plus.js +8 -0
  112. package/dist/icons/Plus.js.map +1 -0
  113. package/dist/icons/PlusCircle.d.ts +6 -0
  114. package/dist/icons/PlusCircle.d.ts.map +1 -0
  115. package/dist/icons/PlusCircle.js +8 -0
  116. package/dist/icons/PlusCircle.js.map +1 -0
  117. package/dist/icons/QuestionMark.d.ts +2 -7
  118. package/dist/icons/QuestionMark.d.ts.map +1 -1
  119. package/dist/icons/QuestionMark.js +3 -3
  120. package/dist/icons/QuestionMark.js.map +1 -1
  121. package/dist/icons/Search.d.ts +6 -0
  122. package/dist/icons/Search.d.ts.map +1 -0
  123. package/dist/icons/Search.js +8 -0
  124. package/dist/icons/Search.js.map +1 -0
  125. package/dist/icons/Shield.d.ts +2 -7
  126. package/dist/icons/Shield.d.ts.map +1 -1
  127. package/dist/icons/Shield.js +2 -2
  128. package/dist/icons/Shield.js.map +1 -1
  129. package/dist/icons/Spinner.d.ts +6 -0
  130. package/dist/icons/Spinner.d.ts.map +1 -0
  131. package/dist/icons/Spinner.js +9 -0
  132. package/dist/icons/Spinner.js.map +1 -0
  133. package/dist/icons/UpDownArrows.d.ts +6 -0
  134. package/dist/icons/UpDownArrows.d.ts.map +1 -0
  135. package/dist/icons/UpDownArrows.js +8 -0
  136. package/dist/icons/UpDownArrows.js.map +1 -0
  137. package/dist/icons/WideChevron.d.ts +4 -7
  138. package/dist/icons/WideChevron.d.ts.map +1 -1
  139. package/dist/icons/WideChevron.js +3 -3
  140. package/dist/icons/WideChevron.js.map +1 -1
  141. package/dist/icons/X.d.ts +6 -0
  142. package/dist/icons/X.d.ts.map +1 -0
  143. package/dist/icons/X.js +8 -0
  144. package/dist/icons/X.js.map +1 -0
  145. package/dist/icons/types.d.ts +5 -0
  146. package/dist/icons/types.d.ts.map +1 -0
  147. package/dist/icons/types.js +2 -0
  148. package/dist/icons/types.js.map +1 -0
  149. package/dist/index.d.ts +34 -1
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.js +34 -1
  152. package/dist/index.js.map +1 -1
  153. package/dist/layout/DropdownMenu.d.ts +12 -0
  154. package/dist/layout/DropdownMenu.d.ts.map +1 -0
  155. package/dist/layout/DropdownMenu.js +9 -0
  156. package/dist/layout/DropdownMenu.js.map +1 -0
  157. package/dist/layout/Modal.d.ts +18 -0
  158. package/dist/layout/Modal.d.ts.map +1 -0
  159. package/dist/layout/Modal.js +23 -0
  160. package/dist/layout/Modal.js.map +1 -0
  161. package/dist/layout/Popover.d.ts +12 -0
  162. package/dist/layout/Popover.d.ts.map +1 -0
  163. package/dist/layout/Popover.js +9 -0
  164. package/dist/layout/Popover.js.map +1 -0
  165. package/dist/logos/Hyperlane.d.ts +6 -0
  166. package/dist/logos/Hyperlane.d.ts.map +1 -0
  167. package/dist/logos/Hyperlane.js +10 -0
  168. package/dist/logos/Hyperlane.js.map +1 -0
  169. package/dist/messages/useMessageStage.js +1 -1
  170. package/dist/messages/useMessageStage.js.map +1 -1
  171. package/dist/styles.css +1 -1
  172. package/dist/utils/clipboard.d.ts +4 -0
  173. package/dist/utils/clipboard.d.ts.map +1 -0
  174. package/dist/utils/clipboard.js +25 -0
  175. package/dist/utils/clipboard.js.map +1 -0
  176. package/dist/utils/explorers.d.ts.map +1 -1
  177. package/dist/utils/explorers.js +1 -1
  178. package/dist/utils/explorers.js.map +1 -1
  179. package/dist/utils/useChainConnectionTest.d.ts +4 -0
  180. package/dist/utils/useChainConnectionTest.d.ts.map +1 -0
  181. package/dist/utils/useChainConnectionTest.js +19 -0
  182. package/dist/utils/useChainConnectionTest.js.map +1 -0
  183. package/package.json +8 -4
  184. package/dist/icons/ChainLogo.d.ts.map +0 -1
  185. package/dist/icons/ChainLogo.js.map +0 -1
  186. package/dist/utils/timeout.d.ts +0 -2
  187. package/dist/utils/timeout.d.ts.map +0 -1
  188. package/dist/utils/timeout.js +0 -11
  189. 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":"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"}
@@ -7,11 +7,12 @@ type SvgIcon = (props: {
7
7
  }) => ReactElement;
8
8
  export interface ChainLogoProps {
9
9
  chainName: string;
10
- registry: IRegistry;
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 './Circle.js';
3
- import { QuestionMarkIcon } from './QuestionMark.js';
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 logoUri = svgLogos[chainName];
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 (!logoUri && !Icon) {
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, classes: "htw-bg-gray-100" }, Icon ? (React.createElement(Icon, { width: iconSize, height: iconSize, title: title })) : (React.createElement("img", { src: logoUri, alt: title, width: iconSize, height: iconSize }))));
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: logoUri, alt: title, width: size, height: size }));
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