Tokens.js 4.02 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, observer } from "mobx-react";
@withAccount
@light({
Axel Chalon's avatar
Axel Chalon committed
  accountsInfo: accountsInfo$
YJ's avatar
YJ committed
@inject("createAccountStore")
@observer
class Tokens extends Component {
YJ's avatar
YJ committed
  state = {
YJ's avatar
YJ committed
    password: "",
    toggleBackupScreen: false,
    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
    const _this = this;
YJ's avatar
YJ committed
    // api.parity.exportAccount
YJ's avatar
YJ committed
    createAccountStore.backupAccount(accountAddress, password).then(res => {
      if (res && res.type === "ACCOUNT_ERROR") {
        _this.toggleError(
          res.text + " Please check your password and try again."
        );
      } else {
YJ's avatar
YJ committed
        createAccountStore.clear();
        history.push(`/accounts`);
YJ's avatar
YJ committed
      }
    });
YJ's avatar
YJ committed
  };

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

YJ's avatar
YJ committed
  toggleError = err => {
    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">
          <button className="button" onClick={this.toggleBackupScreen}>
            close
          </button>
          <p>Unlock your account:</p>
        </div>
YJ's avatar
YJ committed
        <fieldset className="form_fields -centered">
          <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 ? error : null} </p>

            <button className="button -right" 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
        <div className="center-md">
          {toggleBackupScreen ? (
            this.renderPasswordFormField(password)
          ) : (
YJ's avatar
YJ committed
            <button className="button" onClick={this.toggleBackupScreen}>
              backup account
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">
            <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;