// 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 . import React, { Component, PropTypes } from 'react'; import { FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; import { observer } from 'mobx-react'; import { pick } from 'lodash'; import { BusyStep, AddressSelect, Button, Form, TypedInput, Input, InputAddress, Portal, TxHash } from '~/ui'; import { CancelIcon, DoneIcon, NextIcon } from '~/ui/Icons'; import { fromWei } from '~/api/util/wei'; import WalletSettingsStore from './walletSettingsStore.js'; import styles from './walletSettings.css'; @observer class WalletSettings extends Component { static contextTypes = { api: PropTypes.object.isRequired }; static propTypes = { accountsInfo: PropTypes.object.isRequired, wallet: PropTypes.object.isRequired, onClose: PropTypes.func.isRequired, senders: PropTypes.object.isRequired }; store = new WalletSettingsStore(this.context.api, this.props.wallet); render () { const { stage, steps, waiting, rejected } = this.store; if (rejected) { return ( } actions={ this.renderDialogActions() } > } state={ } /> ); } return ( step.title) } > { this.renderPage() } ); } renderPage () { const { step } = this.store; switch (step) { case 'SENDING': return ( { this.store.requests.map((req) => { const key = req.id; if (req.txhash) { return ( ); } if (req.rejected) { return (

); } }) }
); case 'CONFIRMATION': const { changes } = this.store; return (
{ this.renderChanges(changes) }
); default: case 'EDIT': const { errors, fromString, wallet } = this.store; const { accountsInfo, senders } = this.props; return (

} onChange={ this.store.onModificationsStringChange } /> } hint={ } value={ wallet.sender } error={ errors.sender } onChange={ this.store.onSenderChange } accounts={ senders } />
{ fromString ? null : (
} value={ wallet.owners.slice() } onChange={ this.store.onOwnersChange } accounts={ accountsInfo } param='address[]' />
} hint={ } error={ errors.require } min={ 1 } onChange={ this.store.onRequireChange } max={ wallet.owners.length } param='uint' value={ wallet.require } /> } hint={ } value={ wallet.dailylimit } error={ errors.dailylimit } onChange={ this.store.onDailylimitChange } param='uint' isEth />
) } ); } } renderChanges (changes) { if (changes.length === 0) { return (

); } const modifications = changes.map((change, index) => (
{ this.renderChange(change) }
)); return (

{ modifications }
); } renderChange (change) { const { accountsInfo } = this.props; switch (change.type) { case 'dailylimit': return (
Change Daily Limit
from { fromWei(change.initial).toFormat() } to { fromWei(change.value).toFormat() }
); case 'require': return (
change.initial.toNumber(), to: change.value.toNumber() } } />
); case 'add_owner': return (
); case 'remove_owner': return (
); } } renderDialogActions () { const { step, hasErrors, rejected, onNext, send, done } = this.store; const cancelBtn = (