Skip to content

Commit a5b15e3

Browse files
committed
fix(application state): fix block number updates after changing networks
1 parent 2408b29 commit a5b15e3

File tree

1 file changed

+30
-26
lines changed

1 file changed

+30
-26
lines changed

src/state/application/updater.ts

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { useEffect, useState } from 'react'
1+
import { useCallback, useEffect, useState } from 'react'
22
import { useActiveWeb3React } from '../../hooks'
3-
import useDebounce from '../../hooks/useDebounce'
43
import useIsWindowVisible from '../../hooks/useIsWindowVisible'
54
import { updateBlockNumber } from './actions'
65
import { useDispatch } from 'react-redux'
@@ -10,41 +9,46 @@ export default function Updater() {
109
const dispatch = useDispatch()
1110

1211
const windowVisible = useIsWindowVisible()
13-
const [maxBlockNumber, setMaxBlockNumber] = useState<number | null>(null)
14-
// because blocks arrive in bunches with longer polling periods, we just want
15-
// to process the latest one.
16-
const debouncedMaxBlockNumber = useDebounce<number | null>(maxBlockNumber, 100)
1712

18-
// update block number
19-
useEffect(() => {
20-
if (!library || !chainId) return
21-
22-
const blockListener = (blockNumber: number) => {
23-
setMaxBlockNumber(maxBlockNumber => {
24-
if (typeof maxBlockNumber !== 'number') return blockNumber
25-
return Math.max(maxBlockNumber, blockNumber)
13+
const [state, setState] = useState<{ chainId: number | undefined; blockNumber: number | null }>({
14+
chainId,
15+
blockNumber: null
16+
})
17+
18+
const blockNumberCallback = useCallback(
19+
(blockNumber: number) => {
20+
setState(state => {
21+
if (chainId === state.chainId) {
22+
if (typeof state.blockNumber !== 'number') return { chainId, blockNumber }
23+
return { chainId, blockNumber: Math.max(blockNumber, state.blockNumber) }
24+
}
25+
return state
2626
})
27-
}
27+
},
28+
[chainId, setState]
29+
)
2830

29-
setMaxBlockNumber(null)
31+
// attach/detach listeners
32+
useEffect(() => {
33+
if (!library || !chainId || !windowVisible) return
34+
35+
setState({ chainId, blockNumber: null })
3036

3137
library
3238
.getBlockNumber()
33-
.then(blockNumber => dispatch(updateBlockNumber({ chainId, blockNumber })))
34-
.catch(error => console.error(`Failed to get block number for chainId ${chainId}`, error))
39+
.then(blockNumberCallback)
40+
.catch(error => console.error(`Failed to get block number for chainId: ${chainId}`, error))
3541

36-
library.on('block', blockListener)
42+
library.on('block', blockNumberCallback)
3743
return () => {
38-
library.removeListener('block', blockListener)
44+
library.removeListener('block', blockNumberCallback)
3945
}
40-
}, [dispatch, chainId, library])
46+
}, [dispatch, chainId, library, blockNumberCallback, windowVisible])
4147

4248
useEffect(() => {
43-
if (!chainId || !debouncedMaxBlockNumber) return
44-
if (windowVisible) {
45-
dispatch(updateBlockNumber({ chainId, blockNumber: debouncedMaxBlockNumber }))
46-
}
47-
}, [chainId, debouncedMaxBlockNumber, windowVisible, dispatch])
49+
if (!state.chainId || !state.blockNumber || !windowVisible) return
50+
dispatch(updateBlockNumber({ chainId: state.chainId, blockNumber: state.blockNumber }))
51+
}, [windowVisible, dispatch, state.blockNumber, state.chainId])
4852

4953
return null
5054
}

0 commit comments

Comments
 (0)