1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-11-23 10:30:04 +01:00
metamask-extension/ui/hooks/useCancelTransaction.js

106 lines
3.6 KiB
JavaScript
Raw Normal View History

import { useDispatch, useSelector } from 'react-redux';
import { useCallback, useState } from 'react';
import { showModal, showSidebar } from '../store/actions';
import { isBalanceSufficient } from '../pages/send/send.utils';
import { getSelectedAccount, getIsMainnet } from '../selectors';
import { getConversionRate } from '../ducks/metamask/metamask';
import {
setCustomGasLimit,
setCustomGasPriceForRetry,
} from '../ducks/gas/gas.duck';
2021-06-08 17:25:48 +02:00
import { GAS_LIMITS } from '../../shared/constants/gas';
import { isLegacyTransaction } from '../../shared/modules/transaction.utils';
import { getMaximumGasTotalInHexWei } from '../../shared/modules/gas.utils';
import { useIncrementedGasFees } from './useIncrementedGasFees';
/**
* Determine whether a transaction can be cancelled and provide a method to
* kick off the process of cancellation.
*
* Provides a reusable hook that, given a transactionGroup, will return
* whether or not the account has enough funds to cover the gas cancellation
* fee, and a method for beginning the cancellation process
* @param {Object} transactionGroup
* @return {[boolean, Function]}
*/
2020-11-03 00:41:28 +01:00
export function useCancelTransaction(transactionGroup) {
const { primaryTransaction } = transactionGroup;
const customGasSettings = useIncrementedGasFees(transactionGroup);
const dispatch = useDispatch();
const selectedAccount = useSelector(getSelectedAccount);
const conversionRate = useSelector(getConversionRate);
const isMainnet = useSelector(getIsMainnet);
const hideBasic = !(isMainnet || process.env.IN_TEST);
const [showCancelEditGasPopover, setShowCancelEditGasPopover] = useState(
false,
);
const closeCancelEditGasPopover = () => setShowCancelEditGasPopover(false);
2020-11-03 00:41:28 +01:00
const cancelTransaction = useCallback(
(event) => {
event.stopPropagation();
if (process.env.SHOW_EIP_1559_UI) {
return setShowCancelEditGasPopover(true);
}
if (isLegacyTransaction(primaryTransaction)) {
// To support the current process of cancelling or speeding up
// a transaction, we have to inform the custom gas state of the new
// gasPrice/gasLimit to start at.
dispatch(setCustomGasPriceForRetry(customGasSettings.gasPrice));
dispatch(setCustomGasLimit(GAS_LIMITS.SIMPLE));
}
const tx = {
...primaryTransaction,
txParams: {
...primaryTransaction.txParams,
2021-06-08 17:25:48 +02:00
gas: GAS_LIMITS.SIMPLE,
value: '0x0',
},
};
2020-11-03 00:41:28 +01:00
return dispatch(
showSidebar({
transitionName: 'sidebar-left',
type: 'customize-gas',
props: {
hideBasic,
transaction: tx,
onSubmit: (newGasSettings) => {
const userCustomizedGasTotal = getMaximumGasTotalInHexWei(
newGasSettings,
);
dispatch(
showModal({
name: 'CANCEL_TRANSACTION',
newGasFee: userCustomizedGasTotal,
transactionId: primaryTransaction.id,
customGasSettings: newGasSettings,
}),
);
},
},
2020-11-03 00:41:28 +01:00
}),
);
2020-11-03 00:41:28 +01:00
},
[dispatch, primaryTransaction, customGasSettings, hideBasic],
);
2020-11-03 00:41:28 +01:00
const hasEnoughCancelGas =
primaryTransaction.txParams &&
isBalanceSufficient({
amount: '0x0',
gasTotal: getMaximumGasTotalInHexWei(customGasSettings),
2020-11-03 00:41:28 +01:00
balance: selectedAccount.balance,
conversionRate,
});
return [
hasEnoughCancelGas,
{ cancelTransaction, showCancelEditGasPopover, closeCancelEditGasPopover },
];
}