Sent.js 3.76 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$, withoutLoading } from '@parity/light.js';
import { inject, observer } from 'mobx-react';
import light from '@parity/light.js-react';
import { withProps } from 'recompose';

import check from '../../assets/img/icons/check.svg';
import loading from '../../assets/img/icons/loading.svg';
import withTokens from '../../utils/withTokens';
import { blockscoutTxUrl } from '../../utils/blockscout';
Amaury Martiny's avatar
Amaury Martiny committed
// Number of confirmations to consider a transaction successful
const MIN_CONFIRMATIONS = 6;

  chainName: () => chainName$().pipe(withoutLoading())
})
@inject('sendStore')
@withTokens
@withProps(({ match: { params: { tokenAddress } }, tokens }) => ({
  token: tokens[tokenAddress]
}))
@observer
class Sent extends Component {
Amaury Martiny's avatar
Amaury Martiny committed
  componentWillMount () {
    // If we refresh on this page, return to homepage
    if (!this.props.sendStore.txStatus) {
      this.handleGoToHomepage();
    }
  }

  handleGoToHomepage = () => {
    const { history, sendStore } = this.props;
    sendStore.clear();
    history.push('/');
  };

  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'>
                <button
                  className='button'
                  disabled={confirmations < 6}
                  onClick={this.handleGoToHomepage}
                >
                  Go back
                </button>
Amaury Martiny's avatar
Amaury Martiny committed
              </nav>
            )}
          </div>
        </div>
      </div>
    );
  }

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

    if (!txStatus) {
      return '';
    }

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) {
      return '';
    }

    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,
    } = this.props;

    if (txStatus && txStatus.confirmed) {
      return (
        <a
          href={blockscoutTxUrl(
            chainName,
            txStatus.confirmed.transactionHash,
            token.address
          )}
          target='_blank'
          See it on BlockScout
}

export default Sent;