Files
explore/ui/tx/details/TxDetailsCrossChainMessages.tsx
tom goriunovandGitHub e6e83ee4e7 Add cross-chain transaction tracking and visualization (#3227)
* envs and feature setup

* home page layout

* cross-chain txs page

* cross-chain transfers page

* cross-chain transfers on tx page

* cross-chain messages on tx page

* cross-chain tx page

* cross-chain tx details token transfers

* stats and counters for lists

* migrate to new API version

* add swagger

* mobile lists

* placeholder views on address page

* tests

* fix adaptive tabs initial state when there is only one tab in the list

* tweaks

* bug fixes

* fix tests

* update screenshots

* migrate to new api version

* add chain label tooltip, copy button to txs in lists and same address highlight

* list views on address page

* fix tests

* fix links to current address in the list views

* update tooltips

* update tables layout

* review fixes

* fix spelling

* update screenshots

* update screenshot
2026-02-19 15:14:32 +01:00

62 lines
1.8 KiB
TypeScript

import React from 'react';
import type { InterchainMessage } from '@blockscout/interchain-indexer-types';
import useApiQuery from 'lib/api/useApiQuery';
import { INTERCHAIN_MESSAGE } from 'stubs/interchainIndexer';
import { generateListStub } from 'stubs/utils';
import { CollapsibleList } from 'toolkit/chakra/collapsible';
import * as DetailedInfo from 'ui/shared/DetailedInfo/DetailedInfo';
import TxDetailsCrossChainMessage from './TxDetailsCrossChainMessage';
interface Props {
hash: string;
isLoading: boolean;
}
const TxDetailsCrossChainMessages = ({ hash, isLoading: isLoadingProp }: Props) => {
const { data, isPlaceholderData } = useApiQuery('interchainIndexer:tx_messages', {
pathParams: { hash },
queryOptions: {
placeholderData: generateListStub<'interchainIndexer:tx_messages'>(INTERCHAIN_MESSAGE, 1, { next_page_params: undefined }),
},
});
const isLoading = isLoadingProp || isPlaceholderData;
const renderItem = React.useCallback((item: InterchainMessage) => {
return (
<TxDetailsCrossChainMessage key={ item.message_id } data={ item } isLoading={ isLoading }/>
);
}, [ isLoading ]);
if ((!isPlaceholderData && (!data || !data.items.length))) {
return null;
}
return (
<>
<DetailedInfo.ItemLabel
hint="Cross-chain messages in this transaction"
isLoading={ isLoading }
>
Cross-chain message{ (data?.items ?? []).length > 1 ? 's' : '' }
</DetailedInfo.ItemLabel>
<DetailedInfo.ItemValue>
<CollapsibleList
items={ data?.items ?? [] }
renderItem={ renderItem }
cutLength={ 5 }
text={ [ 'View all messages', 'Hide all messages' ] }
py={ 1 }
rowGap="14px"
/>
</DetailedInfo.ItemValue>
</>
);
};
export default React.memo(TxDetailsCrossChainMessages);