diff --git a/web/app/components/Transfer/Transfer.jsx b/web/app/components/Transfer/Transfer.jsx index 384e3409c6..8f0afeb039 100644 --- a/web/app/components/Transfer/Transfer.jsx +++ b/web/app/components/Transfer/Transfer.jsx @@ -54,7 +54,6 @@ class Transfer extends React.Component { propose_account: "", feeAsset: null, fee_asset_id: "1.3.0" - }; }; @@ -62,22 +61,30 @@ class Transfer extends React.Component { this.nestedRef = null; } + shouldComponentUpdate(np, ns) { + let { asset_types: current_types } = this._getAvailableAssets(); + let { asset_types } = this._getAvailableAssets(ns); + + if (asset_types.length === 1 && current_types.length !== 1) { + this.onAmountChanged({amount: ns.amount, asset: ChainStore.getAsset(asset_types[0])}); + } + return true; + } + fromChanged(from_name) { - let asset = undefined - let amount = undefined - this.setState({from_name, error: null, propose: false, propose_account: ""}) + this.setState({from_name, error: null, propose: false, propose_account: ""}); } toChanged(to_name) { - this.setState({to_name, error: null}) + this.setState({to_name, error: null}); } onFromAccountChanged(from_account) { - this.setState({from_account, error: null}) + this.setState({from_account, error: null}); } onToAccountChanged(to_account) { - this.setState({to_account, error: null}) + this.setState({to_account, error: null}); } onAmountChanged({amount, asset}) { @@ -87,8 +94,8 @@ class Transfer extends React.Component { this.setState({amount, asset, asset_id: asset.get("id"), error: null}); } - onFeeChanged({amount, asset}) { - this.setState({feeAsset: asset, error: null}) + onFeeChanged({asset}) { + this.setState({feeAsset: asset, error: null}); } onMemoChanged(e) { @@ -107,8 +114,8 @@ class Transfer extends React.Component { } onPropose(propose, e) { - e.preventDefault() - this.setState({ propose, propose_account: null }) + e.preventDefault(); + this.setState({ propose, propose_account: null }); } onProposeAccount(propose_account) { @@ -135,8 +142,8 @@ class Transfer extends React.Component { TransactionConfirmStore.listen(this.onTrxIncluded); }).catch( e => { let msg = e.message ? e.message.split( '\n' )[1] : null; - console.log( "error: ", e, msg) - this.setState({error: msg}) + console.log( "error: ", e, msg); + this.setState({error: msg}); } ); } @@ -144,16 +151,44 @@ class Transfer extends React.Component { this.nestedRef = ref; } - _setTotal(asset_id, balance_id, fee, fee_asset_id, e) { + _setTotal(asset_id, balance_id, fee, fee_asset_id) { let balanceObject = ChainStore.getObject(balance_id); let transferAsset = ChainStore.getObject(asset_id); - let feeAsset = ChainStore.getObject(fee_asset_id); if (balanceObject) { let amount = (utils.get_asset_amount(balanceObject.get("balance"), transferAsset) - (asset_id === fee_asset_id ? fee : 0)).toString(); this.setState({amount}); } } + _getAvailableAssets(state = this.state) { + const { from_account, from_error } = state; + let asset_types = [], fee_asset_types = []; + if (!(from_account && from_account.get("balances") && !from_error)) { + return {asset_types, fee_asset_types}; + } + let account_balances = state.from_account.get("balances").toJS(); + asset_types = Object.keys(account_balances).sort(utils.sortID); + fee_asset_types = Object.keys(account_balances).sort(utils.sortID); + for (let key in account_balances) { + let asset = ChainStore.getObject(key); + let balanceObject = ChainStore.getObject(account_balances[key]); + if (balanceObject && balanceObject.get("balance") === 0) { + asset_types.splice(asset_types.indexOf(key), 1); + if (fee_asset_types.indexOf(key) !== -1) { + fee_asset_types.splice(fee_asset_types.indexOf(key), 1); + } + } + + if (asset) { + if (asset.get("id") !== "1.3.0" && !utils.isValidPrice(asset.getIn(["options", "core_exchange_rate"]))) { + fee_asset_types.splice(fee_asset_types.indexOf(key), 1); + } + } + } + + return {asset_types, fee_asset_types}; + } + render() { let from_error = null; let {propose, from_account, to_account, asset, asset_id, propose_account, @@ -168,7 +203,7 @@ class Transfer extends React.Component { ; } - let asset_types = [], fee_asset_types = []; + let { asset_types, fee_asset_types } = this._getAvailableAssets(); let balance = null; // Estimate fee @@ -176,6 +211,7 @@ class Transfer extends React.Component { let fee = utils.estimateFee(propose ? "proposal_create" : "transfer", null, globalObject); if (from_account && from_account.get("balances") && !from_error) { + let account_balances = from_account.get("balances").toJS(); asset_types = Object.keys(account_balances).sort(utils.sortID); fee_asset_types = Object.keys(account_balances).sort(utils.sortID); @@ -211,10 +247,11 @@ class Transfer extends React.Component { fee = utils.limitByPrecision(utils.get_asset_amount(fee, feeAsset || core), feeAsset ? feeAsset.get("precision") : core.get("precision")); } + if (asset_types.length === 1) asset = ChainStore.getAsset(asset_types[0]); if (asset_types.length > 0) { let current_asset_id = asset ? asset.get("id") : asset_types[0]; let feeID = feeAsset ? feeAsset.get("id") : "1.3.0"; - balance = (: ) + balance = (: ); } else { balance = "No funds"; } @@ -226,13 +263,13 @@ class Transfer extends React.Component { } } - let propose_incomplete = propose && ! propose_account + let propose_incomplete = propose && ! propose_account; let submitButtonClass = "button"; if(!from_account || !to_account || !amount || amount === "0"|| !asset || from_error || propose_incomplete) submitButtonClass += " disabled"; let accountsList = Immutable.Set(); - accountsList = accountsList.add(from_account) + accountsList = accountsList.add(from_account); let tabIndex = 1; return ( @@ -256,23 +293,27 @@ class Transfer extends React.Component { {/* T O */}
- +
{/* A M O U N T */}
- 0 && asset ? asset.get("id") : ( asset_id ? asset_id : asset_types[0])} - assets={asset_types} - display_balance={balance} - tabIndex={tabIndex++}/> + 0 && asset ? asset.get("id") : ( asset_id ? asset_id : asset_types[0])} + assets={asset_types} + display_balance={balance} + tabIndex={tabIndex++} + />
{/* M E M O */}