diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-01 04:05:16 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-01 04:05:16 +0200 |
commit | 4c03a1200eb947a0ed13f78b46fd670601b8cb80 (patch) | |
tree | 16c64421a72000ab19f939ffe492519b013fbafc /src/pages | |
parent | bb6d8317a5ff672fccdb0a35e55077521827a48d (diff) |
implement payback (with rudimentary UI)
Diffstat (limited to 'src/pages')
-rw-r--r-- | src/pages/payback.html | 37 | ||||
-rw-r--r-- | src/pages/payback.tsx | 99 | ||||
-rw-r--r-- | src/pages/popup.tsx | 7 |
3 files changed, 143 insertions, 0 deletions
diff --git a/src/pages/payback.html b/src/pages/payback.html new file mode 100644 index 000000000..d7b913eec --- /dev/null +++ b/src/pages/payback.html @@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html> + +<head> + <meta charset="UTF-8"> + <title>Taler Wallet: Payback</title> + + <link rel="stylesheet" type="text/css" href="../style/lang.css"> + <link rel="stylesheet" type="text/css" href="../style/wallet.css"> + + <link rel="icon" href="/img/icon.png"> + + <script src="/dist/page-common-bundle.js"></script> + <script src="/dist/payback-bundle.js"></script> + + <style> + body { + font-size: 100%; + } + .tree-item { + margin: 2em; + border-radius: 5px; + border: 1px solid gray; + padding: 1em; + } + .button-linky { + background: none; + color: black; + text-decoration: underline; + border: none; + } + </style> + + <body> + <div id="container"></div> + </body> +</html> diff --git a/src/pages/payback.tsx b/src/pages/payback.tsx new file mode 100644 index 000000000..9e463d4a0 --- /dev/null +++ b/src/pages/payback.tsx @@ -0,0 +1,99 @@ +/* + This file is part of TALER + (C) 2017 Inria + + 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 <http://www.gnu.org/licenses/> + */ + +/** + * View and edit auditors. + * + * @author Florian Dold + */ + + +import { + ExchangeRecord, + ExchangeForCurrencyRecord, + DenominationRecord, + AuditorRecord, + CurrencyRecord, + ReserveRecord, + CoinRecord, + PreCoinRecord, + Denomination, + WalletBalance, +} from "../types"; +import { ImplicitStateComponent, StateHolder } from "../components"; +import { + getCurrencies, + updateCurrency, + getPaybackReserves, + withdrawPaybackReserve, +} from "../wxApi"; +import { prettyAmount } from "../renderHtml"; +import { getTalerStampDate } from "../helpers"; +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +class Payback extends ImplicitStateComponent<any> { + reserves: StateHolder<ReserveRecord[]|null> = this.makeState(null); + constructor() { + super(); + let port = chrome.runtime.connect(); + port.onMessage.addListener((msg: any) => { + if (msg.notify) { + console.log("got notified"); + this.update(); + } + }); + this.update(); + } + + async update() { + let reserves = await getPaybackReserves(); + this.reserves(reserves); + } + + withdrawPayback(pub: string) { + withdrawPaybackReserve(pub); + } + + render(): JSX.Element { + let reserves = this.reserves(); + if (!reserves) { + return <span>loading ...</span>; + } + if (reserves.length == 0) { + return <span>No reserves with payback available.</span>; + } + return ( + <div> + {reserves.map(r => ( + <div> + <h2>Reserve for ${prettyAmount(r.current_amount!)}</h2> + <ul> + <li>Exchange: ${r.exchange_base_url}</li> + </ul> + <button onClick={() => this.withdrawPayback(r.reserve_pub)}>Withdraw again</button> + </div> + ))} + </div> + ); + } +} + +export function main() { + ReactDOM.render(<Payback />, document.getElementById("container")!); +} + +document.addEventListener("DOMContentLoaded", main); diff --git a/src/pages/popup.tsx b/src/pages/popup.tsx index fc6d39a0a..9b375097f 100644 --- a/src/pages/popup.tsx +++ b/src/pages/popup.tsx @@ -299,8 +299,12 @@ class WalletBalanceView extends React.Component<any, any> { return <span></span>; } console.log(wallet); + let paybackAvailable = false; let listing = Object.keys(wallet).map((key) => { let entry: WalletBalanceEntry = wallet[key]; + if (entry.paybackAmount.value != 0 || entry.paybackAmount.fraction != 0) { + paybackAvailable = true; + } return ( <p> {bigAmount(entry.available)} @@ -311,9 +315,12 @@ class WalletBalanceView extends React.Component<any, any> { }); let link = chrome.extension.getURL("/src/pages/auditors.html"); let linkElem = <a className="actionLink" href={link} target="_blank">Trusted Auditors and Exchanges</a>; + let paybackLink = chrome.extension.getURL("/src/pages/payback.html"); + let paybackLinkElem = <a className="actionLink" href={link} target="_blank">Trusted Auditors and Exchanges</a>; return ( <div> {listing.length > 0 ? listing : this.renderEmpty()} + {paybackAvailable && paybackLinkElem} {linkElem} </div> ); |