Skip to content

Commit

Permalink
Make sure transfer asset stays synced fix bitshares#45
Browse files Browse the repository at this point in the history
  • Loading branch information
svk31 committed Feb 1, 2017
1 parent b7a0b2a commit 0f38684
Showing 1 changed file with 74 additions and 33 deletions.
107 changes: 74 additions & 33 deletions web/app/components/Transfer/Transfer.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,30 +54,37 @@ class Transfer extends React.Component {
propose_account: "",
feeAsset: null,
fee_asset_id: "1.3.0"

};
};

componentWillMount() {
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}) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -135,25 +142,53 @@ 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});
} );
}

setNestedRef(ref) {
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,
Expand All @@ -168,14 +203,15 @@ class Transfer extends React.Component {
</span>;
}

let asset_types = [], fee_asset_types = [];
let { asset_types, fee_asset_types } = this._getAvailableAssets();
let balance = null;

// Estimate fee
let globalObject = ChainStore.getObject("2.0.0");
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);
Expand Down Expand Up @@ -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 = (<span style={{borderBottom: "#A09F9F 1px dotted", cursor: "pointer"}} onClick={this._setTotal.bind(this, current_asset_id, account_balances[current_asset_id], fee, feeID)}><Translate component="span" content="transfer.available"/>: <BalanceComponent balance={account_balances[current_asset_id]}/></span>)
balance = (<span style={{borderBottom: "#A09F9F 1px dotted", cursor: "pointer"}} onClick={this._setTotal.bind(this, current_asset_id, account_balances[current_asset_id], fee, feeID)}><Translate component="span" content="transfer.available"/>: <BalanceComponent balance={account_balances[current_asset_id]}/></span>);
} else {
balance = "No funds";
}
Expand All @@ -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 (
Expand All @@ -256,23 +293,27 @@ class Transfer extends React.Component {
</div>
{/* T O */}
<div className="content-block">
<AccountSelector label="transfer.to"
accountName={to_name}
onChange={this.toChanged.bind(this)}
onAccountChanged={this.onToAccountChanged.bind(this)}
account={to_name}
size={60}
tabIndex={tabIndex++}/>
<AccountSelector
label="transfer.to"
accountName={to_name}
onChange={this.toChanged.bind(this)}
onAccountChanged={this.onToAccountChanged.bind(this)}
account={to_name}
size={60}
tabIndex={tabIndex++}
/>
</div>
{/* A M O U N T */}
<div className="content-block transfer-input">
<AmountSelector label="transfer.amount"
amount={amount}
onChange={this.onAmountChanged.bind(this)}
asset={asset_types.length > 0 && asset ? asset.get("id") : ( asset_id ? asset_id : asset_types[0])}
assets={asset_types}
display_balance={balance}
tabIndex={tabIndex++}/>
<AmountSelector
label="transfer.amount"
amount={amount}
onChange={this.onAmountChanged.bind(this)}
asset={asset_types.length > 0 && asset ? asset.get("id") : ( asset_id ? asset_id : asset_types[0])}
assets={asset_types}
display_balance={balance}
tabIndex={tabIndex++}
/>
</div>
{/* M E M O */}
<div className="content-block transfer-input">
Expand Down

0 comments on commit 0f38684

Please sign in to comment.