1
1
// eslint-disable-next-line no-use-before-define
2
- import React , { useRef , useState } from 'react'
2
+ import React , { useRef , useState , useEffect } from 'react'
3
3
import { FormattedMessage , useIntl } from 'react-intl'
4
4
import { EnvironmentProps } from '../types'
5
5
import { Dropdown } from 'react-bootstrap'
@@ -12,6 +12,8 @@ const _paq = (window._paq = window._paq || [])
12
12
export function EnvironmentUI ( props : EnvironmentProps ) {
13
13
const vmStateName = useRef ( '' )
14
14
const providers = props . providers . providerList
15
+ const [ isSwitching , setIsSwitching ] = useState ( false )
16
+ const watchdogTimer = useRef < NodeJS . Timeout | null > ( null )
15
17
16
18
const remixVMs = providers . filter ( p => p . config . isVM )
17
19
const injectedProviders = providers . filter ( p => p . config . isInjected )
@@ -23,10 +25,43 @@ export function EnvironmentUI(props: EnvironmentProps) {
23
25
const walletConnect = providers . find ( p => p . name === 'walletconnect' || p . name === 'walletConnect' )
24
26
const httpProvider = providers . find ( p => p . name === 'basic-http-provider' || p . name === 'web3Provider' || p . name === 'basicHttpProvider' )
25
27
26
- const handleChangeExEnv = ( env : string ) => {
27
- const provider = props . providers . providerList . find ( ( exEnv ) => exEnv . name === env )
28
- const context = provider . name
29
- props . setExecutionContext ( { context } )
28
+ const stopSwitching = ( ) => {
29
+ if ( watchdogTimer . current ) {
30
+ clearTimeout ( watchdogTimer . current )
31
+ watchdogTimer . current = null
32
+ }
33
+ setIsSwitching ( false )
34
+ }
35
+
36
+ useEffect ( ( ) => {
37
+ if ( isSwitching ) {
38
+ stopSwitching ( )
39
+ }
40
+ } , [ props . selectedEnv ] )
41
+
42
+ const handleChangeExEnv = async ( env : string ) => {
43
+ if ( props . selectedEnv === env || isSwitching ) return
44
+
45
+ setIsSwitching ( true )
46
+
47
+ watchdogTimer . current = setTimeout ( ( ) => {
48
+ stopSwitching ( )
49
+ } , 10000 )
50
+
51
+ const provider = providers . find ( ( exEnv ) => exEnv . name === env )
52
+
53
+ if ( provider && typeof provider . init === 'function' ) {
54
+ try {
55
+ await provider . init ( )
56
+ props . setExecutionContext ( { context : env } )
57
+ } catch ( e ) {
58
+ stopSwitching ( )
59
+ }
60
+ } else {
61
+ setTimeout ( ( ) => {
62
+ props . setExecutionContext ( { context : env } )
63
+ } , 0 )
64
+ }
30
65
}
31
66
32
67
const currentProvider = props . providers . providerList . find ( ( exEnv ) => exEnv . name === props . selectedEnv )
@@ -165,6 +200,8 @@ export function EnvironmentUI(props: EnvironmentProps) {
165
200
< span className = "ms-1" style = { { textTransform : 'none' , fontSize : '13px' } } > Reset State</ span >
166
201
</ span >
167
202
</ CustomTooltip > }
203
+ { isSwitching && < i className = "fa fa-spinner fa-pulse ms-2" aria-hidden = "true" > </ i > }
204
+
168
205
</ label >
169
206
< div className = "" data-id = { `selected-provider-${ currentProvider && currentProvider . name } ` } >
170
207
< Dropdown
0 commit comments