/*
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 { canonicalizeBaseUrl } from "../../helpers";
import * as i18n from "../../i18n";
import { AmountJson } from "../../amounts";
import * as Amounts from "../../amounts";
import {
CurrencyRecord,
} from "../../dbTypes";
import {
CreateReserveResponse,
ReserveCreationInfo,
} from "../../walletTypes";
import { ImplicitStateComponent, StateHolder } from "../components";
import {
WalletApiError,
createReserve,
getCurrency,
getExchangeInfo,
getReserveCreationInfo,
} from "../wxApi";
import {
WithdrawDetailView,
renderAmount,
} from "../renderHtml";
import * as React from "react";
import * as ReactDOM from "react-dom";
import URI = require("urijs");
function delay(delayMs: number, value: T): Promise {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(value), delayMs);
});
}
class EventTrigger {
private triggerResolve: any;
private 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 ExchangeSelectionProps {
suggestedExchangeUrl: string;
amount: AmountJson;
callback_url: string;
wt_types: string[];
currencyRecord: CurrencyRecord|null;
sender_wire: object | undefined;
}
interface ManualSelectionProps {
onSelect(url: string): void;
initialUrl: string;
}
class ManualSelection extends ImplicitStateComponent {
private url: StateHolder = this.makeState("");
private errorMessage: StateHolder = this.makeState(null);
private isOkay: StateHolder = this.makeState(false);
private updateEvent = new EventTrigger();
constructor(p: ManualSelectionProps) {
super(p);
this.url(p.initialUrl);
this.update();
}
render() {
return (