Skip to content

Commit b054390

Browse files
authored
Merge pull request #2294 from AmbireTech/hotfix/swap-and-bridge-stop-quote-interval-when-form-hidden
Hotfix / Swap & Bridge - stop Quote update interval when the pop-up is closed or tab is inactive
2 parents 6d0142d + 4df71d9 commit b054390

3 files changed

Lines changed: 39 additions & 3 deletions

File tree

src/controllers/main/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,8 @@ export class MainController extends EventEmitter implements IMainController {
433433
getUserRequests: () => this.requests.userRequests || [],
434434
getVisibleUserRequests: () => this.requests.visibleUserRequests || [],
435435
onBroadcastSuccess: this.commonHandlerForBroadcastSuccess.bind(this),
436-
onBroadcastFailed: this.#handleBroadcastFailed.bind(this)
436+
onBroadcastFailed: this.#handleBroadcastFailed.bind(this),
437+
ui: this.ui
437438
})
438439
this.transfer = new TransferController(
439440
this.callRelayer,

src/controllers/swapAndBridge/swapAndBridge.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,8 @@ const swapAndBridgeController = new SwapAndBridgeController({
229229
getUserRequests: () => [],
230230
getVisibleUserRequests: () => (requestsCtrl ? requestsCtrl.visibleUserRequests : []),
231231
onBroadcastSuccess: () => Promise.resolve(),
232-
onBroadcastFailed: () => {}
232+
onBroadcastFailed: () => {},
233+
ui: uiCtrl
233234
})
234235

235236
const transferCtrl = new TransferController(

src/controllers/swapAndBridge/swapAndBridge.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ISelectedAccountController } from '../../interfaces/selectedAccount'
1919
/* eslint-disable no-await-in-loop */
2020
import { ISignAccountOpController, SignAccountOpError } from '../../interfaces/signAccountOp'
2121
import { IStorageController } from '../../interfaces/storage'
22+
import { IUiController, View } from '../../interfaces/ui'
2223
import {
2324
CachedSupportedChains,
2425
CachedTokenListKey,
@@ -85,6 +86,8 @@ type SwapAndBridgeErrorType = {
8586

8687
const HARD_CODED_CURRENCY = 'usd'
8788

89+
const isSwapAndBridge = (route: string | undefined) => route === 'swap-and-bridge'
90+
8891
const CONVERSION_PRECISION = 16
8992
const CONVERSION_PRECISION_POW = BigInt(10 ** CONVERSION_PRECISION)
9093

@@ -270,6 +273,10 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
270273

271274
#onBroadcastFailed: OnBroadcastFailed
272275

276+
#ui: IUiController
277+
278+
#isOnSwapAndBridgeRoute: boolean = false
279+
273280
constructor({
274281
eventEmitterRegistry,
275282
callRelayer,
@@ -290,7 +297,8 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
290297
getVisibleUserRequests,
291298
swapProvider,
292299
onBroadcastSuccess,
293-
onBroadcastFailed
300+
onBroadcastFailed,
301+
ui
294302
}: {
295303
eventEmitterRegistry?: IEventEmitterRegistryController
296304
callRelayer: Function
@@ -312,6 +320,7 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
312320
swapProvider: SwapProvider
313321
onBroadcastSuccess: OnBroadcastSuccess
314322
onBroadcastFailed: OnBroadcastFailed
323+
ui: IUiController
315324
}) {
316325
super(eventEmitterRegistry)
317326

@@ -335,6 +344,7 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
335344
this.#getVisibleUserRequests = getVisibleUserRequests
336345
this.#onBroadcastSuccess = onBroadcastSuccess
337346
this.#onBroadcastFailed = onBroadcastFailed
347+
this.#ui = ui
338348

339349
// eslint-disable-next-line @typescript-eslint/no-floating-promises
340350
this.#initialLoadPromise = this.#load().finally(() => {
@@ -352,6 +362,29 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
352362
BRIDGE_STATUS_INTERVAL,
353363
this.emitError.bind(this)
354364
)
365+
366+
this.#ui.uiEvent.on('updateView', (view: View) => {
367+
if (isSwapAndBridge(view.currentRoute)) {
368+
this.#isOnSwapAndBridgeRoute = true
369+
// Fetch a fresh quote immediately if the form is ready and the last
370+
// quote is older than 20 seconds (e.g. user was away on another screen).
371+
// If the user just briefly switched screens, skip the immediate fetch
372+
// and let the normal interval handle the next update.
373+
const isQuoteStale = Date.now() - this.updateQuoteInterval.startedRunningAt > 20_000
374+
this.updateQuoteInterval.restart({
375+
runImmediately: !!this.#shouldAutoUpdateQuote && isQuoteStale
376+
})
377+
} else if (isSwapAndBridge(view.previousRoute)) {
378+
this.#isOnSwapAndBridgeRoute = false
379+
this.updateQuoteInterval.stop()
380+
}
381+
})
382+
383+
this.#ui.uiEvent.on('removeView', (view: View) => {
384+
if (!isSwapAndBridge(view.currentRoute)) return
385+
this.#isOnSwapAndBridgeRoute = false
386+
this.updateQuoteInterval.stop()
387+
})
355388
}
356389

357390
#emitUpdateIfNeeded(forceUpdate: boolean = false) {
@@ -2606,6 +2639,7 @@ export class SwapAndBridgeController extends EventEmitter implements ISwapAndBri
26062639

26072640
get #shouldAutoUpdateQuote() {
26082641
return (
2642+
this.#isOnSwapAndBridgeRoute &&
26092643
this.formStatus === SwapAndBridgeFormStatus.ReadyToSubmit &&
26102644
!this.hasProceeded &&
26112645
this.quote &&

0 commit comments

Comments
 (0)