diff options
author | Florian Dold <florian.dold@gmail.com> | 2016-11-14 03:54:51 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2016-11-14 03:54:51 +0100 |
commit | ded250e6a5886c469aaa57e35cc8b87b87cb929a (patch) | |
tree | ffe9182a3fb556be5f395f3bfe5167d1e25afc34 /src | |
parent | ce334320363618c6c1ed3d2ae598d49cae98753c (diff) |
fix insufficient funds message (#4768)
We now distinguish the case where the wallet knows the exchange already
and the case where we don't have anything in common.
Diffstat (limited to 'src')
-rw-r--r-- | src/pages/confirm-contract.tsx | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/pages/confirm-contract.tsx b/src/pages/confirm-contract.tsx index 7bae691b1..2beac08f6 100644 --- a/src/pages/confirm-contract.tsx +++ b/src/pages/confirm-contract.tsx @@ -32,12 +32,12 @@ import {getExchanges} from "src/wxApi"; interface DetailState { collapsed: boolean; - exchanges: null|IExchangeInfo[]; } interface DetailProps { contract: Contract collapsed: boolean + exchanges: null|IExchangeInfo[]; } @@ -47,17 +47,9 @@ class Details extends React.Component<DetailProps, DetailState> { console.log("new Details component created"); this.state = { collapsed: props.collapsed, - exchanges: null }; console.log("initial state:", this.state); - - this.update(); - } - - async update() { - let exchanges = await getExchanges(); - this.setState({exchanges} as any); } render() { @@ -85,7 +77,7 @@ class Details extends React.Component<DetailProps, DetailState> { </ul> Exchanges in the wallet: <ul> - {(this.state.exchanges || []).map( + {(this.props.exchanges || []).map( (e: IExchangeInfo) => <li>{`${e.baseUrl}: ${e.masterPublicKey}`}</li>)} </ul> @@ -100,18 +92,20 @@ interface ContractPromptProps { } interface ContractPromptState { - offer: any; + offer: Offer|null; error: string|null; payDisabled: boolean; + exchanges: null|IExchangeInfo[]; } class ContractPrompt extends React.Component<ContractPromptProps, ContractPromptState> { constructor() { super(); this.state = { - offer: undefined, + offer: null, error: null, payDisabled: true, + exchanges: null } } @@ -127,6 +121,8 @@ class ContractPrompt extends React.Component<ContractPromptProps, ContractPrompt let offer = await this.getOffer(); this.setState({offer} as any); this.checkPayment(); + let exchanges = await getExchanges(); + this.setState({exchanges} as any); } getOffer(): Promise<Offer> { @@ -155,7 +151,20 @@ class ContractPrompt extends React.Component<ContractPromptProps, ContractPrompt console.log("check-pay error", JSON.stringify(resp)); switch (resp.error) { case "coins-insufficient": - this.state.error = i18n`You have insufficient funds of the requested currency in your wallet.`; + let msgInsufficient = i18n`You have insufficient funds of the requested currency in your wallet.`; + let msgNoMatch = i18n`You do not have any funds from an exchange that is accepted by this merchant. + None of the exchanges accepted by the merchant is known to your wallet.`; + if (this.state.exchanges && this.state.offer) { + let acceptedExchangePubs = this.state.offer.contract.exchanges.map((e) => e.master_pub); + let ex = this.state.exchanges.find((e) => acceptedExchangePubs.indexOf(e.masterPublicKey) >= 0); + if (ex) { + this.state.error = msgInsufficient; + } else { + this.state.error = msgNoMatch; + } + } else { + this.state.error = msgInsufficient; + } break; default: this.state.error = `Error: ${resp.error}`; @@ -188,7 +197,7 @@ class ContractPrompt extends React.Component<ContractPromptProps, ContractPrompt this.setState({} as any); return; } - let c = d.offer.contract; + let c = d.offer!.contract; console.log("contract", c); document.location.href = substituteFulfillmentUrl(c.fulfillment_url, this.state.offer); @@ -214,7 +223,7 @@ class ContractPrompt extends React.Component<ContractPromptProps, ContractPrompt <div> {(this.state.error ? <p className="errorbox">{this.state.error}</p> : <p />)} </div> - <Details contract={c} collapsed={!this.state.error}/> + <Details exchanges={this.state.exchanges} contract={c} collapsed={!this.state.error}/> </div> ); } |