diff --git a/packages/taler-wallet-webextension/src/hooks/useProvidersByCurrency.ts b/packages/taler-wallet-webextension/src/hooks/useProvidersByCurrency.ts index 9b600ee2b..dedaf6f86 100644 --- a/packages/taler-wallet-webextension/src/hooks/useProvidersByCurrency.ts +++ b/packages/taler-wallet-webextension/src/hooks/useProvidersByCurrency.ts @@ -1,88 +1,44 @@ import { Amounts } from "@gnu-taler/taler-util"; -// import { ProviderInfo } from "@gnu-taler/taler-wallet-core/src/operations/backup/index.js"; +import { ProviderInfo } from "@gnu-taler/taler-wallet-core/src/operations/backup"; +import { useEffect, useState } from "preact/hooks"; +import * as wxApi from "../wxApi"; export interface ProvidersByCurrency { - [s:string] : any | undefined + [s: string]: ProviderInfo | undefined +} +export interface BackupStatus { + deviceName: string; + providers: ProvidersByCurrency } -const list = { - "trustedAuditors": [], - "trustedExchanges": [ - { - "currency": "ARS", - "exchangeBaseUrl": "http://exchange.taler:8081/", - "exchangeMasterPub": "WHA6G542TW8B10N3E857M3P252HV7B896TSP1HP6NREG96ADA4MG" - }, - { - "currency": "KUDOS", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "exchangeMasterPub": "FH1Y8ZMHCTPQ0YFSZECDH8C9407JR3YN0MF1706PTG24Q4NEWGV0" - }, - { - "currency": "USD", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "exchangeMasterPub": "FH1Y8ZMHCTPQ0YFSZECDH8C9407JR3YN0MF1706PTG24Q4NEWGV0" - }, - { - "currency": "EUR", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "exchangeMasterPub": "FH1Y8ZMHCTPQ0YFSZECDH8C9407JR3YN0MF1706PTG24Q4NEWGV0" - } - ] -} - -const status = { - "deviceId": "thenameofthisdevice", - "walletRootPub": "83DYRKK262TG72H1SD09CTWXQFC151P2DXF9WYH30J8EQ7EAZMCG", - "providers": [ - { - "active": false, - "syncProviderBaseUrl": "http://sync.demo.taler.net/", - "paymentProposalIds": [], - "paymentStatus": { - "type": "unpaid" - }, - "terms": { - "annualFee": "KUDOS:0.1", - "storageLimitInMegabytes": 16, - "supportedProtocolVersion": "0.0" - } - }, { - "active": true, - "syncProviderBaseUrl": "http://sync.taler:9967/", - "lastSuccessfulBackupTimestamp": { - "t_ms": 1625063925078 - }, - "paymentProposalIds": [ - "43Q5WWRJPNS4SE9YKS54H9THDS94089EDGXW9EHBPN6E7M184XEG" - ], - "paymentStatus": { - "type": "paid", - "paidUntil": { - "t_ms": 1656599921000 +export function useBackupStatus(): BackupStatus | undefined { + const [status, setStatus] = useState(undefined) + useEffect(() => { + async function run() { + //create a first list of backup info by currency + const status = await wxApi.getBackupInfo() + const providers = status.providers.reduce((p, c) => { + if (c.terms) { + p[Amounts.parseOrThrow(c.terms.annualFee).currency] = c } - }, - "terms": { - "annualFee": "ARS:1", - "storageLimitInMegabytes": 16, - "supportedProtocolVersion": "0.0" - } - } + return p + }, {} as ProvidersByCurrency) - ] -} - -export function useProvidersByCurrency(): ProvidersByCurrency { - const currencies = list.trustedExchanges.map(e => e.currency) - const providerByCurrency = status.providers.reduce((p, c) => { - if (c.terms) { - p[Amounts.parseOrThrow(c.terms.annualFee).currency] = c - } - return p - }, {} as Record) - - - return providerByCurrency + //add all the known currency with no backup info + const list = await wxApi.listKnownCurrencies() + const currencies = list.exchanges.map(e => e.name).concat(list.auditors.map(a => a.name)) + currencies.forEach(c => { + if (!providers[c]) { + providers[c] = undefined + } + }) + + setStatus({ deviceName: status.deviceId, providers }) + } + run() + }, []) + + return status } diff --git a/packages/taler-wallet-webextension/src/popup/Backup.stories.tsx b/packages/taler-wallet-webextension/src/popup/Backup.stories.tsx index 0f51f3897..856360ebf 100644 --- a/packages/taler-wallet-webextension/src/popup/Backup.stories.tsx +++ b/packages/taler-wallet-webextension/src/popup/Backup.stories.tsx @@ -19,6 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ +import { ProviderPaymentType } from '@gnu-taler/taler-wallet-core/src/operations/backup'; import { FunctionalComponent } from 'preact'; import { BackupView as TestedComponent } from './BackupPage'; @@ -52,7 +53,7 @@ export const Example = createExample(TestedComponent, { "43Q5WWRJPNS4SE9YKS54H9THDS94089EDGXW9EHBPN6E7M184XEG" ], "paymentStatus": { - "type": 'paid', + "type": ProviderPaymentType.Paid, "paidUntil": { "t_ms": 1656599921000 } @@ -68,7 +69,7 @@ export const Example = createExample(TestedComponent, { "syncProviderBaseUrl": "http://sync.demo.taler.net/", "paymentProposalIds": [], "paymentStatus": { - "type": 'unpaid', + "type": ProviderPaymentType.Unpaid, }, "terms": { "annualFee": "KUDOS:0.1", diff --git a/packages/taler-wallet-webextension/src/popup/BackupPage.tsx b/packages/taler-wallet-webextension/src/popup/BackupPage.tsx index d13f5244d..9900720d9 100644 --- a/packages/taler-wallet-webextension/src/popup/BackupPage.tsx +++ b/packages/taler-wallet-webextension/src/popup/BackupPage.tsx @@ -19,11 +19,14 @@ import { Timestamp } from "@gnu-taler/taler-util"; // import { ProviderPaymentStatus } from "@gnu-taler/taler-wallet-core/src/operations/backup"; import { formatDuration, intervalToDuration } from "date-fns"; import { JSX, VNode } from "preact"; -import { ProvidersByCurrency, useProvidersByCurrency } from "../hooks/useProvidersByCurrency"; +import { ProvidersByCurrency, useBackupStatus } from "../hooks/useProvidersByCurrency"; export function BackupPage(): VNode { - const providers = useProvidersByCurrency() - return ; + const status = useBackupStatus() + if (!status) { + return
Loading...
+ } + return ; } export interface ViewProps { diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index bba8ea1d3..81f418d40 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -38,7 +38,8 @@ import { DeleteTransactionRequest, RetryTransactionRequest, } from "@gnu-taler/taler-util"; -import { OperationFailedError } from "@gnu-taler/taler-wallet-core"; +import { BackupProviderState, OperationFailedError } from "@gnu-taler/taler-wallet-core"; +import { BackupInfo } from "@gnu-taler/taler-wallet-core/src/operations/backup"; export interface ExtendedPermissionsResponse { newValue: boolean; @@ -132,18 +133,48 @@ export function getTransactions(): Promise { return callBackend("getTransactions", {}); } +interface CurrencyInfo { + name: string; + baseUrl: string; + pub: string; +} +interface ListOfKnownCurrencies { + auditors: CurrencyInfo[], + exchanges: CurrencyInfo[], +} + /** - * Get currency from known auditors and exchanges + * Get a list of currencies from known auditors and exchanges */ - export function listCurrencies(): Promise { - return callBackend("listCurrencies", {}); +export function listKnownCurrencies(): Promise { + return callBackend("listCurrencies", {}).then(result => { + console.log("result list", result) + const auditors = result.trustedAuditors.map((a: Record) => ({ + name: a.currency, + baseUrl: a.auditorBaseUrl, + pub: a.auditorPub, + })) + const exchanges = result.trustedExchanges.map((a: Record) => ({ + name: a.currency, + baseUrl: a.exchangeBaseUrl, + pub: a.exchangeMasterPub, + })) + return { auditors, exchanges } + }); +} + +/** + * Get information about the current state of wallet backups. + */ + export function getBackupInfo(): Promise { + return callBackend("getBackupInfo", {}) } /** * Retry a transaction * @param transactionId * @returns */ - export function retryTransaction(transactionId: string): Promise { +export function retryTransaction(transactionId: string): Promise { return callBackend("retryTransaction", { transactionId } as RetryTransactionRequest);