Health.js 2.44 KiB
Newer Older
Amaury Martiny's avatar
Amaury Martiny committed
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
// This file is part of Parity.
//
Amaury Martiny's avatar
Amaury Martiny committed
// SPDX-License-Identifier: BSD-3-Clause
Amaury Martiny's avatar
Amaury Martiny committed

Amaury Martiny's avatar
Amaury Martiny committed
import React, { Component } from 'react';
import { chainName$, isLoading } from '@parity/light.js';
import light from '@parity/light.js-react';
import withHealth from '../utils/withHealth';
@withHealth
Amaury Martiny's avatar
Amaury Martiny committed
class Health extends Component {
Amaury Martiny's avatar
Amaury Martiny committed
  render () {
Amaury Martiny's avatar
Amaury Martiny committed
    return (
Amaury Martiny's avatar
Amaury Martiny committed
        <span className={['status_icon', this.statusToClassName()].join(' ')}>
          <svg viewBox='0 0 20 20'>
            <circle fill='#DDD' cx='10' cy='10' r='10' />
          </svg>
Amaury Martiny's avatar
Amaury Martiny committed
        </span>
Amaury Martiny's avatar
Amaury Martiny committed
        <span className='status_text'>{this.statusToFriendlyMessage()}</span>
Amaury Martiny's avatar
Amaury Martiny committed
    );
  }
  /**
   * Get className from the status icon from the status enum
   */
Amaury Martiny's avatar
Amaury Martiny committed
  statusToClassName = () => {
Amaury Martiny's avatar
Amaury Martiny committed
    const {
      health: { status }
Amaury Martiny's avatar
Amaury Martiny committed
    } = this.props;
    if (status.good) {
      return '-good';
    } else if (status.downloading || status.launching || status.syncing) {
      return '-syncing';
    } else {
      return '-bad';

  statusToFriendlyMessage = () => {
Amaury Martiny's avatar
Amaury Martiny committed
    const {
      health: { status, payload },
      chainName
Amaury Martiny's avatar
Amaury Martiny committed
    } = this.props;

    const chainNameAppend = isLoading(chainName) ? '' : ` (${chainName})`;

    if (!status.nodeConnected && !status.internet) {
      return 'No internet. No node connected';
    } else if (!status.nodeConnected && status.internet) {
      return 'Connecting to node...';
    } else if (status.nodeConnected && !status.internet) {
      return 'No internet. Connected to node';
      return `Downloading Parity Ethereum... (${
        payload.downloading.syncPercentage
      }%)`;
    } else if (status.launching) {
      return 'Launching the node...';
    } else if (!status.clockSync) {
      return 'Clock of host not in sync';
    } else if (!status.peers) {
    } else if (status.syncing) {
      return `Syncing...${
        payload &&
        payload.downloading &&
        payload.downloading.syncPercentage &&
        payload.downloading.syncPercentage.gt(0)
          ? ` (${payload.downloading.syncPercentage.toFixed(0)}%)`
          : ''
      }${chainNameAppend}`;
    } else if (status.good) {
      return `Synced${chainNameAppend}`;
    } else {
      return JSON.stringify(payload) || ''; // Just in case payload is an object
Amaury Martiny's avatar
Amaury Martiny committed
}

export default Health;