/*
This file is part of TALER
(C) 2015-2016 GNUnet e.V.
TALER 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, or (at your option) any later version.
TALER 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
TALER; see the file COPYING. If not, see
*/
/**
* Page shown to the user to confirm creation
* of a reserve, usually requested by the bank.
*
* @author Florian Dold
*/
import {amountToPretty, canonicalizeBaseUrl} from "../lib/wallet/helpers";
import {AmountJson, CreateReserveResponse} from "../lib/wallet/types";
import {ReserveCreationInfo, Amounts} from "../lib/wallet/types";
import {Denomination} from "../lib/wallet/types";
import {getReserveCreationInfo} from "../lib/wallet/wxApi";
"use strict";
let h = preact.h;
function delay(delayMs: number, value: T): Promise {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(value), delayMs);
});
}
class EventTrigger {
triggerResolve: any;
triggerPromise: Promise;
constructor() {
this.reset();
}
private reset() {
this.triggerPromise = new Promise((resolve, reject) => {
this.triggerResolve = resolve;
});
}
trigger() {
this.triggerResolve(false);
this.reset();
}
async wait(delayMs: number): Promise {
return await Promise.race([this.triggerPromise, delay(delayMs, true)]);
}
}
interface StateHolder {
(): T;
(newState: T): void;
}
/**
* Component that doesn't hold its state in one object,
* but has multiple state holders.
*/
abstract class ImplicitStateComponent extends preact.Component {
makeState(initial: StateType): StateHolder {
let state: StateType = initial;
return (s?: StateType): StateType => {
if (s !== undefined) {
state = s;
// In preact, this will always schedule a (debounced) redraw
this.setState({} as any);
}
return state;
};
}
}
function renderReserveCreationDetails(rci: ReserveCreationInfo|null) {
if (!rci) {
return
Details will be displayed when a valid exchange provider URL is entered.
}
let denoms = rci.selectedDenoms;
let countByPub: {[s: string]: number} = {};
let uniq: Denomination[] = [];
denoms.forEach((x: Denomination) => {
let c = countByPub[x.denom_pub] || 0;
if (c == 0) {
uniq.push(x);
}
c += 1;
countByPub[x.denom_pub] = c;
});
function row(denom: Denomination) {
return (
{countByPub[denom.denom_pub] + "x"}
{amountToPretty(denom.value)}
{amountToPretty(denom.fee_withdraw)}
{amountToPretty(denom.fee_refresh)}
{amountToPretty(denom.fee_deposit)}
);
}
let withdrawFeeStr = amountToPretty(rci.withdrawFee);
let overheadStr = amountToPretty(rci.overhead);
return (
{`Withdrawal fees: ${withdrawFeeStr}`}
{`Rounding loss: ${overheadStr}`}
# Coins
Value
Withdraw Fee
Refresh Fee
Deposit fee
{uniq.map(row)}
);
}
function getSuggestedExchange(currency: string): Promise {
// TODO: make this request go to the wallet backend
// Right now, this is a stub.
const defaultExchange: {[s: string]: string} = {
"KUDOS": "https://exchange.demo.taler.net",
"PUDOS": "https://exchange.test.taler.net",
};
let exchange = defaultExchange[currency];
if (!exchange) {
exchange = ""
}
return Promise.resolve(exchange);
}
function WithdrawFee(props: {reserveCreationInfo: ReserveCreationInfo|null}): JSX.Element {
if (props.reserveCreationInfo) {
let {overhead, withdrawFee} = props.reserveCreationInfo;
let totalCost = Amounts.add(overhead, withdrawFee).amount;
return