From bd65bb67e25a79b019d745b7262b2008ce2adb15 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 16 Nov 2016 01:59:39 +0100 Subject: incrementally verify denoms The denominations are not stored in a separate object store. --- src/pages/confirm-create-reserve.tsx | 29 +++++++++++--------- src/pages/tree.tsx | 51 ++++++++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 26 deletions(-) (limited to 'src/pages') diff --git a/src/pages/confirm-create-reserve.tsx b/src/pages/confirm-create-reserve.tsx index 372f11a4b..963bd0697 100644 --- a/src/pages/confirm-create-reserve.tsx +++ b/src/pages/confirm-create-reserve.tsx @@ -26,7 +26,7 @@ import {amountToPretty, canonicalizeBaseUrl} from "src/helpers"; import { AmountJson, CreateReserveResponse, ReserveCreationInfo, Amounts, - Denomination, + Denomination, DenominationRecord, } from "src/types"; import {getReserveCreationInfo} from "src/wxApi"; import {ImplicitStateComponent, StateHolder} from "src/components"; @@ -74,25 +74,25 @@ function renderReserveCreationDetails(rci: ReserveCreationInfo|null) { let denoms = rci.selectedDenoms; let countByPub: {[s: string]: number} = {}; - let uniq: Denomination[] = []; + let uniq: DenominationRecord[] = []; - denoms.forEach((x: Denomination) => { - let c = countByPub[x.denom_pub] || 0; + denoms.forEach((x: DenominationRecord) => { + let c = countByPub[x.denomPub] || 0; if (c == 0) { uniq.push(x); } c += 1; - countByPub[x.denom_pub] = c; + countByPub[x.denomPub] = c; }); - function row(denom: Denomination) { + function row(denom: DenominationRecord) { return ( - {countByPub[denom.denom_pub] + "x"} + {countByPub[denom.denomPub] + "x"} {amountToPretty(denom.value)} - {amountToPretty(denom.fee_withdraw)} - {amountToPretty(denom.fee_refresh)} - {amountToPretty(denom.fee_deposit)} + {amountToPretty(denom.feeWithdraw)} + {amountToPretty(denom.feeRefresh)} + {amountToPretty(denom.feeDeposit)} ); } @@ -274,6 +274,7 @@ class ExchangeSelection extends ImplicitStateComponent { this.reserveCreationInfo(null); if (!this.url()) { this.statusString(i18n`Error: URL is empty`); + this.detailCollapsed(false); return; } @@ -285,7 +286,8 @@ class ExchangeSelection extends ImplicitStateComponent { } try { - let r = await getReserveCreationInfo(this.url()!, + let url = canonicalizeBaseUrl(this.url()!); + let r = await getReserveCreationInfo(url, this.props.amount); console.log("get exchange info resolved"); this.reserveCreationInfo(r); @@ -294,9 +296,11 @@ class ExchangeSelection extends ImplicitStateComponent { console.log("get exchange info rejected"); if (e.hasOwnProperty("httpStatus")) { this.statusString(`Error: request failed with status ${e.httpStatus}`); + this.detailCollapsed(false); } else if (e.hasOwnProperty("errorResponse")) { let resp = e.errorResponse; this.statusString(`Error: ${resp.error} (${resp.hint})`); + this.detailCollapsed(false); } } } @@ -310,7 +314,7 @@ class ExchangeSelection extends ImplicitStateComponent { exchange: string, amount: AmountJson, callback_url: string) { - const d = {exchange, amount}; + const d = {exchange: canonicalizeBaseUrl(exchange), amount}; const cb = (rawResp: any) => { if (!rawResp) { throw Error("empty response"); @@ -338,6 +342,7 @@ class ExchangeSelection extends ImplicitStateComponent { this.statusString( `Oops, something went wrong.` + `The wallet responded with error status (${rawResp.error}).`); + this.detailCollapsed(false); } }; chrome.runtime.sendMessage({type: 'create-reserve', detail: d}, cb); diff --git a/src/pages/tree.tsx b/src/pages/tree.tsx index daabdaf49..58eb82c3f 100644 --- a/src/pages/tree.tsx +++ b/src/pages/tree.tsx @@ -21,12 +21,12 @@ */ -import { ExchangeRecord } from "src/types"; +import {ExchangeRecord, DenominationRecord} from "src/types"; import { ReserveRecord, CoinRecord, PreCoinRecord, Denomination } from "src/types"; import { ImplicitStateComponent, StateHolder } from "src/components"; import { getReserves, getExchanges, getCoins, getPreCoins, - refresh + refresh, getDenoms } from "src/wxApi"; import { prettyAmount, abbrev } from "src/renderHtml"; import { getTalerStampDate } from "src/helpers"; @@ -272,33 +272,56 @@ class ExpanderText extends ImplicitStateComponent { class DenominationList extends ImplicitStateComponent { expanded = this.makeState(false); + denoms = this.makeState(undefined); - renderDenom(d: Denomination) { + constructor(props: DenominationListProps) { + super(props); + this.update(); + } + + async update() { + let d = await getDenoms(this.props.exchange.baseUrl); + this.denoms(d); + } + + renderDenom(d: DenominationRecord) { return (
  • Value: {prettyAmount(d.value)}
  • -
  • Withdraw fee: {prettyAmount(d.fee_withdraw)}
  • -
  • Refresh fee: {prettyAmount(d.fee_refresh)}
  • -
  • Deposit fee: {prettyAmount(d.fee_deposit)}
  • -
  • Refund fee: {prettyAmount(d.fee_refund)}
  • -
  • Start: {getTalerStampDate(d.stamp_start)!.toString()}
  • -
  • Withdraw expiration: {getTalerStampDate(d.stamp_expire_withdraw)!.toString()}
  • -
  • Legal expiration: {getTalerStampDate(d.stamp_expire_legal)!.toString()}
  • -
  • Deposit expiration: {getTalerStampDate(d.stamp_expire_deposit)!.toString()}
  • -
  • Denom pub:
  • +
  • Withdraw fee: {prettyAmount(d.feeWithdraw)}
  • +
  • Refresh fee: {prettyAmount(d.feeRefresh)}
  • +
  • Deposit fee: {prettyAmount(d.feeDeposit)}
  • +
  • Refund fee: {prettyAmount(d.feeRefund)}
  • +
  • Start: {getTalerStampDate(d.stampStart)!.toString()}
  • +
  • Withdraw expiration: {getTalerStampDate(d.stampExpireWithdraw)!.toString()}
  • +
  • Legal expiration: {getTalerStampDate(d.stampExpireLegal)!.toString()}
  • +
  • Deposit expiration: {getTalerStampDate(d.stampExpireDeposit)!.toString()}
  • +
  • Denom pub:
); } render(): JSX.Element { + let denoms = this.denoms() + if (!denoms) { + return ( +
+ Denominations (...) + {" "} + + ... + +
+ ); + } return (
- Denominations ({this.props.exchange.active_denoms.length.toString()}) + Denominations ({denoms.length.toString()}) {" "} - {this.props.exchange.active_denoms.map((d) => this.renderDenom(d))} + {denoms.map((d) => this.renderDenom(d))}
); -- cgit v1.2.3