Skip to content

Commit 9063409

Browse files
fix: transaction pay quote refresh (#7020)
## Explanation Ensure `isLoading` is also cleared after refreshing quotes. ## References ## Checklist - [x] I've updated the test suite for new or updated code as appropriate - [x] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [x] I've communicated my changes to consumers by [updating changelogs for packages I've changed](https://github.com/MetaMask/core/tree/main/docs/contributing.md#updating-changelogs), highlighting breaking changes as necessary - [x] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes
1 parent 7ad0c39 commit 9063409

File tree

5 files changed

+70
-57
lines changed

5 files changed

+70
-57
lines changed

packages/transaction-pay-controller/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Fixed
11+
12+
- Prevent infinite loading after quotes are refreshed ([#7020](https://github.com/MetaMask/core/pull/7020))
13+
1014
## [2.0.1]
1115

1216
### Fixed

packages/transaction-pay-controller/src/TransactionPayController.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ describe('TransactionPayController', () => {
119119
expect(
120120
controller.state.transactionData[TRANSACTION_ID_MOCK],
121121
).toStrictEqual({
122-
isLoading: true,
122+
isLoading: false,
123123
sourceAmounts: [{ sourceAmountHuman: '1.23' }],
124124
tokens: [],
125125
});

packages/transaction-pay-controller/src/TransactionPayController.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ export class TransactionPayController extends BaseController<
113113
updateSourceAmounts(transactionId, current as never, this.messenger);
114114

115115
shouldUpdateQuotes = true;
116-
current.isLoading = true;
117116
}
118117
});
119118

@@ -123,13 +122,7 @@ export class TransactionPayController extends BaseController<
123122
transactionData: this.state.transactionData[transactionId],
124123
transactionId,
125124
updateTransactionData: this.#updateTransactionData.bind(this),
126-
})
127-
.finally(() => {
128-
this.#updateTransactionData(transactionId, (data) => {
129-
data.isLoading = false;
130-
});
131-
})
132-
.catch(noop);
125+
}).catch(noop);
133126
}
134127
}
135128

packages/transaction-pay-controller/src/utils/quotes.test.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ describe('Quotes Utils', () => {
133133

134134
const transactionDataMock = {};
135135

136-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
136+
updateTransactionDataMock.mock.calls.map((call) =>
137+
call[1](transactionDataMock),
138+
);
137139

138140
expect(transactionDataMock).toMatchObject({
139141
quotes: [QUOTE_MOCK],
@@ -152,7 +154,9 @@ describe('Quotes Utils', () => {
152154
quotes: [QUOTE_MOCK],
153155
};
154156

155-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
157+
updateTransactionDataMock.mock.calls.map((call) =>
158+
call[1](transactionDataMock),
159+
);
156160

157161
expect(transactionDataMock).toMatchObject({
158162
quotes: [],
@@ -174,7 +178,9 @@ describe('Quotes Utils', () => {
174178
quotes: [QUOTE_MOCK],
175179
};
176180

177-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
181+
updateTransactionDataMock.mock.calls.map((call) =>
182+
call[1](transactionDataMock),
183+
);
178184

179185
expect(transactionDataMock).toMatchObject({
180186
quotes: [],
@@ -243,7 +249,9 @@ describe('Quotes Utils', () => {
243249

244250
const transactionDataMock = {};
245251

246-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
252+
updateTransactionDataMock.mock.calls.map((call) =>
253+
call[1](transactionDataMock),
254+
);
247255

248256
expect(transactionDataMock).toStrictEqual(
249257
expect.objectContaining({ totals: TOTALS_MOCK }),
@@ -297,11 +305,12 @@ describe('Quotes Utils', () => {
297305

298306
await refreshQuotes(messenger, updateTransactionDataMock);
299307

300-
expect(updateTransactionDataMock).toHaveBeenCalledTimes(2);
308+
expect(updateTransactionDataMock).toHaveBeenCalledTimes(3);
301309

302310
const transactionDataMock = {};
303-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
304-
updateTransactionDataMock.mock.calls[1][1](transactionDataMock);
311+
updateTransactionDataMock.mock.calls.map((call) =>
312+
call[1](transactionDataMock),
313+
);
305314

306315
expect(transactionDataMock).toMatchObject({
307316
quotes: [],
@@ -321,11 +330,12 @@ describe('Quotes Utils', () => {
321330

322331
await refreshQuotes(messenger, updateTransactionDataMock);
323332

324-
expect(updateTransactionDataMock).toHaveBeenCalledTimes(2);
333+
expect(updateTransactionDataMock).toHaveBeenCalledTimes(3);
325334

326335
const transactionDataMock = {};
327-
updateTransactionDataMock.mock.calls[0][1](transactionDataMock);
328-
updateTransactionDataMock.mock.calls[1][1](transactionDataMock);
336+
updateTransactionDataMock.mock.calls.map((call) =>
337+
call[1](transactionDataMock),
338+
);
329339

330340
expect(transactionDataMock).toMatchObject({
331341
quotes: [],

packages/transaction-pay-controller/src/utils/quotes.ts

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -75,49 +75,59 @@ export async function updateQuotes(request: UpdateQuotesRequest) {
7575

7676
let quotes: TransactionPayQuote<Json>[] | undefined = [];
7777

78-
const strategy = await getStrategy(messenger as never, transaction);
78+
updateTransactionData(transactionId, (data) => {
79+
data.isLoading = true;
80+
});
7981

8082
try {
81-
quotes = requests?.length
82-
? ((await strategy.getQuotes({
83-
messenger,
84-
requests,
85-
transaction,
86-
})) as TransactionPayQuote<Json>[])
87-
: [];
88-
} catch (error) {
89-
log('Error fetching quotes', { error, transactionId });
90-
}
83+
const strategy = await getStrategy(messenger as never, transaction);
84+
85+
try {
86+
quotes = requests?.length
87+
? ((await strategy.getQuotes({
88+
messenger,
89+
requests,
90+
transaction,
91+
})) as TransactionPayQuote<Json>[])
92+
: [];
93+
} catch (error) {
94+
log('Error fetching quotes', { error, transactionId });
95+
}
9196

92-
log('Updated', { transactionId, quotes });
97+
log('Updated', { transactionId, quotes });
9398

94-
const batchTransactions =
95-
quotes?.length && strategy.getBatchTransactions
96-
? await strategy.getBatchTransactions({
97-
messenger,
98-
quotes,
99-
})
100-
: [];
99+
const batchTransactions =
100+
quotes?.length && strategy.getBatchTransactions
101+
? await strategy.getBatchTransactions({
102+
messenger,
103+
quotes,
104+
})
105+
: [];
101106

102-
log('Batch transactions', { transactionId, batchTransactions });
107+
log('Batch transactions', { transactionId, batchTransactions });
103108

104-
const totals = calculateTotals(quotes as never, tokens, messenger);
109+
const totals = calculateTotals(quotes as never, tokens, messenger);
105110

106-
log('Calculated totals', { transactionId, totals });
111+
log('Calculated totals', { transactionId, totals });
107112

108-
syncTransaction({
109-
batchTransactions,
110-
messenger: messenger as never,
111-
paymentToken,
112-
totals,
113-
transactionId,
114-
});
113+
syncTransaction({
114+
batchTransactions,
115+
messenger: messenger as never,
116+
paymentToken,
117+
totals,
118+
transactionId,
119+
});
115120

116-
updateTransactionData(transactionId, (data) => {
117-
data.quotes = quotes as never;
118-
data.quotesLastUpdated = Date.now();
119-
data.totals = totals;
120-
});
121+
updateTransactionData(transactionId, (data) => {
122+
data.quotes = quotes as never;
123+
data.quotesLastUpdated = Date.now();
124+
data.totals = totals;
125+
});
126+
} finally {
127+
updateTransactionData(transactionId, (data) => {
128+
data.isLoading = false;
129+
});
130+
}
121131
}
122132

123133
/**
@@ -206,10 +216,6 @@ export async function refreshQuotes(
206216
refreshInterval,
207217
});
208218

209-
updateTransactionData(transactionId, (data) => {
210-
data.isLoading = true;
211-
});
212-
213219
await updateQuotes({
214220
messenger,
215221
transactionData,

0 commit comments

Comments
 (0)