Skip to content

Commit 9c7fd93

Browse files
Merge branch 'main' into fix/account-selector-transition
2 parents 2dc6598 + 4517630 commit 9c7fd93

5 files changed

Lines changed: 110 additions & 20 deletions

File tree

app/components/Views/confirmations/hooks/pay/useFiatPaymentHighlightedActions.test.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { renderHook } from '@testing-library/react-hooks';
22
import { type PaymentMethod } from '@metamask/ramps-controller';
3+
import { TransactionType } from '@metamask/transaction-controller';
34
import { useFiatPaymentHighlightedActions } from './useFiatPaymentHighlightedActions';
45
import { useMMPayFiatConfig } from './useMMPayFiatConfig';
56
import { useTransactionPayFiatPayment } from './useTransactionPayData';
@@ -29,6 +30,7 @@ const PAYMENT_METHOD_MOCK: PaymentMethod = {
2930
} as PaymentMethod;
3031

3132
const TRANSACTION_ID_MOCK = 'tx-123';
33+
const TRANSACTION_TYPE_MOCK = TransactionType.simpleSend;
3234

3335
describe('useFiatPaymentHighlightedActions', () => {
3436
const useMMPayFiatConfigMock = jest.mocked(useMMPayFiatConfig);
@@ -46,18 +48,47 @@ describe('useFiatPaymentHighlightedActions', () => {
4648
beforeEach(() => {
4749
jest.resetAllMocks();
4850

49-
useMMPayFiatConfigMock.mockReturnValue({ enabled: true });
51+
useMMPayFiatConfigMock.mockReturnValue({
52+
enabledTransactionTypes: [TRANSACTION_TYPE_MOCK],
53+
maxDelayMinutesForPaymentMethods: 10,
54+
});
5055
useTransactionPayFiatPaymentMock.mockReturnValue(undefined);
5156
useRampsPaymentMethodsMock.mockReturnValue({
5257
paymentMethods: [PAYMENT_METHOD_MOCK],
5358
} as ReturnType<typeof useRampsPaymentMethods>);
5459
useTransactionMetadataRequestMock.mockReturnValue({
5560
id: TRANSACTION_ID_MOCK,
61+
type: TRANSACTION_TYPE_MOCK,
5662
} as ReturnType<typeof useTransactionMetadataRequest>);
5763
});
5864

59-
it('returns empty array when feature flag is off', () => {
60-
useMMPayFiatConfigMock.mockReturnValue({ enabled: false });
65+
it('returns empty array when transaction type is not in enabledTransactionTypes', () => {
66+
useMMPayFiatConfigMock.mockReturnValue({
67+
enabledTransactionTypes: [TransactionType.swap],
68+
maxDelayMinutesForPaymentMethods: 10,
69+
});
70+
71+
const { result } = renderHook(() => useFiatPaymentHighlightedActions());
72+
73+
expect(result.current).toEqual([]);
74+
});
75+
76+
it('returns empty array when enabledTransactionTypes is empty', () => {
77+
useMMPayFiatConfigMock.mockReturnValue({
78+
enabledTransactionTypes: [],
79+
maxDelayMinutesForPaymentMethods: 10,
80+
});
81+
82+
const { result } = renderHook(() => useFiatPaymentHighlightedActions());
83+
84+
expect(result.current).toEqual([]);
85+
});
86+
87+
it('filters out payment methods whose upper delay exceeds maxDelayMinutesForPaymentMethods', () => {
88+
useMMPayFiatConfigMock.mockReturnValue({
89+
enabledTransactionTypes: [TRANSACTION_TYPE_MOCK],
90+
maxDelayMinutesForPaymentMethods: 5,
91+
});
6192

6293
const { result } = renderHook(() => useFiatPaymentHighlightedActions());
6394

app/components/Views/confirmations/hooks/pay/useFiatPaymentHighlightedActions.ts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useMMPayFiatConfig } from './useMMPayFiatConfig';
77
import { useTransactionPayFiatPayment } from './useTransactionPayData';
88
import { useTransactionMetadataRequest } from '../transactions/useTransactionMetadataRequest';
99
import { HighlightedItem } from '../../types/token';
10+
import { hasTransactionType } from '../../utils/transaction';
1011

1112
/**
1213
* Converts available Ramps payment methods into {@link HighlightedItem}s for
@@ -15,22 +16,35 @@ import { HighlightedItem } from '../../types/token';
1516
* `fiatPayment.selectedPaymentMethodId` on the current transaction.
1617
*/
1718
export function useFiatPaymentHighlightedActions(): HighlightedItem[] {
18-
const { enabled } = useMMPayFiatConfig();
19+
const { enabledTransactionTypes, maxDelayMinutesForPaymentMethods } =
20+
useMMPayFiatConfig();
1921
const { paymentMethods } = useRampsPaymentMethods();
2022
const fiatPayment = useTransactionPayFiatPayment();
2123
const transactionMeta = useTransactionMetadataRequest();
2224
const transactionId = transactionMeta?.id ?? '';
2325
const selectedPaymentMethodId = fiatPayment?.selectedPaymentMethodId;
26+
const isFiatEnabled = hasTransactionType(
27+
transactionMeta,
28+
enabledTransactionTypes,
29+
);
2430

2531
return useMemo(() => {
26-
if (!enabled || paymentMethods.length === 0) {
32+
if (!isFiatEnabled || paymentMethods.length === 0) {
2733
return [];
2834
}
2935

30-
return paymentMethods.map((pm) =>
31-
toHighlightedItem(pm, transactionId, selectedPaymentMethodId),
32-
);
33-
}, [enabled, paymentMethods, transactionId, selectedPaymentMethodId]);
36+
return paymentMethods
37+
.filter((pm) => isWithinDelayLimit(pm, maxDelayMinutesForPaymentMethods))
38+
.map((pm) =>
39+
toHighlightedItem(pm, transactionId, selectedPaymentMethodId),
40+
);
41+
}, [
42+
isFiatEnabled,
43+
maxDelayMinutesForPaymentMethods,
44+
paymentMethods,
45+
transactionId,
46+
selectedPaymentMethodId,
47+
]);
3448
}
3549

3650
function toHighlightedItem(
@@ -61,3 +75,10 @@ function toHighlightedItem(
6175
isSelected,
6276
};
6377
}
78+
79+
function isWithinDelayLimit(
80+
pm: PaymentMethod,
81+
maxDelayMinutesForPaymentMethods: number,
82+
): boolean {
83+
return !pm.delay || pm.delay[1] <= maxDelayMinutesForPaymentMethods;
84+
}

app/components/Views/confirmations/hooks/pay/useMMPayFiatConfig.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@ describe('useMMPayFiatConfig', () => {
88
const state = cloneDeep(mockedEmptyFlagsState);
99
state.engine.backgroundState.RemoteFeatureFlagController.remoteFeatureFlags =
1010
{
11-
confirmations_pay_fiat: { enabled: true },
11+
confirmations_pay_fiat: {
12+
enabledTransactionTypes: ['simpleSend', 'swap'],
13+
maxDelayMinutesForPaymentMethods: 15,
14+
},
1215
};
1316

1417
const { result } = renderHookWithProvider(useMMPayFiatConfig, { state });
1518

16-
expect(result.current).toEqual({ enabled: true });
19+
expect(result.current).toEqual({
20+
enabledTransactionTypes: ['simpleSend', 'swap'],
21+
maxDelayMinutesForPaymentMethods: 15,
22+
});
1723
});
1824
});

app/selectors/featureFlagController/confirmations/index.test.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import {
1313
GasFeeTokenFlags,
1414
selectPayQuoteConfig,
1515
selectMetaMaskPayFiatFlags,
16-
PAY_FIAT_ENABLED_DEFAULT,
16+
PAY_FIAT_ENABLED_TRANSACTION_TYPES,
17+
PAY_FIAT_MAX_DELAY_MINUTES_FOR_PAYMENT_METHODS,
1718
selectMetaMaskPayHardwareFlags,
1819
PAY_HARDWARE_ENABLED_DEFAULT,
1920
PreferredToken,
@@ -505,20 +506,43 @@ describe('getPreferredTokensForTransactionType', () => {
505506
});
506507

507508
describe('selectMetaMaskPayFiatFlags', () => {
508-
it('returns default when flag is absent', () => {
509+
it('returns defaults when flag is absent', () => {
509510
expect(selectMetaMaskPayFiatFlags(mockedEmptyFlagsState)).toEqual({
510-
enabled: PAY_FIAT_ENABLED_DEFAULT,
511+
enabledTransactionTypes: PAY_FIAT_ENABLED_TRANSACTION_TYPES,
512+
maxDelayMinutesForPaymentMethods:
513+
PAY_FIAT_MAX_DELAY_MINUTES_FOR_PAYMENT_METHODS,
511514
});
512515
});
513516

514-
it('returns enabled from flag value', () => {
517+
it('returns enabledTransactionTypes from flag value', () => {
515518
const state = cloneDeep(mockedEmptyFlagsState);
516519
state.engine.backgroundState.RemoteFeatureFlagController.remoteFeatureFlags =
517520
{
518-
confirmations_pay_fiat: { enabled: true },
521+
confirmations_pay_fiat: {
522+
enabledTransactionTypes: ['simpleSend', 'swap'],
523+
},
519524
};
520525

521-
expect(selectMetaMaskPayFiatFlags(state)).toEqual({ enabled: true });
526+
expect(selectMetaMaskPayFiatFlags(state)).toEqual({
527+
enabledTransactionTypes: ['simpleSend', 'swap'],
528+
maxDelayMinutesForPaymentMethods:
529+
PAY_FIAT_MAX_DELAY_MINUTES_FOR_PAYMENT_METHODS,
530+
});
531+
});
532+
533+
it('returns maxDelayMinutesForPaymentMethods from flag value', () => {
534+
const state = cloneDeep(mockedEmptyFlagsState);
535+
state.engine.backgroundState.RemoteFeatureFlagController.remoteFeatureFlags =
536+
{
537+
confirmations_pay_fiat: {
538+
maxDelayMinutesForPaymentMethods: 30,
539+
},
540+
};
541+
542+
expect(selectMetaMaskPayFiatFlags(state)).toEqual({
543+
enabledTransactionTypes: PAY_FIAT_ENABLED_TRANSACTION_TYPES,
544+
maxDelayMinutesForPaymentMethods: 30,
545+
});
522546
});
523547
});
524548

app/selectors/featureFlagController/confirmations/index.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import { createSelector } from 'reselect';
22
import { selectRemoteFeatureFlags } from '..';
33
import { Hex, Json } from '@metamask/utils';
44
import { RootState } from '../../../reducers';
5+
import { TransactionType } from '@metamask/transaction-controller';
56

67
export const ATTEMPTS_MAX_DEFAULT = 2;
78
export const BUFFER_INITIAL_DEFAULT = 0.025;
89
export const BUFFER_STEP_DEFAULT = 0.025;
910
export const BUFFER_SUBSEQUENT_DEFAULT = 0.05;
10-
export const PAY_FIAT_ENABLED_DEFAULT = false;
11+
export const PAY_FIAT_ENABLED_TRANSACTION_TYPES = [];
12+
export const PAY_FIAT_MAX_DELAY_MINUTES_FOR_PAYMENT_METHODS = 10;
1113
export const PAY_HARDWARE_ENABLED_DEFAULT = false;
1214
export const SLIPPAGE_DEFAULT = 0.005;
1315
export const STX_DISABLED_DEFAULT = false;
@@ -76,7 +78,8 @@ export interface GasFeeTokenFlags {
7678
}
7779

7880
export interface MetaMaskPayFiatFlags {
79-
enabled: boolean;
81+
enabledTransactionTypes: TransactionType[];
82+
maxDelayMinutesForPaymentMethods: number;
8083
}
8184

8285
export interface MetaMaskPayHardwareFlags {
@@ -251,7 +254,12 @@ export const selectMetaMaskPayFiatFlags = createSelector(
251254
| undefined;
252255

253256
return {
254-
enabled: (raw?.enabled as boolean) ?? PAY_FIAT_ENABLED_DEFAULT,
257+
enabledTransactionTypes:
258+
(raw?.enabledTransactionTypes as TransactionType[]) ??
259+
PAY_FIAT_ENABLED_TRANSACTION_TYPES,
260+
maxDelayMinutesForPaymentMethods:
261+
(raw?.maxDelayMinutesForPaymentMethods as number) ??
262+
PAY_FIAT_MAX_DELAY_MINUTES_FOR_PAYMENT_METHODS,
255263
};
256264
},
257265
);

0 commit comments

Comments
 (0)