Signer.js 3.63 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
Axel Chalon's avatar
Axel Chalon committed
import React, { Component } from 'react';
import { Field, Form } from 'react-final-form';
import { Form as FetherForm, Header } from 'fether-ui';
import { inject, observer } from 'mobx-react';
import { Link, Redirect, withRouter } from 'react-router-dom';
Axel Chalon's avatar
Axel Chalon committed
import { withProps } from 'recompose';
Axel Chalon's avatar
Axel Chalon committed
import { consumeAccount } from '../../contexts/AccountContext.js';
Axel Chalon's avatar
Axel Chalon committed
import { consumeTokens } from '../../contexts/TokensContext.js';
import TokenBalance from '../../Tokens/TokensList/TokenBalance';
Axel Chalon's avatar
Axel Chalon committed
@inject('sendStore')
Axel Chalon's avatar
Axel Chalon committed
@consumeAccount
Axel Chalon's avatar
Axel Chalon committed
@consumeTokens
@withProps(({ match: { params: { tokenAddress } }, tokens }) => ({
  token: tokens[tokenAddress]
@observer
class Signer extends Component {
  handleAccept = values => {
Axel Chalon's avatar
Axel Chalon committed
    const { accountAddress, history, sendStore, token } = this.props;
    return sendStore
Amaury Martiny's avatar
Amaury Martiny committed
      .send(token, values.password)
Axel Chalon's avatar
Axel Chalon committed
      .then(() =>
        history.push(`/tokens/${accountAddress}/send/${token.address}/sent`)
      )
      .catch(error => ({
Amaury Martiny's avatar
Amaury Martiny committed
        password: error.text
Axel Chalon's avatar
Axel Chalon committed
  render () {
      sendStore: { tx },
      token
    } = this.props;

    if (!tx || !token) {
Axel Chalon's avatar
Axel Chalon committed
      return <Redirect to='/' />;
Amaury Martiny's avatar
Amaury Martiny committed
      <div>
        <Header
          left={
Axel Chalon's avatar
Axel Chalon committed
            <Link to='/tokens' className='icon -close'>
              Close
Amaury Martiny's avatar
Amaury Martiny committed
            </Link>
          title={token && <h1>Send {token.name}</h1>}
Axel Chalon's avatar
Axel Chalon committed
        <div className='window_content'>
          <div className='box -padded'>
            <TokenBalance
              drawers={[
Axel Chalon's avatar
Axel Chalon committed
                <div key='txForm'>
                  <FetherForm.Field
Axel Chalon's avatar
Axel Chalon committed
                    className='form_field_value'
                    disabled
                    defaultValue={`${tx.amount} ${token.symbol}`}
Axel Chalon's avatar
Axel Chalon committed
                    label='Amount'
                  />

                  <FetherForm.Field
Axel Chalon's avatar
Axel Chalon committed
                    as='textarea'
                    className='form_field_value'
                    disabled
                    defaultValue={tx.to}
Axel Chalon's avatar
Axel Chalon committed
                    label='To'
                </div>,
Axel Chalon's avatar
Axel Chalon committed
                  key='signerForm'
                  onSubmit={this.handleAccept}
Amaury Martiny's avatar
Amaury Martiny committed
                  render={({ handleSubmit, pristine, submitting }) => (
                    <form onSubmit={handleSubmit}>
Axel Chalon's avatar
Axel Chalon committed
                      <div className='text'>
                        <p>Enter your password to confirm this transaction.</p>
                      </div>

                      <Field
Axel Chalon's avatar
Axel Chalon committed
                        label='Password'
                        name='password'
                        render={FetherForm.Field}
                        required
Axel Chalon's avatar
Axel Chalon committed
                        type='password'
Axel Chalon's avatar
Axel Chalon committed
                      <nav className='form-nav -binary'>
Axel Chalon's avatar
Axel Chalon committed
                          className='button -cancel'
                          onClick={history.goBack}
Axel Chalon's avatar
Axel Chalon committed
                          type='button'
Axel Chalon's avatar
Axel Chalon committed
                          className='button -submit'
Amaury Martiny's avatar
Amaury Martiny committed
                          disabled={pristine || submitting}
                        >
                          Confirm transaction
                        </button>
                      </nav>
                    </form>
                  )}
                />
              ]}
              onClick={null}
              token={token}
            />
Amaury Martiny's avatar
Amaury Martiny committed
        </div>
export default Signer;