Sent.js 3.08 KiB
Newer Older
// 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

import React, { Component } from 'react';
import { chainName$ } from '@parity/light.js';
import { inject, observer } from 'mobx-react';
import light from 'light-hoc';
Amaury Martiny's avatar
Amaury Martiny committed
import { Link } from 'react-router-dom';

import check from '../../assets/img/icons/check.svg';
import loading from '../../assets/img/icons/loading.svg';

Amaury Martiny's avatar
Amaury Martiny committed
// Number of confirmations to consider a transaction successful
const MIN_CONFIRMATIONS = 6;

  chainName: chainName$
})
@inject('sendStore')
@observer
class Sent extends Component {
  render () {
Amaury Martiny's avatar
Amaury Martiny committed
    const {
      sendStore: { confirmations }
Amaury Martiny's avatar
Amaury Martiny committed
    } = this.props;

      <div className='window_content'>
        <div className='alert-screen'>
          <div className='alert-screen_content'>
            <div className='alert-screen_image'>
              <img alt='loading' src={this.renderIcon()} />
            </div>
            <div className='alert-screen_text'>
              <h1>{this.renderTitle()}</h1>
              <p>{this.renderDescription()}</p>
              <p>{this.renderLink()}</p>
Amaury Martiny's avatar
Amaury Martiny committed
            </div>
Amaury Martiny's avatar
Amaury Martiny committed
            {confirmations >= MIN_CONFIRMATIONS && (
              <nav className='form-nav'>
Amaury Martiny's avatar
Amaury Martiny committed
                <Link to='/'>
                  <button className='button' disabled={confirmations < 6}>
                    Go back
                  </button>
Amaury Martiny's avatar
Amaury Martiny committed
                </Link>
              </nav>
            )}
          </div>
        </div>
      </div>
    );
  }

  renderDescription = () => {
    const {
      sendStore: { confirmations, txStatus }
    } = this.props;

Amaury Martiny's avatar
Amaury Martiny committed
    if (confirmations >= MIN_CONFIRMATIONS) {
Amaury Martiny's avatar
Amaury Martiny committed
      return null;
    if (confirmations > 0) {
Amaury Martiny's avatar
Amaury Martiny committed
      return `Waiting ${confirmations}/${MIN_CONFIRMATIONS} confirmations`;
    if (txStatus.confirmed) {
      return 'Waiting for confirmations...';
    }

    if (txStatus.failed) {
      return JSON.stringify(txStatus.failed);
    }

    return null;
  };

  renderIcon = () => {
    const {
      sendStore: { confirmations }
    } = this.props;
Amaury Martiny's avatar
Amaury Martiny committed
    if (confirmations >= MIN_CONFIRMATIONS) {
      return check;
    }
    return loading;
  };

  renderTitle = () => {
    const {
Amaury Martiny's avatar
Amaury Martiny committed
      sendStore: { confirmations, txStatus }
    } = this.props;

    if (txStatus.confirmed) {
      return (
        <span>
Amaury Martiny's avatar
Amaury Martiny committed
          {confirmations >= MIN_CONFIRMATIONS
            ? 'Transaction confirmed'
            : 'Submitted'}
    }

    if (txStatus.failed) {
      return 'Error';
    }

    return 'Sending your transaction...';
  };

  renderLink = () => {
    const {
      chainName,
      sendStore: { confirmations, txStatus }
    } = this.props;

    if (confirmations >= 0) {
      return (
        <a
          href={`https://${
            chainName === 'foundation' ? '' : `${chainName}.`
          }etherscan.io/tx/${txStatus.confirmed.transactionHash}`}
          target='_blank'
        >
          <button className='button -tiny'>See it on Etherscan</button>
        </a>
      );
    }

    return null;
  };
}

export default Sent;