import * as React from 'react'; import { formatNumber, trimHash, milliOrSecond, secondsWithPrecision } from '../utils'; import { Ago, Icon } from './'; import { Types, Maybe } from '@dotstats/common'; import nodeIcon from '../icons/server.svg'; import nodeTypeIcon from '../icons/terminal.svg'; import nodeLocationIcon from '../icons/location.svg'; import peersIcon from '../icons/broadcast.svg'; import transactionsIcon from '../icons/inbox.svg'; import blockIcon from '../icons/package.svg'; import blockHashIcon from '../icons/file-binary.svg'; import blockTimeIcon from '../icons/history.svg'; import propagationTimeIcon from '../icons/dashboard.svg'; import lastTimeIcon from '../icons/watch.svg'; import './Node.css'; export namespace Node { export interface Props { id: Types.NodeId; nodeDetails: Types.NodeDetails; nodeStats: Types.NodeStats; blockDetails: Types.BlockDetails; location: Maybe; } export interface PixelPosition { left: number; top: number; } export interface LocationState { hover: boolean; } export function Header() { return ( ) } export function Row(props: Props) { const [name, implementation, version] = props.nodeDetails; const [height, hash, blockTime, blockTimestamp, propagationTime] = props.blockDetails; const [peers, txcount] = props.nodeStats; return ( {name} {implementation} v{version} {peers} {txcount} #{formatNumber(height)} {trimHash(hash, 16)} {secondsWithPrecision(blockTime/1000)} {propagationTime === null ? '∞' : milliOrSecond(propagationTime as number)} ); } export class Location extends React.Component { public readonly state = { hover: false }; public render() { const { left, top, location } = this.props; const height = this.props.blockDetails[0]; const propagationTime = this.props.blockDetails[4]; if (!location) { return null; } let className = 'Node-Location'; if (propagationTime != null) { className += ' Node-Location-synced'; } else if (height % 2 === 1) { className += ' Node-Location-odd'; } return (
{ this.state.hover ? this.renderDetails(location) : null }
); } private renderDetails(location: Types.NodeLocation) { const [name, implementation, version] = this.props.nodeDetails; const [height, hash, blockTime, blockTimestamp, propagationTime] = this.props.blockDetails; return (
{name}
{implementation} v{version}
{location[2]}
#{formatNumber(height)}
{trimHash(hash, 20)}
{secondsWithPrecision(blockTime/1000)} {propagationTime === null ? '∞' : milliOrSecond(propagationTime as number)}
); } private onMouseOver = () => { this.setState({ hover: true }); } private onMouseOut = () => { this.setState({ hover: false }); } } }