status/src/components/Network/Status.tsx

103 lines
2.6 KiB
TypeScript
Raw Normal View History

2019-12-07 23:02:18 +01:00
import React, { useState, useEffect } from 'react'
2019-12-12 20:48:00 +01:00
import { fetchRpc } from '../../rpc'
2019-12-07 23:02:18 +01:00
import Spinner from '../Spinner'
import { NetworkProps } from '.'
2019-12-12 20:48:00 +01:00
import styles from './Status.module.css'
import Info from './Info'
import { getClientVersion, getGasPrize, getPeers } from './utils'
2019-12-07 23:02:18 +01:00
2019-12-12 20:48:00 +01:00
export default function Status({ network }: { network: NetworkProps }) {
2019-12-07 23:02:18 +01:00
const { rpcUrl, explorerUrl } = network
const [status, setStatus] = useState('')
const [block, setBlock] = useState(0)
const [latency, setLatency] = useState(0)
2019-12-12 20:48:00 +01:00
const [gasLimit, setGasLimit] = useState()
2019-12-07 23:02:18 +01:00
const [clientVersion, setClientVersion] = useState('')
2019-12-12 20:48:00 +01:00
const [gasPrice, setGasPrice] = useState()
const [peers, setPeers] = useState()
2019-12-07 23:02:18 +01:00
async function getStatusAndBlock() {
if (!rpcUrl) return
2019-12-12 20:48:00 +01:00
const response = await fetchRpc(rpcUrl, 'eth_getBlockByNumber', [
'latest',
true
])
2019-12-07 23:02:18 +01:00
2019-12-12 20:48:00 +01:00
const responseParity = await fetchRpc(rpcUrl, 'parity_mode')
if (
!response ||
!response.data ||
response.status !== 200 ||
responseParity.data.result !== 'active'
) {
2019-12-07 23:02:18 +01:00
setStatus('Offline')
return
}
setStatus('Online')
response.duration && setLatency(response.duration)
2019-12-12 20:48:00 +01:00
const { number, gasLimit } = response.data.result
setBlock(parseInt(number, 16))
setGasLimit(parseInt(gasLimit, 16))
2019-12-07 23:02:18 +01:00
}
2019-12-12 20:48:00 +01:00
async function getData() {
getStatusAndBlock()
2019-12-07 23:02:18 +01:00
2019-12-12 20:48:00 +01:00
if (!rpcUrl) return
2019-12-07 23:02:18 +01:00
2019-12-12 20:48:00 +01:00
setClientVersion(await getClientVersion(rpcUrl))
setGasPrice(await getGasPrize(rpcUrl))
setPeers(await getPeers(rpcUrl))
2019-12-07 23:02:18 +01:00
}
useEffect(() => {
2019-12-12 20:48:00 +01:00
getData()
2019-12-07 23:02:18 +01:00
const timer = setInterval(() => {
2019-12-12 20:48:00 +01:00
getData()
2019-12-07 23:02:18 +01:00
}, 5000) // run every 5 sec.
return () => {
clearInterval(timer)
}
}, [network])
const isOnline = status === 'Online'
return (
<div className={styles.networkData}>
{block > 0 ? (
<>
<h2 className={styles.status}>
<span className={isOnline ? styles.success : styles.error}>
{status}
</span>
{latency && (
<span className={styles.latency} title="Latency">
{latency} ms
</span>
)}
</h2>
{block && (
<p className={styles.block} title="Current block number">
At block #<a href={`${explorerUrl}/blocks/${block}`}>{block}</a>
</p>
)}
2019-12-12 20:48:00 +01:00
<Info
gasPrice={gasPrice}
gasLimit={gasLimit}
clientVersion={clientVersion}
peers={peers}
/>
2019-12-07 23:02:18 +01:00
</>
) : (
<Spinner />
)}
</div>
)
}