AccountsList.js 2.96 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';
Amaury Martiny's avatar
Amaury Martiny committed
import { AccountCard, Clickable, Header } from 'fether-ui';
import { chainId$, withoutLoading } from '@parity/light.js';
Axel Chalon's avatar
Axel Chalon committed
import { inject, observer } from 'mobx-react';
import light from '@parity/light.js-react';
Axel Chalon's avatar
Axel Chalon committed
import Health from '../../Health';
import Feedback from './Feedback';
import withAccountsInfo from '../../utils/withAccountsInfo';
@withAccountsInfo
Axel Chalon's avatar
Axel Chalon committed
@inject('createAccountStore', 'parityStore')
@light({
  chainId: () => chainId$().pipe(withoutLoading())
})
@observer
class AccountsList extends Component {
  handleClick = ({
    currentTarget: {
      dataset: { address }
    }
  }) => {
Axel Chalon's avatar
Axel Chalon committed
    const { history } = this.props;
Axel Chalon's avatar
Axel Chalon committed
    history.push(`/tokens/${address}`);
  };

  handleCreateAccount = () => {
Amaury Martiny's avatar
Amaury Martiny committed
    this.props.createAccountStore.setIsImport(false);
Axel Chalon's avatar
Axel Chalon committed
    this.props.history.push('/accounts/new');
Axel Chalon's avatar
Axel Chalon committed
  render () {
    const { accountsInfo, chainId } = this.props;
Axel Chalon's avatar
Axel Chalon committed
    const accountsList = Object.keys(accountsInfo).filter(
      key =>
        !accountsInfo[key].chainId ||
        accountsInfo[key].chainId === parseInt(chainId, 10)
    const accountsListLength = accountsList && accountsList.length;
    return (
      <div className='accounts-list'>
        <Header
          right={
Amaury Martiny's avatar
Amaury Martiny committed
            <Clickable
              className='icon -new'
              onClick={this.handleCreateAccount}
            />
Axel Chalon's avatar
Axel Chalon committed
        <div className='window_content'>
          <div className='box -scroller'>
Luke Schoen's avatar
Luke Schoen committed
              <section className='cards'>
Axel Chalon's avatar
Axel Chalon committed
                {accountsList.map(address => (
Luke Schoen's avatar
Luke Schoen committed
                  <div
                    className='card'
Axel Chalon's avatar
Axel Chalon committed
                    key={address}
                    data-address={address} // Using data- to avoid creating a new item Component
                    onClick={this.handleClick}
                  >
                    <AccountCard
                      address={address}
                      className='-clickable'
                      type={accountsInfo[address].type}
                      name={accountsInfo[address].name || '(no name)'}
Axel Chalon's avatar
Axel Chalon committed
                      shortAddress
                    />
Luke Schoen's avatar
Luke Schoen committed
                  </div>
Axel Chalon's avatar
Axel Chalon committed
                ))}
Luke Schoen's avatar
Luke Schoen committed
              </section>
Axel Chalon's avatar
Axel Chalon committed
            ) : (
              <p className='create-hint'>
                Nothing here yet!
                <br />
                <br />
                Click the + icon to add a new account.
              </p>
            )}
          </div>
        </div>

Axel Chalon's avatar
Axel Chalon committed
        <nav className='footer-nav'>
          <div className='footer-nav_status'>
            <Health />
          </div>
            <Feedback accountsListLength={accountsListLength} />
        </nav>
      </div>
    );
  }
}

export default AccountsList;