diff --git a/packages/page-explorer/src/Latency/index.tsx b/packages/page-explorer/src/Latency/index.tsx index fb7c14c99b..a43b16601b 100644 --- a/packages/page-explorer/src/Latency/index.tsx +++ b/packages/page-explorer/src/Latency/index.tsx @@ -97,29 +97,24 @@ function formatTime (time: number, divisor = 1000): React.ReactNode { function Latency ({ className }: Props): React.ReactElement { const { t } = useTranslation(); - const { details, maxItems, stdDev, timeAvg, timeMax, timeMin } = useLatency(); - const [renderOrder, setRenderOrder] = useState([false, false, false, false]); - - const isLoaded = useMemo( - () => details.length === maxItems, - [details, maxItems] - ); + const { details, isLoaded, maxItems, stdDev, timeAvg, timeMax, timeMin } = useLatency(); + const [shouldRender, setShouldRender] = useState(() => new Array(ORDER.length).fill(false)); useEffect((): void => { // HACK try and render the charts in order - this _may_ work around the // crosshair plugin init issues, but at best it is non-reproducable if (isLoaded) { - const index = renderOrder.findIndex((v) => !v); + const index = shouldRender.findIndex((v) => !v); if (index !== -1) { nextTick(() => - setRenderOrder( - renderOrder.map((v, i) => (i === index) || v) + setShouldRender( + shouldRender.map((v, i) => (i === index) || v) ) ); } } - }, [isLoaded, renderOrder]); + }, [isLoaded, shouldRender]); const points = useMemo( () => getPoints(details, timeAvg), @@ -185,7 +180,7 @@ function Latency ({ className }: Props): React.ReactElement { {isLoaded ? ORDER.map((key, i) => - renderOrder[i] && ( + shouldRender[i] && ( ({ + bestHash: bestHash.toHex(), + bestNumber, + peerId: peerId.toString(), + roles: stringPascalCase(roles) + })) + .sort((a, b) => a.peerId.localeCompare(b.peerId)) + .sort((a, b) => a.roles.localeCompare(b.roles)) + .sort((a, b) => b.bestNumber.cmp(a.bestNumber)); +} + function Peers ({ className = '', peers }: Props): React.ReactElement { const { t } = useTranslation(); const headerRef = useRef<([React.ReactNode?, string?, number?] | false)[]>([ - [t('connected peers'), 'start'], - [t('role'), 'start'], - [t('best #'), 'number'], - [t('best hash'), 'hash'] + [t('connected peers'), 'start', 2], + [t('best hash'), 'start'], + [t('best #'), 'number'] ]); + const sorted = useMemo( + () => peers && sortPeers(peers), + [peers] + ); + return ( ('no peers connected')} header={headerRef.current} > - {peers?.sort((a, b): number => b.bestNumber.cmp(a.bestNumber)).map((peer) => ( - - - - - + {sorted?.map(({ bestHash, bestNumber, peerId, roles }) => ( + + + + + ))}
{peer.peerId.toString()}{peer.roles.toString().toLowerCase()}{formatNumber(peer.bestNumber)}{peer.bestHash.toHex()}
{roles}{peerId}{bestHash}{formatNumber(bestNumber)}
@@ -46,4 +63,14 @@ function Peers ({ className = '', peers }: Props): React.ReactElement { export default React.memo(styled(Peers)` overflow-x: auto; + + td.roles { + max-width: 9ch; + width: 9ch; + } + + td.bestNumber { + max-width: 11ch; + width: 11ch; + } `); diff --git a/packages/page-explorer/src/NodeInfo/index.tsx b/packages/page-explorer/src/NodeInfo/index.tsx index 7427157d5f..72f17665ea 100644 --- a/packages/page-explorer/src/NodeInfo/index.tsx +++ b/packages/page-explorer/src/NodeInfo/index.tsx @@ -37,16 +37,14 @@ function NodeInfo (): React.ReactElement { const [nextRefresh, setNextRefresh] = useState(() => Date.now()); useEffect((): () => void => { - const _getStatus = (): void => { + const getStatus = (): void => { + setNextRefresh(Date.now() + POLL_TIMEOUT); retrieveInfo(api).then(setInfo).catch(console.error); }; - _getStatus(); + getStatus(); - const timerId = window.setInterval((): void => { - setNextRefresh(Date.now() + POLL_TIMEOUT); - _getStatus(); - }, POLL_TIMEOUT); + const timerId = window.setInterval(getStatus, POLL_TIMEOUT); return (): void => { window.clearInterval(timerId);