aboutsummaryrefslogtreecommitdiff
path: root/extension/pages/confirm-create-reserve.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'extension/pages/confirm-create-reserve.tsx')
-rw-r--r--extension/pages/confirm-create-reserve.tsx305
1 files changed, 0 insertions, 305 deletions
diff --git a/extension/pages/confirm-create-reserve.tsx b/extension/pages/confirm-create-reserve.tsx
deleted file mode 100644
index 224a3e895..000000000
--- a/extension/pages/confirm-create-reserve.tsx
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- 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, If not, see <http://www.gnu.org/licenses/>
- */
-
-/// <reference path="../lib/decl/mithril.d.ts" />
-
-import {amountToPretty, canonicalizeBaseUrl} from "../lib/wallet/helpers";
-import {AmountJson, CreateReserveResponse} from "../lib/wallet/types";
-import m from "mithril";
-import {IMintInfo} from "../lib/wallet/types";
-import {ReserveCreationInfo, Amounts} from "../lib/wallet/types";
-import MithrilComponent = _mithril.MithrilComponent;
-import {Denomination} from "../lib/wallet/types";
-import {getReserveCreationInfo} from "../lib/wallet/wxApi";
-
-"use strict";
-
-/**
- * Execute something after a delay, with the possibility
- * to reset the delay.
- */
-class DelayTimer {
- ms: number;
- f;
- timerId: number = null;
-
- constructor(ms: number, f) {
- this.f = f;
- this.ms = ms;
- }
-
- bump() {
- this.stop();
- const handler = () => {
- this.f();
- };
- this.timerId = window.setTimeout(handler, this.ms);
- }
-
- stop() {
- if (this.timerId !== null) {
- window.clearTimeout(this.timerId);
- }
- }
-}
-
-
-class Controller {
- url = m.prop<string>();
- statusString = null;
- isValidMint = false;
- reserveCreationInfo: ReserveCreationInfo = null;
- private timer: DelayTimer;
- private request: XMLHttpRequest;
- amount: AmountJson;
- callbackUrl: string;
- detailCollapsed = m.prop<boolean>(true);
-
- constructor(initialMintUrl: string, amount: AmountJson, callbackUrl: string) {
- console.log("creating main controller");
- this.amount = amount;
- this.callbackUrl = callbackUrl;
- this.timer = new DelayTimer(800, () => this.update());
- this.url(initialMintUrl);
- this.update();
- }
-
- private update() {
- this.timer.stop();
- const doUpdate = () => {
- if (!this.url()) {
- this.statusString = i18n`Please enter a URL`;
- return;
- }
- this.statusString = null;
- let parsedUrl = URI(this.url());
- if (parsedUrl.is("relative")) {
- this.statusString = i18n`The URL you've entered is not valid (must be absolute)`;
- return;
- }
-
- m.redraw(true);
-
- console.log("doing get mint info");
-
- getReserveCreationInfo(this.url(), this.amount)
- .then((r: ReserveCreationInfo) => {
- console.log("get mint info resolved");
- this.isValidMint = true;
- this.reserveCreationInfo = r;
- console.dir(r);
- this.statusString = "The mint base URL is valid!";
- m.endComputation();
- })
- .catch((e) => {
- console.log("get mint info rejected");
- if (e.hasOwnProperty("httpStatus")) {
- this.statusString = `request failed with status ${this.request.status}`;
- } else {
- this.statusString = `unknown request error`;
- }
- m.endComputation();
- });
- };
-
- doUpdate();
-
-
- console.log("got update");
- }
-
- reset() {
- this.isValidMint = false;
- this.statusString = null;
- this.reserveCreationInfo = null;
- if (this.request) {
- this.request.abort();
- this.request = null;
- }
- }
-
- confirmReserve(mint: string, amount: AmountJson, callback_url: string) {
- const d = {mint, amount};
- const cb = (rawResp) => {
- if (!rawResp) {
- throw Error("empty response");
- }
- if (!rawResp.error) {
- const resp = CreateReserveResponse.checked(rawResp);
- let q = {
- mint: resp.mint,
- reserve_pub: resp.reservePub,
- amount_value: amount.value,
- amount_fraction: amount.fraction,
- amount_currency: amount.currency,
- };
- let url = URI(callback_url).addQuery(q);
- if (!url.is("absolute")) {
- throw Error("callback url is not absolute");
- }
- console.log("going to", url.href());
- document.location.href = url.href();
- } else {
- this.reset();
- this.statusString = (
- `Oops, something went wrong.` +
- `The wallet responded with error status (${rawResp.error}).`);
- }
- };
- chrome.runtime.sendMessage({type: 'create-reserve', detail: d}, cb);
- }
-
- onUrlChanged(url: string) {
- this.reset();
- this.url(url);
- this.timer.bump();
- }
-}
-
-
-function view(ctrl: Controller) {
- let controls = [];
- let mx = (x, ...args) => controls.push(m(x, ...args));
-
- mx("p",
- i18n`The bank wants to create a reserve over ${amountToPretty(
- ctrl.amount)}.`);
- mx("input",
- {
- className: "url",
- type: "text",
- spellcheck: false,
- value: ctrl.url(),
- oninput: m.withAttr("value", ctrl.onUrlChanged.bind(ctrl)),
- });
-
- mx("button", {
- onclick: () => ctrl.confirmReserve(ctrl.url(),
- ctrl.amount,
- ctrl.callbackUrl),
- disabled: !ctrl.isValidMint
- },
- "Confirm exchange selection");
-
- if (ctrl.statusString) {
- mx("p", ctrl.statusString);
- } else {
- mx("p", "Checking URL, please wait ...");
- }
-
- if (ctrl.reserveCreationInfo) {
- let totalCost = Amounts.add(ctrl.reserveCreationInfo.overhead,
- ctrl.reserveCreationInfo.withdrawFee).amount;
- mx("p", `Withdraw cost: ${amountToPretty(totalCost)}`);
- if (ctrl.detailCollapsed()) {
- mx("button.linky", {
- onclick: () => {
- ctrl.detailCollapsed(false);
- }
- }, "show more details");
- } else {
- mx("button.linky", {
- onclick: () => {
- ctrl.detailCollapsed(true);
- }
- }, "hide details");
- mx("div", {}, renderReserveCreationDetails(ctrl.reserveCreationInfo))
- }
- }
-
- return m("div", controls);
-}
-
-
-function renderReserveCreationDetails(rci: ReserveCreationInfo) {
- let denoms = rci.selectedDenoms;
-
- function row(denom: Denomination) {
- return m("tr", [
- m("td", denom.pub_hash.substr(0, 5) + "..."),
- m("td", amountToPretty(denom.value)),
- m("td", amountToPretty(denom.fee_withdraw)),
- m("td", amountToPretty(denom.fee_refresh)),
- m("td", amountToPretty(denom.fee_deposit)),
- ]);
- }
-
- let withdrawFeeStr = amountToPretty(rci.withdrawFee);
- let overheadStr = amountToPretty(rci.overhead);
- return [
- m("p", `Fee for withdrawal: ${withdrawFeeStr}`),
- m("p", `Overhead: ${overheadStr}`),
- m("table", [
- m("tr", [
- m("th", "Key Hash"),
- m("th", "Value"),
- m("th", "Withdraw Fee"),
- m("th", "Refresh Fee"),
- m("th", "Deposit Fee"),
- ]),
- denoms.map(row)
- ])
- ];
-}
-
-
-interface MintProbeResult {
- keyInfo?: any;
-}
-
-function probeMint(mintBaseUrl: string): Promise<MintProbeResult> {
- throw Error("not implemented");
-}
-
-
-function getSuggestedMint(currency: string): Promise<string> {
- // TODO: make this request go to the wallet backend
- // Right now, this is a stub.
- const defaultMint = {
- "KUDOS": "http://exchange.demo.taler.net",
- "PUDOS": "http://exchange.test.taler.net",
- };
-
- let mint = defaultMint[currency];
-
- if (!mint) {
- mint = ""
- }
-
- return Promise.resolve(mint);
-}
-
-
-export function main() {
- const url = URI(document.location.href);
- const query: any = URI.parseQuery(url.query());
- const amount = AmountJson.checked(JSON.parse(query.amount));
- const callback_url = query.callback_url;
- const bank_url = query.bank_url;
-
- getSuggestedMint(amount.currency)
- .then((suggestedMintUrl) => {
- const controller = () => new Controller(suggestedMintUrl, amount, callback_url);
- var MintSelection = {controller, view};
- m.mount(document.getElementById("mint-selection"), MintSelection);
- })
- .catch((e) => {
- // TODO: provide more context information, maybe factor it out into a
- // TODO:generic error reporting function or component.
- document.body.innerText = `Fatal error: "${e.message}".`;
- console.error(`got backend error "${e.message}"`);
- });
-}