// 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 } from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; import ReactDOM from 'react-dom'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { hideRequest } from '@parity/shared/lib/redux/providers/requestsActions'; import MethodDecoding from '@parity/ui/lib/MethodDecoding'; import IdentityIcon from '@parity/ui/lib/IdentityIcon'; import Progress from '@parity/ui/lib/Progress'; import ScrollableText from '@parity/ui/lib/ScrollableText'; import ShortenedHash from '@parity/ui/lib/ShortenedHash'; import styles from './requests.css'; const ERROR_STATE = 'ERROR_STATE'; const DONE_STATE = 'DONE_STATE'; const WAITING_STATE = 'WAITING_STATE'; class Requests extends Component { static propTypes = { requests: PropTypes.object.isRequired, onHideRequest: PropTypes.func.isRequired }; state = { extras: {} }; render () { const { requests } = this.props; const { extras } = this.state; return (
{ Object .values(requests) .map((request) => this.renderRequest(request, extras[request.requestId])) }
); } renderRequest (request, extras = {}) { const { show, transaction } = request; if (!transaction) { return null; } const status = this.renderStatus(request); if (!status) { return null; } const state = this.getTransactionState(request); const displayedTransaction = { ...transaction }; // Don't show gas and gasPrice delete displayedTransaction.gas; delete displayedTransaction.gasPrice; const requestClasses = [ styles.request ]; const statusClasses = [ styles.status ]; const requestStyle = {}; const handleHideRequest = () => { this.handleHideRequest(request.requestId); }; if (state.type === ERROR_STATE) { statusClasses.push(styles.error); } if (!show) { requestClasses.push(styles.hide); } // Set the Request height (for animation) if found if (extras.height) { requestStyle.height = extras.height; } return (
{ status }
{ state.type === ERROR_STATE ? null : ( ) }
); } renderStatus (request) { const { error, transactionHash, transactionReceipt } = request; if (error) { return (
); } if (transactionReceipt) { return ( ); } if (transactionHash) { return (
); } return null; } getTransactionState (request) { const { error, transactionReceipt } = request; if (error) { return { type: ERROR_STATE }; } if (transactionReceipt) { return { type: DONE_STATE }; } return { type: WAITING_STATE }; } handleHideRequest = (requestId) => { const requestElement = ReactDOM.findDOMNode(this.refs[`request_${requestId}`]); // Try to get the request element height, to have a nice transition effect if (requestElement) { const { height } = requestElement.getBoundingClientRect(); const prevExtras = this.state.extras; const nextExtras = { ...prevExtras, [ requestId ]: { ...prevExtras[requestId], height } }; return this.setState({ extras: nextExtras }, () => { return this.props.onHideRequest(requestId); }); } return this.props.onHideRequest(requestId); } } const mapStateToProps = (state) => { const { requests } = state; return { requests }; }; function mapDispatchToProps (dispatch) { return bindActionCreators({ onHideRequest: hideRequest }, dispatch); } export default connect( mapStateToProps, mapDispatchToProps )(Requests);