diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 0ed09110e4c4..032660081f3c 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3141,6 +3141,11 @@ export default class MetamaskController extends EventEmitter { setActiveNetwork: (networkConfigurationId) => { return this.networkController.setActiveNetwork(networkConfigurationId); }, + // Avoids returning the promise so that initial call to switch network + // doesn't block on the network lookup step + setActiveNetworkConfigurationId: (networkConfigurationId) => { + this.networkController.setActiveNetwork(networkConfigurationId); + }, setNetworkClientIdForDomain: (origin, networkClientId) => { return this.selectedNetworkController.setNetworkClientIdForDomain( origin, diff --git a/ui/store/actions.ts b/ui/store/actions.ts index 2a8d1a983159..d48f2c0a1d88 100644 --- a/ui/store/actions.ts +++ b/ui/store/actions.ts @@ -2168,14 +2168,22 @@ export function automaticallySwitchNetwork( selectedTabOrigin: string, ): ThunkAction { return async (dispatch: MetaMaskReduxDispatch) => { - await dispatch(setActiveNetwork(networkClientIdForThisDomain)); - await dispatch( - setSwitchedNetworkDetails({ - networkClientId: networkClientIdForThisDomain, - origin: selectedTabOrigin, - }), - ); - await forceUpdateMetamaskState(dispatch); + try { + await dispatch( + setActiveNetworkConfigurationId(networkClientIdForThisDomain), + ); + await dispatch( + setSwitchedNetworkDetails({ + networkClientId: networkClientIdForThisDomain, + origin: selectedTabOrigin, + }), + ); + await forceUpdateMetamaskState(dispatch); + } catch (e) { + // The network did not load in time; let network try to load in background + // so that the normal UI switching can go through + console.log("Network wasn't available, try again but async"); + } }; } @@ -2504,6 +2512,24 @@ export function setActiveNetwork( }; } +export function setActiveNetworkConfigurationId( + networkConfigurationId: string, +): ThunkAction { + return async (dispatch) => { + log.debug( + `background.setActiveNetworkConfigurationId: ${networkConfigurationId}`, + ); + try { + await submitRequestToBackground('setActiveNetworkConfigurationId', [ + networkConfigurationId, + ]); + } catch (error) { + logErrorWithMessage(error); + dispatch(displayWarning('Had a problem changing networks!')); + } + }; +} + export function rollbackToPreviousProvider(): ThunkAction< void, MetaMaskReduxState,