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;