// 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 { AddressSelect, Checkbox, Dropdown, Form, Input, TypedInput } from '@parity/ui'; import styles from '../executeContract.css'; const CHECK_STYLE = { position: 'absolute', top: '38px', left: '1em' }; export default class DetailsStep extends Component { static propTypes = { advancedOptions: PropTypes.bool, accounts: PropTypes.object.isRequired, amount: PropTypes.string, amountError: PropTypes.string, contract: PropTypes.object.isRequired, fromAddress: PropTypes.string, fromAddressError: PropTypes.string, func: PropTypes.object, funcError: PropTypes.string, onAdvancedClick: PropTypes.func, onAmountChange: PropTypes.func.isRequired, onFromAddressChange: PropTypes.func.isRequired, onFuncChange: PropTypes.func, onValueChange: PropTypes.func.isRequired, values: PropTypes.array.isRequired, valuesError: PropTypes.array.isRequired, warning: PropTypes.string } render () { const { accounts, advancedOptions, amount, amountError, fromAddress, fromAddressError, onAdvancedClick, onAmountChange, onFromAddressChange } = this.props; return (
} label={ } onChange={ onFromAddressChange } value={ fromAddress } /> { this.renderFunctionSelect() } { this.renderParameters() }
} label={ } onSubmit={ onAmountChange } value={ amount } />
} onClick={ onAdvancedClick } style={ CHECK_STYLE } />
); } renderFunctionSelect () { const { func, funcError, contract } = this.props; if (!func) { return null; } const functions = contract.functions .filter((func) => !func.constant) .sort((a, b) => (a.name || '').localeCompare(b.name || '')) .map((func) => { const params = (func.abi.inputs || []).map((input, index) => { return ( { index ? ', ' : '' } { input.name }: { input.type } ); }); const name = (
{ func.name } ( { params } )
); return { key: func.signature, text: func.name || '()', value: func.signature, content: name }; }); return ( } label={ } onChange={ this.onFuncChange } value={ func.signature } options={ functions } /> ); } renderParameters () { const { accounts, func, values, valuesError, onValueChange } = this.props; if (!func) { return null; } return (func.abi.inputs || []).map((input, index) => { const onChange = (event, value) => onValueChange(null, index, value); const label = `${input.name}: ${input.type}`; return (
); }); } onFuncChange = (event, signature) => { const { contract, onFuncChange } = this.props; onFuncChange(event, contract.functions.find((fn) => fn.signature === signature)); } }