1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-26 20:39:08 +01:00
metamask-extension/ui/hooks/useAssetDetails.js
Alex Donesky e3ea4f2cd0
Fix issue where we show contract address as recipient when calling safe transfer method on erc721 or erc1155 contracts (#13535)
* fix issue where we show contract address as recipient when calling safe transfer method on erc721 or erc1155 contracts

* updates function name getTransactionData -> parseStandardTokenTransactionData, and adds documentation
2022-03-17 13:35:40 -05:00

118 lines
3.0 KiB
JavaScript

import { useState, useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { parseStandardTokenTransactionData } from '../../shared/modules/transaction.utils';
import { getCollectibles, getTokens } from '../ducks/metamask/metamask';
import { ERC1155, ERC721, ERC20 } from '../helpers/constants/common';
import {
calcTokenAmount,
getAssetDetails,
getTokenAddressParam,
getTokenValueParam,
} from '../helpers/utils/token-util';
import { getTokenList } from '../selectors';
import { hideLoadingIndication, showLoadingIndication } from '../store/actions';
import { usePrevious } from './usePrevious';
export function useAssetDetails(tokenAddress, userAddress, transactionData) {
const dispatch = useDispatch();
// state selectors
const tokens = useSelector(getTokens);
const collectibles = useSelector(getCollectibles);
const tokenList = useSelector(getTokenList);
// in-hook state
const [currentAsset, setCurrentAsset] = useState(null);
// previous state checkers
const prevTokenAddress = usePrevious(tokenAddress);
const prevUserAddress = usePrevious(userAddress);
const prevTransactionData = usePrevious(transactionData);
useEffect(() => {
async function getAndSetAssetDetails() {
dispatch(showLoadingIndication());
const assetDetails = await getAssetDetails(
tokenAddress,
userAddress,
transactionData,
collectibles,
tokens,
tokenList,
);
setCurrentAsset(assetDetails);
dispatch(hideLoadingIndication());
}
if (
tokenAddress !== prevTokenAddress ||
userAddress !== prevUserAddress ||
transactionData !== prevTransactionData
) {
getAndSetAssetDetails();
}
}, [
dispatch,
prevTokenAddress,
prevTransactionData,
prevUserAddress,
tokenAddress,
userAddress,
transactionData,
collectibles,
tokens,
tokenList,
]);
let assetStandard,
assetName,
assetAddress,
tokenSymbol,
decimals,
tokenImage,
userBalance,
tokenValue,
toAddress,
tokenAmount,
tokenId;
if (currentAsset) {
const {
standard,
symbol,
image,
name,
balance,
decimals: currentAssetDecimals,
} = currentAsset;
const tokenData = parseStandardTokenTransactionData(transactionData);
assetStandard = standard;
assetAddress = tokenAddress;
tokenSymbol = symbol;
tokenImage = image;
toAddress = getTokenAddressParam(tokenData);
if (assetStandard === ERC721 || assetStandard === ERC1155) {
assetName = name;
tokenId = getTokenValueParam(tokenData);
}
if (assetStandard === ERC20) {
userBalance = balance;
decimals = Number(currentAssetDecimals?.toString(10));
tokenAmount =
tokenData &&
calcTokenAmount(getTokenValueParam(tokenData), decimals).toString(10);
}
}
return {
assetStandard,
assetName,
assetAddress,
userBalance,
tokenSymbol,
decimals,
tokenImage,
tokenValue,
toAddress,
tokenAmount,
tokenId,
};
}