// 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 BigNumber from 'bignumber.js'; import React, { Component, PropTypes } from 'react'; import Chip from 'material-ui/Chip'; import LinearProgress from 'material-ui/LinearProgress'; import { Card, CardActions, CardTitle, CardText } from 'material-ui/Card'; import { Button, Input } from '../../../ui'; import styles from './queries.css'; export default class InputQuery extends Component { static contextTypes = { api: PropTypes.object } static propTypes = { contract: PropTypes.object.isRequired, inputs: PropTypes.array.isRequired, outputs: PropTypes.array.isRequired, name: PropTypes.string.isRequired, className: PropTypes.string } state = { isValid: true, results: [], values: {} } render () { const { name, className } = this.props; return ( { this.renderContent() } ); } renderContent () { const { inputs } = this.props; const { isValid } = this.state; const inputsFields = inputs .map(input => this.renderInput(input)); return (
{ this.renderResults() }
{ inputsFields }
); } renderResults () { const { results, isLoading } = this.state; const { outputs } = this.props; if (isLoading) { return (); } if (!results || results.length < 1) return null; return outputs .map((out, index) => ({ name: out.name, value: results[index], display: this.renderValue(results[index]) })) .sort((outA, outB) => outA.display.length - outB.display.length) .map((out, index) => (
{ out.name }
{ out.display }
)); } renderInput (input) { const { name, type } = input; const label = `${name ? `${name}: ` : ''}${type}`; const onChange = (event) => { const value = event.target.value; const { values } = this.state; this.setState({ values: { ...values, [ name ]: value } }); }; return (
); } renderValue (value) { if (!value) return 'no data'; const { api } = this.context; if (api.util.isInstanceOf(value, BigNumber)) { return value.toFormat(0); } else if (api.util.isArray(value)) { return api.util.bytesToHex(value); } return value.toString(); } onClick = () => { const { values } = this.state; const { inputs, contract, name, outputs } = this.props; this.setState({ isLoading: true, results: [] }); const inputValues = inputs.map(input => values[input.name]); contract .instance[name] .call({}, inputValues) .then(results => { if (outputs.length === 1) { results = [ results ]; } this.setState({ isLoading: false, results }); }) .catch(e => { console.error(`sending ${name} with params`, inputValues, e); }); }; }