Health.js 2.44 KiB
Newer Older
// Copyright 2015-2019 Parity Technologies (UK) Ltd.
Amaury Martiny's avatar
Amaury Martiny committed
// 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 { branch } from 'recompose';
import { chainName$ } from '@parity/light.js';
import light from '@parity/light.js-react';
import withHealth from '../utils/withHealth';
@withHealth
@branch(
  ({
    health: {
      status: { good, syncing }
  }) => good || syncing,
  // Only call light.js chainName$ if we're syncing or good
  light({
    chainName: () => chainName$()
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;
    } else if (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;
    if (status.launching) {
    } else 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';
    } 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.syncing &&
        payload.syncing.syncPercentage &&
        payload.syncing.syncPercentage.gt(0)
          ? ` (${payload.syncing.syncPercentage.toFixed(0)}%)`
      return JSON.stringify(payload) || ''; // Just in case payload is an object
Amaury Martiny's avatar
Amaury Martiny committed
}

export default Health;