Skip to content

Commit a9bcd3d

Browse files
refactor: deduplicate advanced gas fee modal logic
1 parent d040f9b commit a9bcd3d

3 files changed

Lines changed: 65 additions & 51 deletions

File tree

app/components/Views/confirmations/components/modals/advanced-eip1559-modal/advanced-eip1559-modal.tsx

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
ButtonVariant,
1515
} from '@metamask/design-system-react-native';
1616
import { strings } from '../../../../../../../locales/i18n';
17-
import { updateTransactionGasFees } from '../../../../../../util/transaction-controller';
17+
import { useAdvancedGasFeeModal } from '../../../hooks/gas/useAdvancedGasFeeModal';
1818
import { useTransactionMetadataRequest } from '../../../hooks/transactions/useTransactionMetadataRequest';
1919
import BottomModal from '../../UI/bottom-modal';
2020
import { GasModalHeader } from '../../../components/gas/gas-modal-header';
@@ -23,8 +23,6 @@ import { GasInput } from '../../../components/gas/gas-input';
2323
import { MaxBaseFeeInput } from '../../../components/gas/max-base-fee-input';
2424
import { PriorityFeeInput } from '../../../components/gas/priority-fee-input';
2525
import styleSheet from './advanced-eip1559-modal.styles';
26-
import { usePersistGasFeePreference } from '../../../hooks/gas/usePersistGasFeePreference';
27-
import { hasValidCustomGasFeePreferences } from '../../../hooks/gas/gas-fee-preference-utils';
2826

2927
export const AdvancedEIP1559Modal = ({
3028
setActiveModal,
@@ -35,7 +33,6 @@ export const AdvancedEIP1559Modal = ({
3533
}) => {
3634
const { styles } = useStyles(styleSheet, {});
3735
const transactionMeta = useTransactionMetadataRequest() as TransactionMeta;
38-
const persistGasFeePreference = usePersistGasFeePreference();
3936

4037
const { gas, maxFeePerGas, maxPriorityFeePerGas } =
4138
transactionMeta?.txParams || {};
@@ -68,31 +65,13 @@ export const AdvancedEIP1559Modal = ({
6865
}),
6966
[gasParams.maxFeePerGas, gasParams.maxPriorityFeePerGas],
7067
);
71-
const hasError = Boolean(
72-
errors.gas ||
73-
errors.maxFeePerGas ||
74-
errors.maxPriorityFeePerGas ||
75-
!hasValidCustomGasFeePreferences(savedGasFeePreferences),
76-
);
77-
78-
const handleSaveClick = useCallback(() => {
79-
if (!hasValidCustomGasFeePreferences(savedGasFeePreferences)) {
80-
return;
81-
}
82-
83-
updateTransactionGasFees(transactionMeta.id, {
84-
userFeeLevel: UserFeeLevel.CUSTOM,
85-
...pickBy(gasParams, Boolean),
86-
});
87-
persistGasFeePreference(transactionMeta, savedGasFeePreferences);
88-
handleCloseModals();
89-
}, [
68+
const { hasError, handleSaveClick } = useAdvancedGasFeeModal({
9069
transactionMeta,
9170
gasParams,
92-
persistGasFeePreference,
93-
handleCloseModals,
9471
savedGasFeePreferences,
95-
]);
72+
errors,
73+
handleCloseModals,
74+
});
9675

9776
const navigateToEstimatesModal = useCallback(() => {
9877
setActiveModal(GasModalType.ESTIMATES);

app/components/Views/confirmations/components/modals/advanced-gas-price-modal/advanced-gas-price-modal.tsx

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,14 @@ import {
1414
ButtonVariant,
1515
} from '@metamask/design-system-react-native';
1616
import { strings } from '../../../../../../../locales/i18n';
17-
import { updateTransactionGasFees } from '../../../../../../util/transaction-controller';
17+
import { useAdvancedGasFeeModal } from '../../../hooks/gas/useAdvancedGasFeeModal';
1818
import { GasModalHeader } from '../../../components/gas/gas-modal-header';
1919
import { GasModalType } from '../../../constants/gas';
2020
import { GasInput } from '../../../components/gas/gas-input';
2121
import { GasPriceInput } from '../../../components/gas/gas-price-input';
2222
import { useTransactionMetadataRequest } from '../../../hooks/transactions/useTransactionMetadataRequest';
2323
import BottomModal from '../../UI/bottom-modal';
2424
import styleSheet from './advanced-gas-price-modal.styles';
25-
import { usePersistGasFeePreference } from '../../../hooks/gas/usePersistGasFeePreference';
26-
import { hasValidCustomGasFeePreferences } from '../../../hooks/gas/gas-fee-preference-utils';
2725

2826
export const AdvancedGasPriceModal = ({
2927
setActiveModal,
@@ -34,7 +32,6 @@ export const AdvancedGasPriceModal = ({
3432
}) => {
3533
const { styles } = useStyles(styleSheet, {});
3634
const transactionMeta = useTransactionMetadataRequest() as TransactionMeta;
37-
const persistGasFeePreference = usePersistGasFeePreference();
3835

3936
const { gas, gasPrice } = transactionMeta?.txParams || {};
4037

@@ -57,30 +54,13 @@ export const AdvancedGasPriceModal = ({
5754
}),
5855
[gasParams.gasPrice],
5956
);
60-
const hasError = Boolean(
61-
errors.gas ||
62-
errors.gasPrice ||
63-
!hasValidCustomGasFeePreferences(savedGasFeePreferences),
64-
);
65-
66-
const handleSaveClick = useCallback(() => {
67-
if (!hasValidCustomGasFeePreferences(savedGasFeePreferences)) {
68-
return;
69-
}
70-
71-
updateTransactionGasFees(transactionMeta.id, {
72-
userFeeLevel: UserFeeLevel.CUSTOM,
73-
...pickBy(gasParams, Boolean),
74-
});
75-
persistGasFeePreference(transactionMeta, savedGasFeePreferences);
76-
handleCloseModals();
77-
}, [
57+
const { hasError, handleSaveClick } = useAdvancedGasFeeModal({
7858
transactionMeta,
7959
gasParams,
80-
persistGasFeePreference,
81-
handleCloseModals,
8260
savedGasFeePreferences,
83-
]);
61+
errors,
62+
handleCloseModals,
63+
});
8464

8565
const navigateToEstimatesModal = useCallback(() => {
8666
setActiveModal(GasModalType.ESTIMATES);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { useCallback } from 'react';
2+
import { pickBy } from 'lodash';
3+
import {
4+
TransactionMeta,
5+
UserFeeLevel,
6+
} from '@metamask/transaction-controller';
7+
import type { Hex } from '@metamask/utils';
8+
9+
import { updateTransactionGasFees } from '../../../../../util/transaction-controller';
10+
import type { AdvancedGasFeePreferences } from '../../../../../core/Engine/controllers/preferences-controller-types';
11+
import { hasValidCustomGasFeePreferences } from './gas-fee-preference-utils';
12+
import { usePersistGasFeePreference } from './usePersistGasFeePreference';
13+
14+
interface UseAdvancedGasFeeModalParams {
15+
transactionMeta: TransactionMeta;
16+
gasParams: Record<string, Hex | undefined>;
17+
savedGasFeePreferences: AdvancedGasFeePreferences;
18+
errors: Record<string, string | boolean>;
19+
handleCloseModals: () => void;
20+
}
21+
22+
export function useAdvancedGasFeeModal({
23+
transactionMeta,
24+
gasParams,
25+
savedGasFeePreferences,
26+
errors,
27+
handleCloseModals,
28+
}: UseAdvancedGasFeeModalParams) {
29+
const persistGasFeePreference = usePersistGasFeePreference();
30+
const hasError = Boolean(
31+
Object.values(errors).some(Boolean) ||
32+
!hasValidCustomGasFeePreferences(savedGasFeePreferences),
33+
);
34+
35+
const handleSaveClick = useCallback(() => {
36+
if (!hasValidCustomGasFeePreferences(savedGasFeePreferences)) {
37+
return;
38+
}
39+
40+
updateTransactionGasFees(transactionMeta.id, {
41+
userFeeLevel: UserFeeLevel.CUSTOM,
42+
...pickBy(gasParams, Boolean),
43+
});
44+
persistGasFeePreference(transactionMeta, savedGasFeePreferences);
45+
handleCloseModals();
46+
}, [
47+
transactionMeta,
48+
gasParams,
49+
persistGasFeePreference,
50+
handleCloseModals,
51+
savedGasFeePreferences,
52+
]);
53+
54+
return { hasError, handleSaveClick };
55+
}

0 commit comments

Comments
 (0)