mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-30 16:18:07 +01:00
86 lines
2.9 KiB
JavaScript
86 lines
2.9 KiB
JavaScript
|
import React, { useEffect, useState } from 'react';
|
||
|
import { useSelector } from 'react-redux';
|
||
|
|
||
|
import { CHAIN_ID_TO_NETWORK_ID_MAP } from '../../shared/constants/network';
|
||
|
import { stripHexPrefix } from '../../shared/modules/hexstring-utils';
|
||
|
import { TransactionType } from '../../shared/constants/transaction';
|
||
|
import { getInsightSnaps } from '../selectors';
|
||
|
import { DropdownTab, Tab } from '../components/ui/tabs';
|
||
|
import { SnapInsight } from '../components/app/confirm-page-container/flask/snap-insight';
|
||
|
|
||
|
const isAllowedTransactionTypes = (transactionType) =>
|
||
|
transactionType === TransactionType.contractInteraction ||
|
||
|
transactionType === TransactionType.simpleSend ||
|
||
|
transactionType === TransactionType.tokenMethodSafeTransferFrom ||
|
||
|
transactionType === TransactionType.tokenMethodTransferFrom ||
|
||
|
transactionType === TransactionType.tokenMethodTransfer;
|
||
|
|
||
|
// A hook was needed to return JSX here as the way Tabs work JSX has to be included in
|
||
|
// https://github.com/MetaMask/metamask-extension/blob/develop/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js#L129
|
||
|
// Thus it is not possible to use React Component here
|
||
|
const useTransactionInsights = ({ txData }) => {
|
||
|
const insightSnaps = useSelector(getInsightSnaps);
|
||
|
const [selectedInsightSnapId, setSelectedInsightSnapId] = useState(
|
||
|
insightSnaps[0]?.id,
|
||
|
);
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (insightSnaps.length && !selectedInsightSnapId) {
|
||
|
setSelectedInsightSnapId(insightSnaps[0]?.id);
|
||
|
}
|
||
|
}, [insightSnaps, selectedInsightSnapId, setSelectedInsightSnapId]);
|
||
|
|
||
|
if (!isAllowedTransactionTypes(txData.type) || !insightSnaps.length) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
const selectedSnap = insightSnaps.find(
|
||
|
({ id }) => id === selectedInsightSnapId,
|
||
|
);
|
||
|
|
||
|
const { txParams, chainId, origin } = txData;
|
||
|
const networkId = CHAIN_ID_TO_NETWORK_ID_MAP[chainId];
|
||
|
const caip2ChainId = `eip155:${networkId ?? stripHexPrefix(chainId)}`;
|
||
|
|
||
|
if (insightSnaps.length === 1) {
|
||
|
return (
|
||
|
<Tab
|
||
|
className="confirm-page-container-content__tab"
|
||
|
name={selectedSnap.manifest.proposedName}
|
||
|
>
|
||
|
<SnapInsight
|
||
|
transaction={txParams}
|
||
|
origin={origin}
|
||
|
chainId={caip2ChainId}
|
||
|
selectedSnap={selectedSnap}
|
||
|
/>
|
||
|
</Tab>
|
||
|
);
|
||
|
}
|
||
|
|
||
|
const dropdownOptions = insightSnaps?.map(
|
||
|
({ id, manifest: { proposedName } }) => ({
|
||
|
value: id,
|
||
|
name: proposedName,
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
return (
|
||
|
<DropdownTab
|
||
|
className="confirm-page-container-content__tab"
|
||
|
options={dropdownOptions}
|
||
|
selectedOption={selectedInsightSnapId}
|
||
|
onChange={(snapId) => setSelectedInsightSnapId(snapId)}
|
||
|
>
|
||
|
<SnapInsight
|
||
|
transaction={txParams}
|
||
|
origin={origin}
|
||
|
chainId={caip2ChainId}
|
||
|
selectedSnap={selectedSnap}
|
||
|
/>
|
||
|
</DropdownTab>
|
||
|
);
|
||
|
};
|
||
|
|
||
|
export default useTransactionInsights;
|