import React, { useContext } from 'react'; import PropTypes from 'prop-types'; import { I18nContext } from '../../../contexts/i18n'; import Typography from '../../ui/typography/typography'; import { FONT_WEIGHT, TYPOGRAPHY, COLORS, } from '../../../helpers/constants/design-system'; import FormField from '../../ui/form-field'; import { GAS_ESTIMATE_TYPES, GAS_RECOMMENDATIONS, } from '../../../../shared/constants/gas'; import { getGasFormErrorText } from '../../../helpers/constants/gas'; const DEFAULT_ESTIMATES_LEVEL = 'medium'; export default function AdvancedGasControls({ estimateToUse, gasFeeEstimates, gasEstimateType, maxPriorityFee, maxFee, setMaxPriorityFee, setMaxFee, onManualChange, gasLimit, setGasLimit, gasPrice, setGasPrice, maxPriorityFeeFiat, maxFeeFiat, gasErrors, minimumGasLimit = 21000, }) { const t = useContext(I18nContext); const suggestedValues = {}; switch (gasEstimateType) { case GAS_ESTIMATE_TYPES.FEE_MARKET: suggestedValues.maxPriorityFeePerGas = gasFeeEstimates?.[estimateToUse]?.suggestedMaxPriorityFeePerGas; suggestedValues.maxFeePerGas = gasFeeEstimates?.[estimateToUse]?.suggestedMaxFeePerGas; break; case GAS_ESTIMATE_TYPES.LEGACY: suggestedValues.gasPrice = gasFeeEstimates?.[estimateToUse]; break; case GAS_ESTIMATE_TYPES.ETH_GASPRICE: suggestedValues.gasPrice = gasFeeEstimates?.gasPrice; break; default: break; } const showFeeMarketFields = process.env.SHOW_EIP_1559_UI && gasEstimateType === GAS_ESTIMATE_TYPES.FEE_MARKET; return (
{showFeeMarketFields ? ( <> { onManualChange?.(); setMaxPriorityFee(value); }} value={maxPriorityFee} detailText={maxPriorityFeeFiat} numeric titleDetail={ suggestedValues.maxPriorityFeePerGas && ( <> {t('gasFeeEstimate')}: {' '} { gasFeeEstimates?.[DEFAULT_ESTIMATES_LEVEL] ?.suggestedMaxPriorityFeePerGas } ) } error={ gasErrors?.maxPriorityFee ? getGasFormErrorText(gasErrors.maxPriorityFee, t) : null } /> { onManualChange?.(); setMaxFee(value); }} value={maxFee} numeric detailText={maxFeeFiat} titleDetail={ suggestedValues.maxFeePerGas && ( <> {t('gasFeeEstimate')}: {' '} { gasFeeEstimates?.[DEFAULT_ESTIMATES_LEVEL] ?.suggestedMaxFeePerGas } ) } error={ gasErrors?.maxFee ? getGasFormErrorText(gasErrors.maxFee, t) : null } /> ) : ( <> { onManualChange?.(); setGasPrice(value); }} tooltipText={t('editGasPriceTooltip')} value={gasPrice} numeric titleDetail={ suggestedValues.gasPrice && ( <> {t('gasFeeEstimate')}: {' '} {suggestedValues.gasPrice} ) } /> )}
); } AdvancedGasControls.propTypes = { estimateToUse: PropTypes.oneOf(Object.values(GAS_RECOMMENDATIONS)), gasFeeEstimates: PropTypes.oneOf([ PropTypes.shape({ gasPrice: PropTypes.string, }), PropTypes.shape({ low: PropTypes.string, medium: PropTypes.string, high: PropTypes.string, }), PropTypes.shape({ low: PropTypes.object, medium: PropTypes.object, high: PropTypes.object, estimatedBaseFee: PropTypes.string, }), ]), gasEstimateType: PropTypes.oneOf(Object.values(GAS_ESTIMATE_TYPES)), setMaxPriorityFee: PropTypes.func, setMaxFee: PropTypes.func, maxPriorityFee: PropTypes.number, maxFee: PropTypes.number, onManualChange: PropTypes.func, gasLimit: PropTypes.number, setGasLimit: PropTypes.func, gasPrice: PropTypes.number, setGasPrice: PropTypes.func, maxPriorityFeeFiat: PropTypes.string, maxFeeFiat: PropTypes.string, gasErrors: PropTypes.object, minimumGasLimit: PropTypes.number, };