Skip to content

Commit b2fcf74

Browse files
committed
Update form warning banners to handle all chains
1 parent 292f9ce commit b2fcf74

File tree

4 files changed

+41
-52
lines changed

4 files changed

+41
-52
lines changed

src/features/chains/ChainConnectionWarning.tsx

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,35 @@
11
import { ChainMetadata, isRpcHealthy } from '@hyperlane-xyz/sdk';
22
import { useQuery } from '@tanstack/react-query';
3-
import { useState } from 'react';
3+
import { useMemo, useState } from 'react';
44
import { FormWarningBanner } from '../../components/banner/FormWarningBanner';
55
import { logger } from '../../utils/logger';
66
import { ChainSelectListModal } from './ChainSelectModal';
77
import { useMultiProvider } from './hooks';
88
import { getChainDisplayName } from './utils';
99

10-
// TODO refactor away from origin/destination
11-
export function ChainConnectionWarning({
12-
origin,
13-
destination,
14-
}: {
15-
origin: ChainName;
16-
destination: ChainName;
17-
}) {
10+
export function ChainConnectionWarning({ chains }: { chains: ChainName[] }) {
1811
const multiProvider = useMultiProvider();
19-
const originMetadata = multiProvider.getChainMetadata(origin);
20-
const destinationMetadata = multiProvider.getChainMetadata(destination);
12+
const chainMetadataList = useMemo(
13+
() => chains.map((c) => multiProvider.getChainMetadata(c)),
14+
[chains, multiProvider],
15+
);
2116

22-
const { data } = useQuery({
23-
queryKey: ['ChainConnectionWarning', originMetadata, destinationMetadata],
17+
const { data: unhealthyChain } = useQuery({
18+
queryKey: ['ChainConnectionWarning', chainMetadataList],
2419
queryFn: async () => {
25-
const isOriginHealthy = await checkRpcHealth(originMetadata);
26-
const isDestinationHealthy = await checkRpcHealth(destinationMetadata);
27-
return { isOriginHealthy, isDestinationHealthy };
20+
const results = await Promise.all(chainMetadataList.map(checkRpcHealth));
21+
for (let i = 0; i < results.length; i++) {
22+
// If it's healthy, ignore
23+
if (results[i]) continue;
24+
// Otherwise return the first unhealthy chain found
25+
return chainMetadataList[i].name;
26+
}
27+
return null;
2828
},
2929
refetchInterval: 5000,
3030
});
3131

32-
const unhealthyChain =
33-
data &&
34-
((!data.isOriginHealthy && originMetadata) ||
35-
(!data.isDestinationHealthy && destinationMetadata) ||
36-
undefined);
37-
38-
const displayName = getChainDisplayName(
39-
multiProvider,
40-
unhealthyChain?.name || originMetadata.name,
41-
true,
42-
);
32+
const displayName = getChainDisplayName(multiProvider, unhealthyChain || '', true);
4333

4434
const [isModalOpen, setIsModalOpen] = useState(false);
4535

@@ -57,7 +47,7 @@ export function ChainConnectionWarning({
5747
isOpen={isModalOpen}
5848
close={() => setIsModalOpen(false)}
5949
onSelect={() => {}}
60-
showChainDetails={unhealthyChain?.name}
50+
showChainDetails={unhealthyChain || undefined}
6151
/>
6252
</>
6353
);

src/features/chains/ChainWalletWarning.tsx

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,32 @@ import { logger } from '../../utils/logger';
77
import { useMultiProvider } from './hooks';
88
import { getChainDisplayName } from './utils';
99

10-
// TODO refactor away from origin
11-
export function ChainWalletWarning({ origin }: { origin: ChainName }) {
10+
export function ChainWalletWarning({ chains }: { chains: ChainName[] }) {
1211
const multiProvider = useMultiProvider();
13-
1412
const wallets = useWalletDetails();
1513
const connectFns = useConnectFns();
1614
const disconnectFns = useDisconnectFns();
1715

1816
const { isVisible, chainDisplayName, walletWhitelist, connectFn, disconnectFn } = useMemo(() => {
19-
const protocol = multiProvider.tryGetProtocol(origin);
20-
const walletWhitelist = config.chainWalletWhitelists[origin]?.map((w) =>
21-
w.trim().toLowerCase(),
22-
);
23-
if (!protocol || !walletWhitelist?.length)
24-
return { isVisible: false, chainDisplayName: '', walletWhitelist: [] };
17+
// Iterate through chains and surface first one with a wallet warning
18+
for (const chain of chains) {
19+
const protocol = multiProvider.tryGetProtocol(chain);
20+
const walletWhitelist = config.chainWalletWhitelists[chain]?.map((w) =>
21+
w.trim().toLowerCase(),
22+
);
23+
if (!protocol || !walletWhitelist?.length) continue;
2524

26-
const chainDisplayName = getChainDisplayName(multiProvider, origin, true);
27-
const walletName = wallets[protocol]?.name?.trim()?.toLowerCase();
28-
const connectFn = connectFns[protocol];
29-
const disconnectFn = disconnectFns[protocol];
30-
const isVisible = !!walletName && !walletWhitelist.includes(walletName);
25+
const chainDisplayName = getChainDisplayName(multiProvider, chain, true);
26+
const walletName = wallets[protocol]?.name?.trim()?.toLowerCase();
27+
const connectFn = connectFns[protocol];
28+
const disconnectFn = disconnectFns[protocol];
29+
const isVisible = !!walletName && !walletWhitelist.includes(walletName);
30+
return { isVisible, chainDisplayName, walletWhitelist, connectFn, disconnectFn };
31+
}
3132

32-
return { isVisible, chainDisplayName, walletWhitelist, connectFn, disconnectFn };
33-
}, [multiProvider, origin, wallets, connectFns, disconnectFns]);
33+
// If no chains apply, return falsy default values
34+
return { isVisible: false, chainDisplayName: '', walletWhitelist: [] };
35+
}, [multiProvider, chains, wallets, connectFns, disconnectFns]);
3436

3537
const onClickChange = () => {
3638
if (!connectFn || !disconnectFn) return;

src/features/deployment/warp/WarpDeploymentForm.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,15 +239,12 @@ function ButtonSection() {
239239

240240
function WarningBanners() {
241241
const { values } = useFormikContext<WarpDeploymentFormValues>();
242+
const chains = useMemo(() => values.configs.map((c) => c.chainName), [values]);
242243
return (
243244
// Max height to prevent double padding if multiple warnings are visible
244245
<div className="max-h-10">
245-
{/* TODO check all chains */}
246-
<ChainWalletWarning origin={values.configs[0].chainName} />
247-
<ChainConnectionWarning
248-
origin={values.configs[0].chainName}
249-
destination={values.configs[1].chainName}
250-
/>
246+
<ChainWalletWarning chains={chains} />
247+
<ChainConnectionWarning chains={chains} />
251248
</div>
252249
);
253250
}

src/features/deployment/warp/WarpDeploymentReview.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ import { Color } from '../../../styles/Color';
1616
import { useMultiProvider } from '../../chains/hooks';
1717
import { getChainDisplayName } from '../../chains/utils';
1818
import { useDeploymentHistory, useWarpDeploymentConfig } from '../hooks';
19+
import { DeploymentStatus } from '../types';
20+
import { tryCopyConfig } from '../utils';
1921
import { TokenTypeDescriptions } from './TokenTypeSelectField';
2022
import { isSyntheticTokenType } from './utils';
2123

2224
// TODO move to widgets lib
2325
import InfoCircle from '../../../images/icons/info-circle.svg';
24-
import { DeploymentStatus } from '../types';
25-
import { tryCopyConfig } from '../utils';
2626

2727
export function WarpDeploymentReview() {
2828
return (

0 commit comments

Comments
 (0)