add auditor editing
This commit is contained in:
parent
df87dc0242
commit
4178dcadc6
37
src/pages/auditors.html
Normal file
37
src/pages/auditors.html
Normal file
@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Taler Wallet: Auditors</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="/src/vendor/URI.js"></script>
|
||||
<script src="/src/vendor/react.js"></script>
|
||||
<script src="/src/vendor/react-dom.js"></script>
|
||||
|
||||
<script src="/src/vendor/system-csp-production.src.js"></script>
|
||||
<script src="/src/moduleTrampoline.js"></script>
|
||||
|
||||
<style>
|
||||
.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>
|
96
src/pages/auditors.tsx
Normal file
96
src/pages/auditors.tsx
Normal file
@ -0,0 +1,96 @@
|
||||
/*
|
||||
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, DenominationRecord } from "src/types";
|
||||
import { AuditorRecord, CurrencyRecord, ReserveRecord, CoinRecord, PreCoinRecord, Denomination } from "src/types";
|
||||
import { ImplicitStateComponent, StateHolder } from "src/components";
|
||||
import {
|
||||
getCurrencies,
|
||||
updateCurrency,
|
||||
} from "src/wxApi";
|
||||
import { prettyAmount } from "src/renderHtml";
|
||||
import { getTalerStampDate } from "src/helpers";
|
||||
|
||||
interface CurrencyListState {
|
||||
currencies?: CurrencyRecord[];
|
||||
}
|
||||
|
||||
class CurrencyList extends React.Component<any, CurrencyListState> {
|
||||
constructor() {
|
||||
super();
|
||||
let 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() {
|
||||
let currencies = await getCurrencies();
|
||||
console.log("currencies: ", currencies);
|
||||
this.setState({ currencies });
|
||||
}
|
||||
|
||||
async confirmRemove(c: CurrencyRecord, a: AuditorRecord) {
|
||||
if (window.confirm(`Do you really want to remove auditor ${a.baseUrl} for currency ${c.name}?`)) {
|
||||
c.auditors = c.auditors.filter((x) => x.auditorPub != a.auditorPub);
|
||||
await updateCurrency(c);
|
||||
}
|
||||
}
|
||||
|
||||
render(): JSX.Element {
|
||||
let currencies = this.state.currencies;
|
||||
if (!currencies) {
|
||||
return <span>...</span>;
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
{currencies.map(c => (
|
||||
<div>
|
||||
<h1>Currency {c.name}</h1>
|
||||
<p>Displayed with {c.fractionalDigits} fractional digits.</p>
|
||||
<p>Auditors:</p>
|
||||
<ul>
|
||||
{c.auditors.map(a => (
|
||||
<li>{a.baseUrl} (<button className="button-linky" onClick={() => this.confirmRemove(c, a)}>Remove</button>)
|
||||
<ul>
|
||||
<li>valid until {new Date(a.expirationStamp).toString()}</li>
|
||||
<li>public key {a.auditorPub}</li>
|
||||
</ul>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function main() {
|
||||
ReactDOM.render(<CurrencyList />, document.getElementById("container")!);
|
||||
}
|
@ -325,8 +325,8 @@ class WalletBalanceView extends React.Component<any, any> {
|
||||
);
|
||||
});
|
||||
if (listing.length > 0) {
|
||||
let link = chrome.extension.getURL("/src/pages/tree.html");
|
||||
let linkElem = <a href={link} target="_blank">advanced view</a>;
|
||||
let link = chrome.extension.getURL("/src/pages/auditors.html");
|
||||
let linkElem = <a href={link} target="_blank">auditors</a>;
|
||||
return (
|
||||
<div>
|
||||
{listing}
|
||||
|
12
src/types.ts
12
src/types.ts
@ -76,6 +76,18 @@ export interface ReserveRecord {
|
||||
confirmed: boolean,
|
||||
}
|
||||
|
||||
export interface AuditorRecord {
|
||||
baseUrl: string;
|
||||
auditorPub: string;
|
||||
expirationStamp: number;
|
||||
}
|
||||
|
||||
export interface CurrencyRecord {
|
||||
name: string;
|
||||
fractionalDigits: number;
|
||||
auditors: AuditorRecord[];
|
||||
}
|
||||
|
||||
|
||||
@Checkable.Class
|
||||
export class CreateReserveResponse {
|
||||
|
@ -37,6 +37,8 @@ import {
|
||||
RefreshSessionRecord,
|
||||
ReserveCreationInfo,
|
||||
ReserveRecord,
|
||||
CurrencyRecord,
|
||||
AuditorRecord,
|
||||
WalletBalance,
|
||||
WalletBalanceEntry,
|
||||
WireInfo, DenominationRecord, DenominationStatus, denominationRecordFromKeys,
|
||||
@ -202,17 +204,6 @@ export interface NonceRecord {
|
||||
pub: string;
|
||||
}
|
||||
|
||||
export interface AuditorRecord {
|
||||
baseUrl: string;
|
||||
auditorPub: string;
|
||||
expirationStamp: number;
|
||||
}
|
||||
|
||||
export interface CurrencyRecord {
|
||||
name: string;
|
||||
fractionalDigits: number;
|
||||
auditors: AuditorRecord[];
|
||||
}
|
||||
|
||||
export interface ConfigRecord {
|
||||
key: string;
|
||||
@ -1714,6 +1705,21 @@ export class Wallet {
|
||||
.toArray();
|
||||
}
|
||||
|
||||
async getCurrencies(): Promise<CurrencyRecord[]> {
|
||||
return this.q()
|
||||
.iter<CurrencyRecord>(Stores.currencies)
|
||||
.flatMap((e) => [e])
|
||||
.toArray();
|
||||
}
|
||||
|
||||
async updateCurrency(currencyRecord: CurrencyRecord): Promise<void> {
|
||||
console.log("updating currency to", currencyRecord);
|
||||
await this.q()
|
||||
.put(Stores.currencies, currencyRecord)
|
||||
.finish();
|
||||
this.notifier.notify();
|
||||
}
|
||||
|
||||
async getReserves(exchangeBaseUrl: string): Promise<ReserveRecord[]> {
|
||||
return this.q()
|
||||
.iter<ReserveRecord>(Stores.reserves)
|
||||
|
@ -20,6 +20,7 @@ import {
|
||||
PreCoinRecord,
|
||||
ReserveCreationInfo,
|
||||
ExchangeRecord,
|
||||
CurrencyRecord,
|
||||
ReserveRecord, DenominationRecord
|
||||
} from "./types";
|
||||
|
||||
@ -58,6 +59,14 @@ export async function getExchanges(): Promise<ExchangeRecord[]> {
|
||||
return await callBackend("get-exchanges");
|
||||
}
|
||||
|
||||
export async function getCurrencies(): Promise<CurrencyRecord[]> {
|
||||
return await callBackend("get-currencies");
|
||||
}
|
||||
|
||||
export async function updateCurrency(currencyRecord: CurrencyRecord): Promise<void> {
|
||||
return await callBackend("update-currency", { currencyRecord });
|
||||
}
|
||||
|
||||
export async function getReserves(exchangeBaseUrl: string): Promise<ReserveRecord[]> {
|
||||
return await callBackend("get-reserves", { exchangeBaseUrl });
|
||||
}
|
||||
|
@ -204,6 +204,12 @@ function makeHandlers(db: IDBDatabase,
|
||||
["get-exchanges"]: function (detail, sender) {
|
||||
return wallet.getExchanges();
|
||||
},
|
||||
["get-currencies"]: function (detail, sender) {
|
||||
return wallet.getCurrencies();
|
||||
},
|
||||
["update-currency"]: function (detail, sender) {
|
||||
return wallet.updateCurrency(detail.currencyRecord);
|
||||
},
|
||||
["get-reserves"]: function (detail, sender) {
|
||||
if (typeof detail.exchangeBaseUrl !== "string") {
|
||||
return Promise.reject(Error("exchangeBaseUrl missing"));
|
||||
|
@ -38,6 +38,7 @@
|
||||
"src/i18n/strings.ts",
|
||||
"src/logging.ts",
|
||||
"src/moduleTrampoline.ts",
|
||||
"src/pages/auditors.tsx",
|
||||
"src/pages/confirm-contract.tsx",
|
||||
"src/pages/confirm-create-reserve.tsx",
|
||||
"src/pages/error.tsx",
|
||||
|
Loading…
Reference in New Issue
Block a user