/* This file is part of TALER (C) 2016 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 */ /** * Show contents of the wallet as a tree. * * @author Florian Dold */ import { getTalerStampDate } from "../../helpers"; import { CoinRecord, CoinStatus, DenominationRecord, ExchangeRecord, PreCoinRecord, ReserveRecord, } from "../../types"; import { ImplicitStateComponent, StateHolder } from "../components"; import { getCoins, getDenoms, getExchanges, getPreCoins, getReserves, payback, refresh, } from "../wxApi"; import { ExpanderText, renderAmount } from "../renderHtml"; import * as React from "react"; import * as ReactDOM from "react-dom"; interface ReserveViewProps { reserve: ReserveRecord; } class ReserveView extends React.Component { render(): JSX.Element { const r: ReserveRecord = this.props.reserve; return (
  • Key: {r.reserve_pub}
  • Created: {(new Date(r.created * 1000).toString())}
  • Current: {r.current_amount ? renderAmount(r.current_amount!) : "null"}
  • Requested: {renderAmount(r.requested_amount)}
  • Confirmed: {r.timestamp_confirmed}
); } } interface ReserveListProps { exchangeBaseUrl: string; } interface ToggleProps { expanded: StateHolder; } class Toggle extends ImplicitStateComponent { renderButton() { const show = () => { this.props.expanded(true); this.setState({}); }; const hide = () => { this.props.expanded(false); this.setState({}); }; if (this.props.expanded()) { return ; } return ; } render() { return (
{this.renderButton()} {this.props.expanded() ? this.props.children : []}
); } } interface CoinViewProps { coin: CoinRecord; } interface RefreshDialogProps { coin: CoinRecord; } class RefreshDialog extends ImplicitStateComponent { private refreshRequested = this.makeState(false); render(): JSX.Element { if (!this.refreshRequested()) { return (
); } return (
Refresh amount:
); } } class CoinView extends React.Component { render() { const c = this.props.coin; return (
  • Key: {c.coinPub}
  • Current amount: {renderAmount(c.currentAmount)}
  • Denomination:
  • Suspended: {(c.suspended || false).toString()}
  • Status: {CoinStatus[c.status]}
); } } interface PreCoinViewProps { precoin: PreCoinRecord; } class PreCoinView extends React.Component { render() { const c = this.props.precoin; return (
  • Key: {c.coinPub}
); } } interface CoinListProps { exchangeBaseUrl: string; } class CoinList extends ImplicitStateComponent { private coins = this.makeState(null); private expanded = this.makeState(false); constructor(props: CoinListProps) { super(props); this.update(props); } async update(props: CoinListProps) { const coins = await getCoins(props.exchangeBaseUrl); this.coins(coins); } componentWillReceiveProps(newProps: CoinListProps) { this.update(newProps); } render(): JSX.Element { if (!this.coins()) { return
...
; } return (
Coins ({this.coins() !.length.toString()}) {" "} {this.coins() !.map((c) => )}
); } } interface PreCoinListProps { exchangeBaseUrl: string; } class PreCoinList extends ImplicitStateComponent { private precoins = this.makeState(null); private expanded = this.makeState(false); constructor(props: PreCoinListProps) { super(props); this.update(); } async update() { const precoins = await getPreCoins(this.props.exchangeBaseUrl); this.precoins(precoins); } render(): JSX.Element { if (!this.precoins()) { return
...
; } return (
Planchets ({this.precoins() !.length.toString()}) {" "} {this.precoins() !.map((c) => )}
); } } interface DenominationListProps { exchange: ExchangeRecord; } class DenominationList extends ImplicitStateComponent { private expanded = this.makeState(false); private denoms = this.makeState(undefined); constructor(props: DenominationListProps) { super(props); this.update(); } async update() { const d = await getDenoms(this.props.exchange.baseUrl); this.denoms(d); } renderDenom(d: DenominationRecord) { return (
  • Offered: {d.isOffered ? "yes" : "no"}
  • Value: {renderAmount(d.value)}
  • Withdraw fee: {renderAmount(d.feeWithdraw)}
  • Refresh fee: {renderAmount(d.feeRefresh)}
  • Deposit fee: {renderAmount(d.feeDeposit)}
  • Refund fee: {renderAmount(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 { const denoms = this.denoms(); if (!denoms) { return (
Denominations (...) {" "} ...
); } return (
Denominations ({denoms.length.toString()}) {" "} {denoms.map((d) => this.renderDenom(d))}
); } } class ReserveList extends ImplicitStateComponent { private reserves = this.makeState(null); private expanded = this.makeState(false); constructor(props: ReserveListProps) { super(props); this.update(); } async update() { const reserves = await getReserves(this.props.exchangeBaseUrl); this.reserves(reserves); } render(): JSX.Element { if (!this.reserves()) { return
...
; } return (
Reserves ({this.reserves() !.length.toString()}) {" "} {this.reserves() !.map((r) => )}
); } } interface ExchangeProps { exchange: ExchangeRecord; } class ExchangeView extends React.Component { render(): JSX.Element { const e = this.props.exchange; return (
  • Exchange Base Url: {this.props.exchange.baseUrl}
  • Master public key:
); } } interface ExchangesListState { exchanges?: ExchangeRecord[]; } class ExchangesList extends React.Component { constructor() { super(); const port = chrome.runtime.connect(); port.onMessage.addListener((msg: any) => { if (msg.notify) { console.log("got notified"); this.update(); } }); this.update(); this.state = {} as any; } async update() { const exchanges = await getExchanges(); console.log("exchanges: ", exchanges); this.setState({ exchanges }); } render(): JSX.Element { const exchanges = this.state.exchanges; if (!exchanges) { return ...; } return (
Exchanges ({exchanges.length.toString()}): {exchanges.map((e) => )}
); } } function main() { ReactDOM.render(, document.getElementById("container")!); } document.addEventListener("DOMContentLoaded", main);