// Copyright 2015, 2016 Ethcore (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 { LinearProgress, MenuItem, IconMenu } from 'material-ui'; import ReactTooltip from 'react-tooltip'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { confirmOperation, revokeOperation } from '~/redux/providers/walletActions'; import { bytesToHex } from '~/api/util/format'; import { Container, InputAddress, Button, IdentityIcon } from '~/ui'; import TxRow from '~/ui/TxList/TxRow'; import styles from '../wallet.css'; import txListStyles from '~/ui/TxList/txList.css'; class WalletConfirmations extends Component { static contextTypes = { api: PropTypes.object.isRequired }; static propTypes = { accounts: PropTypes.object.isRequired, address: PropTypes.string.isRequired, isTest: PropTypes.bool.isRequired, owners: PropTypes.array.isRequired, require: PropTypes.object.isRequired, confirmOperation: PropTypes.func.isRequired, revokeOperation: PropTypes.func.isRequired, confirmations: PropTypes.array }; static defaultProps = { confirmations: [] }; render () { return (
{ this.renderConfirmations() }
); } renderConfirmations () { const { confirmations, ...others } = this.props; const realConfirmations = confirmations && confirmations .filter((conf) => conf.confirmedBy.length > 0); if (!realConfirmations) { return null; } if (realConfirmations.length === 0) { return (

No transactions needs confirmation right now.

); } return realConfirmations .map((confirmation) => ( )); } } function mapStateToProps (state) { const { accounts } = state.personal; return { accounts }; } function mapDispatchToProps (dispatch) { return bindActionCreators({ confirmOperation, revokeOperation }, dispatch); } export default connect( mapStateToProps, mapDispatchToProps )(WalletConfirmations); class WalletConfirmation extends Component { static propTypes = { accounts: PropTypes.object.isRequired, confirmation: PropTypes.object.isRequired, address: PropTypes.string.isRequired, isTest: PropTypes.bool.isRequired, owners: PropTypes.array.isRequired, require: PropTypes.object.isRequired, confirmOperation: PropTypes.func.isRequired, revokeOperation: PropTypes.func.isRequired }; state = { openConfirm: false, openRevoke: false }; render () { const { confirmation } = this.props; const confirmationsRows = []; const className = styles.light; const txRow = this.renderTransactionRow(confirmation, className); const detailsRow = this.renderConfirmedBy(confirmation, className); const progressRow = this.renderProgress(confirmation, className); const actionsRow = this.renderActions(confirmation, className); confirmationsRows.push(progressRow); confirmationsRows.push(detailsRow); confirmationsRows.push(txRow); confirmationsRows.push(actionsRow); return (
{ confirmationsRows }
{ this.renderPending() }
); } renderPending () { const { pending } = this.props.confirmation; if (!pending) { return null; } return (
); } handleOpenConfirm = () => { this.setState({ openConfirm: true }); } handleCloseConfirm = () => { this.setState({ openConfirm: false }); } handleOpenRevoke = () => { this.setState({ openRevoke: true }); } handleCloseRevoke = () => { this.setState({ openRevoke: false }); } handleConfirm = (e, item) => { const { confirmOperation, confirmation, address } = this.props; const owner = item.props.value; confirmOperation(address, owner, confirmation.operation); } handleRevoke = (e, item) => { const { revokeOperation, confirmation, address } = this.props; const owner = item.props.value; revokeOperation(address, owner, confirmation.operation); } renderActions (confirmation, className) { const { owners, accounts } = this.props; const { operation, confirmedBy, pending } = confirmation; const { openConfirm, openRevoke } = this.state; const addresses = Object.keys(accounts); const possibleConfirm = owners .filter((owner) => addresses.includes(owner)) .filter((owner) => !confirmedBy.includes(owner)); const possibleRevoke = owners .filter((owner) => addresses.includes(owner)) .filter((owner) => confirmedBy.includes(owner)); const confirmButton = (