import React, { useState, useEffect, useContext } from "react";
import {
Container,
Row,
Col,
Card,
Spinner,
Tooltip,
OverlayTrigger,
} from "react-bootstrap";
import { QueryPreservingLink } from "src/services/network/networkProvider";
import { refreshRate } from "src/constants";
import { NetworkContext } from "src/services/network/networkProvider";
import { BlockchainInfo } from "@zilliqa-js/core/src/types";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faInfoCircle } from "@fortawesome/free-solid-svg-icons";
import "./BCInfo.css";
interface BCInfoState {
startTxBlock: number | null;
maxTPS: number | null;
maxTPSTxBlockNum: number | null;
maxTxnCount: number | null;
maxTxnCountTxBlockNum: number | null;
}
const defaultBCInfoState = {
startTxBlock: null,
maxTPS: null,
maxTPSTxBlockNum: null,
maxTxnCount: null,
maxTxnCountTxBlockNum: null,
};
const BCInfo: React.FC = () => {
const networkContext = useContext(NetworkContext);
if (!networkContext) {
return (
);
}
const { dataService, networkUrl } = networkContext;
const [data, setData] = useState(null);
const [state, setState] = useState(defaultBCInfoState);
useEffect(() => {
setData(null);
setState(defaultBCInfoState);
}, [networkUrl]); // Unset data on url change
useEffect(() => {
if (!data) return;
setState((prevState: BCInfoState) => {
const newState: BCInfoState = { ...prevState };
if (!prevState.startTxBlock)
newState.startTxBlock = parseInt(data.NumTxBlocks, 10) - 1;
if (!prevState.maxTPS || prevState.maxTPS <= data.TransactionRate) {
newState.maxTPS = data.TransactionRate;
newState.maxTPSTxBlockNum = parseInt(data.NumTxBlocks, 10) - 1;
}
if (
!prevState.maxTxnCount ||
prevState.maxTxnCount <= parseInt(data.NumTxnsTxEpoch, 10)
) {
newState.maxTxnCount = parseInt(data.NumTxnsTxEpoch, 10);
newState.maxTxnCountTxBlockNum = parseInt(data.NumTxBlocks, 10) - 1;
}
return newState;
});
}, [data]);
// Fetch data
useEffect(() => {
let isCancelled = false;
if (!dataService) return;
let receivedData: BlockchainInfo;
const getData = async () => {
try {
receivedData = await dataService.getBlockchainInfo();
if (!isCancelled && receivedData) setData(receivedData);
} catch (e) {
if (!isCancelled) console.log(e);
}
};
getData();
const getDataTimer = setInterval(async () => {
await getData();
}, refreshRate);
return () => {
isCancelled = true;
clearInterval(getDataTimer);
};
}, [dataService]);
return (
<>
{data ? (
Current Tx Epoch:
{parseInt(data.NumTxBlocks).toLocaleString("en")}
Number of Transactions:
{parseInt(data.NumTransactions).toLocaleString("en")}
Peers:
{data.NumPeers.toLocaleString("en")}
Sharding Structure:
[
{data.ShardingStructure && data.ShardingStructure.NumPeers
? data.ShardingStructure.NumPeers.toString()
: "no shards"}
]
Current DS Epoch:
{parseInt(data.CurrentDSEpoch).toLocaleString("en")}
DS Block Rate:
{data.DSBlockRate.toFixed(5)}
Tx Block Rate:
{data.TxBlockRate.toFixed(5)}
TPS:
{data.TransactionRate.toFixed(5)}
Number of Txns in DS Epoch:
{parseInt(data.NumTxnsDSEpoch).toLocaleString("en")}
Number of Txns in Txn Epoch:
{parseInt(data.NumTxnsTxEpoch).toLocaleString("en")}
This statistic is accurate from TxBlock{" "}
{state.startTxBlock}. Requires user to stay on the Home
Page
}
>
{" "}
Recent Max Observed TPS:
{state.maxTPS && state.maxTPS.toFixed(5)}
{" "}
(on TxBlock{" "}
{state.maxTPSTxBlockNum}
)
This statistic is accurate from TxBlock{" "}
{state.startTxBlock}. Requires user to stay on the Home
Page
}
>
{" "}
Recent Max Observed Txn Count:
{state.maxTxnCount}{" "}
(on TxBlock{" "}
{state.maxTxnCountTxBlockNum}
)
) : (
)}
>
);
};
export default BCInfo;