status-frontend/src/pages/index.tsx

99 lines
2.9 KiB
TypeScript
Raw Normal View History

2022-09-29 16:25:10 +02:00
import Head from 'next/head'
2022-10-10 17:02:21 +02:00
import React, { ReactElement, useEffect, useState } from 'react'
2022-10-17 14:34:22 +02:00
import { Status, State, Summary, NetworkSummary } from '../@types'
2022-09-29 16:25:10 +02:00
import styles from '../styles/Home.module.css'
2022-10-17 14:34:22 +02:00
import { getData, getNetworkSUmmary, getSummary } from '../utils/getData'
2022-09-30 12:47:53 +02:00
export default function HomePage(): ReactElement {
2022-10-10 17:02:21 +02:00
const [network, setNetwork] = useState<string>('mainnet')
2022-10-10 13:40:07 +02:00
const [summary, setSummary] = useState<Summary[]>()
2022-10-17 14:34:22 +02:00
const [networks, setNetworks] = useState<NetworkSummary[]>()
function statusIcon(state: State): string {
if (state === State.Up) {
return '✅'
} else if (state === State.Down) {
return '🚨'
2022-10-17 14:36:37 +02:00
} else {
return '🚧'
2022-10-17 14:34:22 +02:00
}
}
function statusStyle(state: State) {
if (state === State.Down) {
return styles.down
} else if (state === State.Warning) {
return styles.warning
} else {
return styles.up
}
}
2022-09-30 12:47:53 +02:00
2022-10-10 17:02:21 +02:00
function networkStyle(currentNet: string) {
if (currentNet === network) {
return styles.networkSelected
} else return styles.networkUnselected
}
2022-09-30 12:47:53 +02:00
useEffect(() => {
async function getStatuses() {
2022-10-10 13:40:07 +02:00
const statusData = await getData()
const summaryData = getSummary(network, statusData)
2022-10-10 13:40:07 +02:00
if (summaryData) setSummary(summaryData)
2022-10-17 14:34:22 +02:00
const networkSummary = getNetworkSUmmary(statusData)
if (networkSummary) setNetworks(networkSummary)
2022-09-30 12:47:53 +02:00
}
getStatuses()
}, [network])
2022-09-29 16:25:10 +02:00
return (
<div className={styles.container}>
<Head>
<title>Ocean Protocol Status</title>
2022-09-29 16:25:10 +02:00
<meta name="description" content="Generated by create next app" />
<link rel="icon" href="/favicon.ico" />
</Head>
<main className={styles.main}>
2022-09-30 12:16:56 +02:00
<h1 className={styles.title}>Ocean Status</h1>
2022-09-29 16:25:10 +02:00
<p className={styles.description}>
2022-09-30 12:16:56 +02:00
Current Status of Ocean Components{' '}
2022-09-29 16:25:10 +02:00
</p>
<div className={styles.grid}>
2022-10-10 13:40:07 +02:00
{networks && (
<>
2022-10-17 14:34:22 +02:00
{networks.map((network: NetworkSummary, i: number) => (
<button
key={i}
2022-10-17 14:34:22 +02:00
className={`${styles.network} ${networkStyle(network.name)}`}
onClick={() => setNetwork(network.name)}
>
2022-10-17 14:34:22 +02:00
<span>
{network.name} {statusIcon(network.status)}
</span>
</button>
2022-10-10 13:40:07 +02:00
))}
</>
)}
</div>
<div className={styles.grid}>
{summary && (
2022-10-05 13:15:54 +02:00
<>
2022-10-10 13:40:07 +02:00
{summary.map((value: Summary) => (
<div
key={value.component}
className={`${styles.card} ${statusStyle(value.status)}`}
>
<h2>{value?.component}</h2>
<p>{value?.status}</p>
2022-10-05 13:15:54 +02:00
</div>
))}
2022-10-05 13:15:54 +02:00
</>
)}
2022-09-29 16:25:10 +02:00
</div>
</main>
2022-09-30 12:16:56 +02:00
<footer className={styles.footer}></footer>
2022-09-29 16:25:10 +02:00
</div>
)
}