83ff213f6c
* Add a dropdown popup for account selector * Install sui latest version for hideOnScroll bug fix * Update ui * Update package-lock after rebase * Require parity/ui v3.0.3 * Pass accountStore as props * Require parity/ui v3.0.4
105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
|
// This file is part of Parity.
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import React, { Component } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { observer } from 'mobx-react';
|
|
|
|
import List from 'semantic-ui-react/dist/commonjs/elements/List';
|
|
import Popup from 'semantic-ui-react/dist/commonjs/modules/Popup';
|
|
import IdentityIcon from '@parity/ui/lib/IdentityIcon';
|
|
|
|
import AccountItem from './AccountItem';
|
|
import styles from './defaultAccount.css';
|
|
|
|
@observer
|
|
class DefaultAccount extends Component {
|
|
state = {
|
|
isOpen: false
|
|
}
|
|
|
|
static propTypes = {
|
|
accountStore: PropTypes.object.isRequired
|
|
}
|
|
|
|
handleOpen = () => {
|
|
this.setState({ isOpen: true });
|
|
}
|
|
|
|
handleClose = () => {
|
|
this.setState({ isOpen: false });
|
|
}
|
|
|
|
handleMakeDefault = (address) => {
|
|
this.handleClose();
|
|
if (address === this.props.accountStore.defaultAddress) { return; }
|
|
this.props.accountStore.makeDefaultAccount(address);
|
|
}
|
|
|
|
render () {
|
|
const { accounts, defaultAccount: defaultAddress } = this.props.accountStore;
|
|
const defaultAccount = accounts.find(({ address }) => address === defaultAddress);
|
|
|
|
if (!accounts || !defaultAccount) { return null; }
|
|
|
|
return (
|
|
<Popup
|
|
wide='very'
|
|
className={ styles.popup }
|
|
trigger={
|
|
<IdentityIcon
|
|
address={ defaultAddress } button
|
|
center
|
|
className={ styles.defaultAccount }
|
|
/>
|
|
}
|
|
content={
|
|
<div>
|
|
<List relaxed='very' selection className={ [styles.list, styles.isDefault, accounts.length > 1 && styles.hasOtherAccounts].join(' ') }>
|
|
<AccountItem
|
|
isDefault
|
|
account={ defaultAccount }
|
|
/>
|
|
</List>
|
|
{accounts.length > 1 &&
|
|
<List relaxed='very' selection className={ styles.list } divided>
|
|
{accounts
|
|
.filter(({ address }) => address !== defaultAddress)
|
|
.map(account => (
|
|
<AccountItem
|
|
key={ account.address }
|
|
account={ account }
|
|
onClick={ this.handleMakeDefault }
|
|
/>
|
|
))}
|
|
</List>
|
|
}
|
|
</div>
|
|
}
|
|
offset={ 13 } // Empirically looks better
|
|
on='click'
|
|
hideOnScroll
|
|
open={ this.state.isOpen }
|
|
onClose={ this.handleClose }
|
|
onOpen={ this.handleOpen }
|
|
position='bottom right'
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default DefaultAccount;
|