status/src/Network.js

92 lines
2.4 KiB
JavaScript
Raw Normal View History

2019-09-16 14:53:19 +02:00
import React, { useState, useEffect } from 'react'
import PropTypes from 'prop-types'
2019-09-16 17:50:22 +02:00
import { axiosRpcRequest } from './rpc'
import styles from './Network.module.scss'
2019-09-16 14:53:19 +02:00
Network.propTypes = {
network: PropTypes.shape({
name: PropTypes.string.isRequired,
networkId: PropTypes.string.isRequired,
type: PropTypes.string.isRequired,
2019-09-17 12:22:11 +02:00
rpcUrl: PropTypes.string.isRequired,
explorerUrl: PropTypes.string.isRequired
})
}
2019-09-16 14:53:19 +02:00
export default function Network({ network }) {
2019-09-16 19:01:33 +02:00
const [status, setStatus] = useState('')
const [block, setBlock] = useState('')
const [latency, setLatency] = useState('')
const [clientVersion, setClientVersion] = useState('')
2019-09-16 14:53:19 +02:00
useEffect(() => {
2019-09-16 19:01:33 +02:00
async function getStatusAndBlock() {
2019-09-17 12:22:11 +02:00
const response = await axiosRpcRequest(network.rpcUrl, 'eth_blockNumber')
2019-09-16 14:53:19 +02:00
2019-09-16 19:01:33 +02:00
if (!response || response.status !== 200) {
setStatus('Offline')
return
}
2019-09-16 14:53:19 +02:00
2019-09-16 19:01:33 +02:00
setStatus('Online')
response.duration && setLatency(response.duration)
2019-09-16 17:50:22 +02:00
2019-09-16 19:01:33 +02:00
const blockNumber =
response && response.data && parseInt(response.data.result, 16)
2019-09-16 17:50:22 +02:00
2019-09-16 19:01:33 +02:00
setBlock(blockNumber)
}
2019-09-16 17:50:22 +02:00
2019-09-16 19:01:33 +02:00
async function getClientVersion() {
2019-09-17 12:22:11 +02:00
const response = await axiosRpcRequest(
network.rpcUrl,
'web3_clientVersion'
)
2019-09-16 19:01:33 +02:00
response && response.data && setClientVersion(response.data.result)
}
2019-09-16 17:50:22 +02:00
2019-09-16 19:01:33 +02:00
getStatusAndBlock()
getClientVersion()
2019-09-16 17:50:22 +02:00
2019-09-16 19:01:33 +02:00
const timer = setInterval(() => {
getStatusAndBlock()
getClientVersion()
}, 5000) // run every 5 sec.
return () => {
clearInterval(timer)
}
2019-09-17 02:19:06 +02:00
}, [network])
2019-09-16 17:50:22 +02:00
2019-09-16 14:53:19 +02:00
const isOnline = status === 'Online'
return (
<div className={styles.network}>
<h2 className={styles.title}>
{network.name}
<code>{network.networkId}</code>
2019-09-16 19:01:33 +02:00
<span>{network.type}</span>
2019-09-16 14:53:19 +02:00
</h2>
<p>
2019-09-17 12:22:11 +02:00
<code>{network.rpcUrl}</code>
2019-09-16 14:53:19 +02:00
</p>
<p className={styles.status}>
<span className={isOnline ? styles.success : styles.error}>
{status}
</span>
2019-09-16 19:01:33 +02:00
{latency && (
<span className={styles.latency} title="Latency">
{latency} ms
</span>
)}
2019-09-16 14:53:19 +02:00
</p>
2019-09-16 19:01:33 +02:00
{block && (
<p className={styles.block} title="Current block number">
2019-09-17 12:22:11 +02:00
At block #
<a href={`${network.explorerUrl}/blocks/${block}`}>{block}</a>
2019-09-16 19:01:33 +02:00
</p>
)}
{clientVersion && <p className={styles.clientVersion}>{clientVersion}</p>}
2019-09-16 14:53:19 +02:00
</div>
)
}