1- import { useEffect , useState } from 'react'
1+ import { useCallback , useEffect , useState } from 'react'
22import { useActiveWeb3React } from '../../hooks'
3- import useDebounce from '../../hooks/useDebounce'
43import useIsWindowVisible from '../../hooks/useIsWindowVisible'
54import { updateBlockNumber } from './actions'
65import { 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