Tokens.js 3.88 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
//
Amaury Martiny's avatar
Amaury Martiny committed
// SPDX-License-Identifier: BSD-3-Clause
YJ's avatar
YJ committed
import React, { Component } from 'react';
import { AccountHeader, Form as FetherForm } from 'fether-ui';
import { accountsInfo$ } from '@parity/light.js';
import light from '@parity/light.js-react';
import { Link, Redirect, withRouter } from 'react-router-dom';
YJ's avatar
YJ committed
import Health from '../Health';
import TokensList from './TokensList';
import withAccount from '../utils/withAccount';
YJ's avatar
YJ committed

YJ's avatar
YJ committed
import { inject } from 'mobx-react';
@withAccount
@light({
Axel Chalon's avatar
Axel Chalon committed
  accountsInfo: accountsInfo$
YJ's avatar
YJ committed
@inject('createAccountStore')
class Tokens extends Component {
YJ's avatar
YJ committed
  state = {
YJ's avatar
YJ committed
    password: '',
YJ's avatar
YJ committed
    toggleBackupScreen: false,
YJ's avatar
YJ committed
    error: ''
YJ's avatar
YJ committed
  };

  handleGoToWhitelist = () => {
    this.props.history.push(`/whitelist/${this.props.accountAddress}`);
  handlePasswordChange = ({ target: { value } }) => {
    this.setState({ password: value });
  };

  handleSubmit = event => {
    const { accountAddress, createAccountStore, history } = this.props;
    const { password } = this.state;
YJ's avatar
YJ committed

    event.preventDefault();

YJ's avatar
YJ committed
    // api.parity.exportAccount
YJ's avatar
YJ committed
    createAccountStore
      .backupAccount(accountAddress, password)
      .then(res => {
        if (res) {
          createAccountStore.clear();
          setTimeout(() => history.push(`/accounts`), 5000);
        }
      })
      .catch(err => {
        this.toggleMsg(err.text + ' Please check your password and try again.');
      });
YJ's avatar
YJ committed
  };

  toggleBackupScreen = () => {
    const { toggleBackupScreen } = this.state;
    this.setState({ toggleBackupScreen: !toggleBackupScreen });
  };

YJ's avatar
YJ committed
  toggleMsg = err => {
YJ's avatar
YJ committed
    this.setState({
      error: err
    });
  };

  renderPasswordFormField = password => {
YJ's avatar
YJ committed
    const { error } = this.state;

    return (
      <div>
YJ's avatar
YJ committed
        <div className='text -centered'>
          <p>Unlock your account:</p>
        </div>
YJ's avatar
YJ committed
        <button className='button -tiny' onClick={this.toggleBackupScreen}>
          Close
        </button>
        <fieldset className='form_fields center-md'>
YJ's avatar
YJ committed
          <form key='createAccount' onSubmit={this.handleSubmit}>
            <FetherForm.Field
YJ's avatar
YJ committed
              label='Password'
              onChange={this.handlePasswordChange}
              required
YJ's avatar
YJ committed
              type='password'
              value={password}
            />

YJ's avatar
YJ committed
            <p className='error'> {error} </p>
YJ's avatar
YJ committed
            <button className='button' disabled={!password}>
              Confirm Backup
            </button>
          </form>
        </fieldset>
      </div>
    );
  };

YJ's avatar
YJ committed
  render () {
YJ's avatar
YJ committed
    const { password, toggleBackupScreen } = this.state;
Axel Chalon's avatar
Axel Chalon committed
    const { accountsInfo, accountAddress } = this.props;
Amaury Martiny's avatar
Amaury Martiny committed
    // If the accountsInfo object is empty (i.e. no accounts), then we redirect
    // to the accounts page to create an account
    if (accountsInfo && !Object.keys(accountsInfo).length) {
YJ's avatar
YJ committed
      return <Redirect to='/accounts/new' />;
Amaury Martiny's avatar
Amaury Martiny committed
    return (
        <AccountHeader
Axel Chalon's avatar
Axel Chalon committed
          address={accountAddress}
          copyAddress
          name={
            accountsInfo &&
Axel Chalon's avatar
Axel Chalon committed
            accountsInfo[accountAddress] &&
            accountsInfo[accountAddress].name
YJ's avatar
YJ committed
            <Link to='/accounts' className='icon -back'>
              Back
            </Link>
YJ's avatar
YJ committed
        {toggleBackupScreen ? this.renderPasswordFormField(password) : null}
Axel Chalon's avatar
Axel Chalon committed
        <TokensList />
YJ's avatar
YJ committed
        <nav className='footer-nav'>
          <div className='footer-nav_status'>
            <Health />
          </div>
YJ's avatar
YJ committed
          <div className='footer-nav_icons'>
YJ's avatar
YJ committed
            <button className='button -tiny' onClick={this.toggleBackupScreen}>
              Backup Account
            </button>
YJ's avatar
YJ committed
            <button className='button -tiny' onClick={this.handleGoToWhitelist}>
Amaury Martiny's avatar
Amaury Martiny committed
              Add tokens
          </div>
        </nav>
Amaury Martiny's avatar
Amaury Martiny committed
export default Tokens;