mirror of
https://github.com/oceanprotocol/status
synced 2025-01-08 13:02:06 +01:00
isolate rpc functions, move to css modules
This commit is contained in:
parent
740d552472
commit
5545d84f39
@ -1,13 +1,13 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { ReactComponent as Logo } from '@oceanprotocol/art/logo/logo-white.svg'
|
import { ReactComponent as Logo } from '@oceanprotocol/art/logo/logo-white.svg'
|
||||||
import './App.scss'
|
import styles from './App.module.scss'
|
||||||
import atlas from '@ethereum-navigator/atlas'
|
import atlas from '@ethereum-navigator/atlas'
|
||||||
import Network from './Network'
|
import Network from './Network'
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<div className={styles.app}>
|
||||||
<header className="header">
|
<header className={styles.header}>
|
||||||
<Logo />
|
<Logo />
|
||||||
<h1>Ocean Protocol Status</h1>
|
<h1>Ocean Protocol Status</h1>
|
||||||
<p>
|
<p>
|
||||||
@ -16,7 +16,7 @@ export default function App() {
|
|||||||
</p>
|
</p>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div className="networks">
|
<div className={styles.networks}>
|
||||||
{atlas
|
{atlas
|
||||||
.filter(
|
.filter(
|
||||||
item => item.project === 'Ocean Protocol' && item.name !== 'Spree'
|
item => item.project === 'Ocean Protocol' && item.name !== 'Spree'
|
||||||
|
38
src/App.module.scss
Normal file
38
src/App.module.scss
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
@import './styles/variables';
|
||||||
|
|
||||||
|
.app {
|
||||||
|
text-align: center;
|
||||||
|
padding: $spacer / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2 {
|
||||||
|
color: $brand-white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: $spacer;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin-bottom: $spacer / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-size: $font-size-large;
|
||||||
|
color: $brand-white;
|
||||||
|
margin: auto;
|
||||||
|
max-width: 35rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.networks {
|
||||||
|
display: grid;
|
||||||
|
gap: $spacer;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
|
||||||
|
margin-top: $spacer * 2;
|
||||||
|
}
|
82
src/App.scss
82
src/App.scss
@ -1,82 +0,0 @@
|
|||||||
@import './styles/variables';
|
|
||||||
|
|
||||||
.App {
|
|
||||||
text-align: center;
|
|
||||||
padding: $spacer / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2 {
|
|
||||||
color: $brand-white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
h1 {
|
|
||||||
margin-bottom: $spacer / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: $font-size-large;
|
|
||||||
color: $brand-white;
|
|
||||||
margin: auto;
|
|
||||||
max-width: 35rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 85px;
|
|
||||||
height: 85px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.networks {
|
|
||||||
display: grid;
|
|
||||||
gap: $spacer;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
|
|
||||||
margin-top: $spacer * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.network {
|
|
||||||
border: 1px solid $brand-grey-dark;
|
|
||||||
padding: $spacer;
|
|
||||||
border-radius: $border-radius;
|
|
||||||
text-align: left;
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin-bottom: $spacer / 4;
|
|
||||||
margin-top: 0;
|
|
||||||
|
|
||||||
span { color: $brand-grey-light; font-size: $font-size-base; }
|
|
||||||
}
|
|
||||||
|
|
||||||
p:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.block {
|
|
||||||
a {
|
|
||||||
color: $brand-grey-lighter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.status {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.success {
|
|
||||||
color: $green;
|
|
||||||
}
|
|
||||||
|
|
||||||
.error {
|
|
||||||
color: $red;
|
|
||||||
}
|
|
||||||
|
|
||||||
.latency {
|
|
||||||
display: inline-block;
|
|
||||||
margin-left: $spacer / 4;
|
|
||||||
font-size: $font-size-mini;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clientVersion {
|
|
||||||
font-size: $font-size-mini;
|
|
||||||
|
|
||||||
}
|
|
@ -1,70 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react'
|
import React, { useState, useEffect } from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import axios from 'axios'
|
import { getStatusAndBlock, getClientVersion } from './rpc'
|
||||||
|
import styles from './Network.module.scss'
|
||||||
// Measure response time and deliver as `response.duration`
|
|
||||||
axios.interceptors.request.use(
|
|
||||||
config => {
|
|
||||||
config.metadata = { startTime: new Date() }
|
|
||||||
return config
|
|
||||||
},
|
|
||||||
error => Promise.reject(error)
|
|
||||||
)
|
|
||||||
|
|
||||||
axios.interceptors.response.use(
|
|
||||||
response => {
|
|
||||||
response.config.metadata.endTime = new Date()
|
|
||||||
response.duration =
|
|
||||||
response.config.metadata.endTime - response.config.metadata.startTime
|
|
||||||
return response
|
|
||||||
},
|
|
||||||
error => {
|
|
||||||
error.config.metadata.endTime = new Date()
|
|
||||||
error.duration =
|
|
||||||
error.config.metadata.endTime - error.config.metadata.startTime
|
|
||||||
return Promise.reject(error)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
async function getStatusAndBlock(network, setStatus, setBlock, setLatency) {
|
|
||||||
try {
|
|
||||||
const response = await axios.post(network.url, {
|
|
||||||
method: 'eth_blockNumber',
|
|
||||||
params: [],
|
|
||||||
id: 1,
|
|
||||||
jsonrpc: '2.0'
|
|
||||||
})
|
|
||||||
|
|
||||||
if (response.status !== 200) {
|
|
||||||
setStatus('Offline')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
setStatus('Online')
|
|
||||||
setLatency(response.duration)
|
|
||||||
|
|
||||||
const blockNumber = parseInt(response.data.result, 16)
|
|
||||||
|
|
||||||
setBlock(blockNumber)
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getClientVersion(network, setClientVersion) {
|
|
||||||
try {
|
|
||||||
const response = await axios.post(network.url, {
|
|
||||||
method: 'web3_clientVersion',
|
|
||||||
params: [],
|
|
||||||
id: 1,
|
|
||||||
jsonrpc: '2.0'
|
|
||||||
})
|
|
||||||
|
|
||||||
setClientVersion(response.data.result)
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Network({ network }) {
|
export default function Network({ network }) {
|
||||||
const [status, setStatus] = useState('...')
|
const [status, setStatus] = useState('...')
|
||||||
@ -86,21 +23,27 @@ export default function Network({ network }) {
|
|||||||
const isOnline = status === 'Online'
|
const isOnline = status === 'Online'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="network">
|
<div className={styles.network}>
|
||||||
<h2>
|
<h2 className={styles.title}>
|
||||||
{network.name} <span>{network.type}</span>
|
{network.name}
|
||||||
|
<span>{network.type}</span>
|
||||||
|
<code>{network.networkId}</code>
|
||||||
</h2>
|
</h2>
|
||||||
<p>
|
<p>
|
||||||
<code>{network.url}</code>
|
<code>{network.url}</code>
|
||||||
</p>
|
</p>
|
||||||
<p className="status">
|
<p className={styles.status}>
|
||||||
<span className={isOnline ? 'success' : 'error'}>{status}</span>
|
<span className={isOnline ? styles.success : styles.error}>
|
||||||
<span className="latency">{latency} ms</span>
|
{status}
|
||||||
|
</span>
|
||||||
|
<span className={styles.latency} title="Latency">
|
||||||
|
{latency} ms
|
||||||
|
</span>
|
||||||
</p>
|
</p>
|
||||||
<p className="block">
|
<p className={styles.block}>
|
||||||
At block #<a href={`${network.explorer}/blocks/${block}`}>{block}</a>
|
At block #<a href={`${network.explorer}/blocks/${block}`}>{block}</a>
|
||||||
</p>
|
</p>
|
||||||
<p className="clientVersion">{clientVersion}</p>
|
<p className={styles.clientVersion}>{clientVersion}</p>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -108,6 +51,7 @@ export default function Network({ network }) {
|
|||||||
Network.propTypes = {
|
Network.propTypes = {
|
||||||
network: PropTypes.shape({
|
network: PropTypes.shape({
|
||||||
name: PropTypes.string.isRequired,
|
name: PropTypes.string.isRequired,
|
||||||
|
networkId: PropTypes.string.isRequired,
|
||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string.isRequired,
|
||||||
url: PropTypes.string.isRequired,
|
url: PropTypes.string.isRequired,
|
||||||
explorer: PropTypes.string.isRequired
|
explorer: PropTypes.string.isRequired
|
||||||
|
59
src/Network.module.scss
Normal file
59
src/Network.module.scss
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
@import './styles/variables';
|
||||||
|
|
||||||
|
.network {
|
||||||
|
border: 1px solid $brand-grey-dark;
|
||||||
|
padding: $spacer;
|
||||||
|
border-radius: $border-radius;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
|
p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
margin-bottom: $spacer / 4;
|
||||||
|
margin-top: 0;
|
||||||
|
font-size: $font-size-h2;
|
||||||
|
|
||||||
|
span,
|
||||||
|
code {
|
||||||
|
color: $brand-grey-light;
|
||||||
|
font-size: $font-size-base;
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: $spacer / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
font-weight: $font-weight-base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.block {
|
||||||
|
a {
|
||||||
|
color: $brand-grey-lighter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.status {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.success {
|
||||||
|
color: $green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
color: $red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.latency {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: $spacer / 4;
|
||||||
|
font-size: $font-size-mini;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clientVersion {
|
||||||
|
font-size: $font-size-mini;
|
||||||
|
|
||||||
|
}
|
63
src/rpc.js
Normal file
63
src/rpc.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
// Measure response time and deliver as `response.duration`
|
||||||
|
axios.interceptors.request.use(
|
||||||
|
config => {
|
||||||
|
config.metadata = { startTime: new Date() }
|
||||||
|
return config
|
||||||
|
},
|
||||||
|
error => Promise.reject(error)
|
||||||
|
)
|
||||||
|
|
||||||
|
axios.interceptors.response.use(
|
||||||
|
response => {
|
||||||
|
response.config.metadata.endTime = new Date()
|
||||||
|
response.duration =
|
||||||
|
response.config.metadata.endTime - response.config.metadata.startTime
|
||||||
|
return response
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
error.config.metadata.endTime = new Date()
|
||||||
|
error.duration =
|
||||||
|
error.config.metadata.endTime - error.config.metadata.startTime
|
||||||
|
return Promise.reject(error)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async function axiosRpcRequest(url, method) {
|
||||||
|
try {
|
||||||
|
const response = await axios.post(url, {
|
||||||
|
method,
|
||||||
|
params: [],
|
||||||
|
id: 1,
|
||||||
|
jsonrpc: '2.0'
|
||||||
|
})
|
||||||
|
|
||||||
|
return response
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getStatusAndBlock(network, setStatus, setBlock, setLatency) {
|
||||||
|
const response = await axiosRpcRequest(network.url, 'eth_blockNumber')
|
||||||
|
|
||||||
|
if (response.status !== 200) {
|
||||||
|
setStatus('Offline')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
setStatus('Online')
|
||||||
|
setLatency(response.duration)
|
||||||
|
|
||||||
|
const blockNumber = parseInt(response.data.result, 16)
|
||||||
|
|
||||||
|
setBlock(blockNumber)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getClientVersion(network, setClientVersion) {
|
||||||
|
const response = await axiosRpcRequest(network.url, 'web3_clientVersion')
|
||||||
|
setClientVersion(response.data.result)
|
||||||
|
}
|
||||||
|
|
||||||
|
export { getStatusAndBlock, getClientVersion }
|
Loading…
Reference in New Issue
Block a user