Health.js 2.28 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, { STATUS } 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;
Amaury Martiny's avatar
Amaury Martiny committed
    switch (status) {
      case STATUS.GOOD:
Amaury Martiny's avatar
Amaury Martiny committed
        return '-good';
      case STATUS.DOWNLOADING:
      case STATUS.LAUNCHING:
      case STATUS.SYNCING:
Amaury Martiny's avatar
Amaury Martiny committed
        return '-syncing';
      default:
        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})`;

    switch (status) {
      case STATUS.NO_NODE_CONNECTED_AND_NO_INTERNET:
        return 'No internet. No nodes connected';
      case STATUS.DOWNLOADING:
        return `Downloading Parity Ethereum... (${payload.percentage}%)`;
      case STATUS.LAUNCHING:
        return 'Launching the node...';
      case STATUS.NODE_CONNECTED_AND_NO_INTERNET:
        return 'No internet. Connected to node.';
      case STATUS.NO_CLOCK_SYNC:
        return 'Clock of host not in sync';
      case STATUS.NO_PEERS:
        return 'No peer node connections';
      case STATUS.SYNCING:
Amaury Martiny's avatar
Amaury Martiny committed
        return `Syncing...${
Amaury Martiny's avatar
Amaury Martiny committed
          payload && payload.percentage && payload.percentage.gt(0)
            ? ` (${payload.percentage.toFixed(0)}%)`
            : ''
      case STATUS.GOOD:
        return `Synced${chainNameAppend}`;
      default:
        return JSON.stringify(payload); // Just in case payload is an object
    }
  };
Amaury Martiny's avatar
Amaury Martiny committed
}

export default Health;