gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 02/02: wallet-core: simplify exchanges list response


From: gnunet
Subject: [taler-wallet-core] 02/02: wallet-core: simplify exchanges list response
Date: Sat, 15 Oct 2022 12:59:31 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository wallet-core.

commit bd88dcebbcf90414c790a86ee13740eaf20e3334
Author: Florian Dold <florian@dold.me>
AuthorDate: Sat Oct 15 12:59:26 2022 +0200

    wallet-core: simplify exchanges list response
---
 packages/taler-util/src/wallet-types.ts            | 13 +++++++++--
 .../taler-wallet-core/src/operations/common.ts     | 15 +++++++++++-
 .../taler-wallet-core/src/operations/withdraw.ts   | 23 ++++++++----------
 packages/taler-wallet-core/src/wallet.ts           |  7 ++++--
 .../src/components/TermsOfService/utils.ts         | 27 +++-------------------
 .../src/components/TermsOfService/views.tsx        |  9 ++++----
 .../src/cta/Withdraw/state.ts                      | 13 +++++++----
 .../src/cta/Withdraw/test.ts                       |  3 +++
 .../src/cta/Withdraw/views.tsx                     |  4 ++--
 .../src/wallet/DeveloperPage.tsx                   | 17 +++++++-------
 .../src/wallet/Settings.tsx                        | 22 ++++++++----------
 11 files changed, 78 insertions(+), 75 deletions(-)

diff --git a/packages/taler-util/src/wallet-types.ts 
b/packages/taler-util/src/wallet-types.ts
index 54f4c54a2..aba1b1185 100644
--- a/packages/taler-util/src/wallet-types.ts
+++ b/packages/taler-util/src/wallet-types.ts
@@ -900,11 +900,18 @@ export interface ExchangeFullDetails {
   globalFees: FeeDescription[];
 }
 
+export enum ExchangeTosStatus {
+  New = "new",
+  Accepted = "accepted",
+  Changed = "changed",
+  NotFound = "not-found",
+}
+
 export interface ExchangeListItem {
   exchangeBaseUrl: string;
   currency: string;
   paytoUris: string[];
-  tos: ExchangeTosStatusDetails;
+  tosStatus: ExchangeTosStatus;
 }
 
 const codecForAuditorDenomSig = (): Codec<AuditorDenomSig> =>
@@ -976,7 +983,7 @@ export const codecForExchangeListItem = (): 
Codec<ExchangeListItem> =>
     .property("currency", codecForString())
     .property("exchangeBaseUrl", codecForString())
     .property("paytoUris", codecForList(codecForString()))
-    .property("tos", codecForExchangeTos())
+    .property("tosStatus", codecForAny())
     .build("ExchangeListItem");
 
 export const codecForExchangesListResponse = (): Codec<ExchangesListResponse> 
=>
@@ -1146,6 +1153,8 @@ export interface GetExchangeTosResult {
    * Accepted content type
    */
   contentType: string;
+
+  tosStatus: ExchangeTosStatus;
 }
 
 export interface TestPayArgs {
diff --git a/packages/taler-wallet-core/src/operations/common.ts 
b/packages/taler-wallet-core/src/operations/common.ts
index 5e02f3d7b..ee7a1b46e 100644
--- a/packages/taler-wallet-core/src/operations/common.ts
+++ b/packages/taler-wallet-core/src/operations/common.ts
@@ -22,6 +22,7 @@ import {
   Amounts,
   CoinRefreshRequest,
   CoinStatus,
+  ExchangeTosStatus,
   j2s,
   Logger,
   RefreshReason,
@@ -31,7 +32,7 @@ import {
   TransactionIdStr,
   TransactionType,
 } from "@gnu-taler/taler-util";
-import { WalletStoresV1, CoinRecord } from "../db.js";
+import { WalletStoresV1, CoinRecord, ExchangeDetailsRecord } from "../db.js";
 import { makeErrorDetail, TalerError } from "../errors.js";
 import { InternalWalletState } from "../internal-wallet-state.js";
 import { checkDbInvariant, checkLogicInvariant } from "../util/invariants.js";
@@ -307,3 +308,15 @@ export function makeTombstoneId(
 ): TombstoneIdStr {
   return `tmb:${type}:${args.map((x) => encodeURIComponent(x)).join(":")}`;
 }
+
+export function getExchangeTosStatus(
+  exchangeDetails: ExchangeDetailsRecord,
+): ExchangeTosStatus {
+  if (!exchangeDetails.tosAccepted) {
+    return ExchangeTosStatus.New;
+  }
+  if (exchangeDetails.tosAccepted?.etag == exchangeDetails.tosCurrentEtag) {
+    return ExchangeTosStatus.Accepted;
+  }
+  return ExchangeTosStatus.Changed;
+}
diff --git a/packages/taler-wallet-core/src/operations/withdraw.ts 
b/packages/taler-wallet-core/src/operations/withdraw.ts
index d7627e6cf..1520dfc0a 100644
--- a/packages/taler-wallet-core/src/operations/withdraw.ts
+++ b/packages/taler-wallet-core/src/operations/withdraw.ts
@@ -83,6 +83,7 @@ import {
 } from "../errors.js";
 import { InternalWalletState } from "../internal-wallet-state.js";
 import {
+  getExchangeTosStatus,
   makeCoinAvailable,
   runOperationWithErrorReporting,
 } from "../operations/common.js";
@@ -1359,26 +1360,20 @@ export async function getWithdrawalDetailsForUri(
     .runReadOnly(async (tx) => {
       const exchangeRecords = await tx.exchanges.iter().toArray();
       for (const r of exchangeRecords) {
-        const details = await ws.exchangeOps.getExchangeDetails(tx, r.baseUrl);
+        const exchangeDetails = await ws.exchangeOps.getExchangeDetails(tx, 
r.baseUrl);
         const denominations = await tx.denominations.indexes.byExchangeBaseUrl
           .iter(r.baseUrl)
           .toArray();
-        if (details && denominations) {
+        if (exchangeDetails && denominations) {
           const tosRecord = await tx.exchangeTos.get([
-            details.exchangeBaseUrl,
-            details.tosCurrentEtag,
+            exchangeDetails.exchangeBaseUrl,
+            exchangeDetails.tosCurrentEtag,
           ]);
           exchanges.push({
-            exchangeBaseUrl: details.exchangeBaseUrl,
-            currency: details.currency,
-            // FIXME: We probably don't want to include the full ToS here!
-            tos: {
-              acceptedVersion: details.tosAccepted?.etag,
-              currentVersion: details.tosCurrentEtag,
-              contentType: tosRecord?.termsOfServiceContentType ?? "",
-              content: tosRecord?.termsOfServiceText ?? "",
-            },
-            paytoUris: details.wireInfo.accounts.map((x) => x.payto_uri),
+            exchangeBaseUrl: exchangeDetails.exchangeBaseUrl,
+            currency: exchangeDetails.currency,
+            paytoUris: exchangeDetails.wireInfo.accounts.map((x) => 
x.payto_uri),
+            tosStatus: getExchangeTosStatus(exchangeDetails),
           });
         }
       }
diff --git a/packages/taler-wallet-core/src/wallet.ts 
b/packages/taler-wallet-core/src/wallet.ts
index ef41c5101..3c7194059 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -146,7 +146,7 @@ import {
 } from "./operations/backup/index.js";
 import { setWalletDeviceId } from "./operations/backup/state.js";
 import { getBalances } from "./operations/balance.js";
-import { runOperationWithErrorReporting } from "./operations/common.js";
+import { getExchangeTosStatus, runOperationWithErrorReporting } from 
"./operations/common.js";
 import {
   createDepositGroup,
   getFeeForDeposit,
@@ -503,6 +503,7 @@ async function getExchangeTos(
       currentEtag,
       content,
       contentType,
+      tosStatus: getExchangeTosStatus(exchangeDetails),
     };
   }
 
@@ -519,6 +520,7 @@ async function getExchangeTos(
       currentEtag,
       content,
       contentType,
+      tosStatus: getExchangeTosStatus(exchangeDetails),
     };
   }
 
@@ -529,6 +531,7 @@ async function getExchangeTos(
     currentEtag: tosDownload.tosEtag,
     content: tosDownload.tosText,
     contentType: tosDownload.tosContentType,
+    tosStatus: getExchangeTosStatus(exchangeDetails),
   };
 }
 
@@ -665,7 +668,7 @@ async function getExchanges(
         exchanges.push({
           exchangeBaseUrl: r.baseUrl,
           currency,
-          tos,
+          tosStatus: getExchangeTosStatus(exchangeDetails),
           paytoUris: exchangeDetails.wireInfo.accounts.map((x) => x.payto_uri),
         });
       }
diff --git 
a/packages/taler-wallet-webextension/src/components/TermsOfService/utils.ts 
b/packages/taler-wallet-webextension/src/components/TermsOfService/utils.ts
index 5766883ae..a106c3d85 100644
--- a/packages/taler-wallet-webextension/src/components/TermsOfService/utils.ts
+++ b/packages/taler-wallet-webextension/src/components/TermsOfService/utils.ts
@@ -14,7 +14,7 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { GetExchangeTosResult } from "@gnu-taler/taler-util";
+import { ExchangeTosStatus, GetExchangeTosResult } from 
"@gnu-taler/taler-util";
 
 export function buildTermsOfServiceState(
   tos: GetExchangeTosResult,
@@ -24,26 +24,7 @@ export function buildTermsOfServiceState(
     tos.content,
   );
 
-  const status: TermsStatus = buildTermsOfServiceStatus(
-    tos.content,
-    tos.acceptedEtag,
-    tos.currentEtag,
-  );
-
-  return { content, status, version: tos.currentEtag };
-}
-export function buildTermsOfServiceStatus(
-  content: string | undefined,
-  acceptedVersion: string | undefined,
-  currentVersion: string | undefined,
-): TermsStatus {
-  return !content
-    ? "notfound"
-    : !acceptedVersion
-    ? "new"
-    : acceptedVersion !== currentVersion
-    ? "changed"
-    : "accepted";
+  return { content, status: tos.tosStatus, version: tos.currentEtag };
 }
 
 function parseTermsOfServiceContent(
@@ -91,12 +72,10 @@ function parseTermsOfServiceContent(
 
 export type TermsState = {
   content: TermsDocument | undefined;
-  status: TermsStatus;
+  status: ExchangeTosStatus;
   version: string;
 };
 
-type TermsStatus = "new" | "accepted" | "changed" | "notfound";
-
 export type TermsDocument =
   | TermsDocumentXml
   | TermsDocumentHtml
diff --git 
a/packages/taler-wallet-webextension/src/components/TermsOfService/views.tsx 
b/packages/taler-wallet-webextension/src/components/TermsOfService/views.tsx
index c7f8ccb78..a7e03fd01 100644
--- a/packages/taler-wallet-webextension/src/components/TermsOfService/views.tsx
+++ b/packages/taler-wallet-webextension/src/components/TermsOfService/views.tsx
@@ -29,6 +29,7 @@ import {
 import { ExchangeXmlTos } from "../../components/ExchangeToS.js";
 import { ToggleHandler } from "../../mui/handlers.js";
 import { Button } from "../../mui/Button.js";
+import { ExchangeTosStatus } from "@gnu-taler/taler-util";
 
 export function LoadingUriView({ error }: State.LoadingUriError): VNode {
   const { i18n } = useTranslationContext();
@@ -100,7 +101,7 @@ export function ShowButtonsNonAcceptedTosView({
   if (!ableToReviewTermsOfService) {
     return (
       <Fragment>
-        {terms.status === "notfound" && (
+        {terms.status === ExchangeTosStatus.NotFound && (
           <section style={{ justifyContent: "space-around", display: "flex" }}>
             <WarningText>
               <i18n.Translate>
@@ -115,7 +116,7 @@ export function ShowButtonsNonAcceptedTosView({
 
   return (
     <Fragment>
-      {terms.status === "notfound" && (
+      {terms.status === ExchangeTosStatus.NotFound && (
         <section style={{ justifyContent: "space-around", display: "flex" }}>
           <WarningText>
             <i18n.Translate>
@@ -163,7 +164,7 @@ export function ShowTosContentView({
 
   return (
     <Fragment>
-      {terms.status !== "notfound" && !terms.content && (
+      {terms.status !== ExchangeTosStatus.NotFound && !terms.content && (
         <section style={{ justifyContent: "space-around", display: "flex" }}>
           <WarningBox>
             <i18n.Translate>
@@ -204,7 +205,7 @@ export function ShowTosContentView({
           </LinkSuccess>
         </section>
       )}
-      {termsAccepted && terms.status !== "notfound" && (
+      {termsAccepted && terms.status !== ExchangeTosStatus.NotFound && (
         <section style={{ justifyContent: "space-around", display: "flex" }}>
           <CheckboxOutlined
             name="terms"
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts 
b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
index 53bac579e..f4aea9cd6 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts
@@ -15,7 +15,12 @@
  */
 
 /* eslint-disable react-hooks/rules-of-hooks */
-import { AmountJson, Amounts, ExchangeListItem } from "@gnu-taler/taler-util";
+import {
+  AmountJson,
+  Amounts,
+  ExchangeListItem,
+  ExchangeTosStatus,
+} from "@gnu-taler/taler-util";
 import { TalerError } from "@gnu-taler/taler-wallet-core";
 import { useState } from "preact/hooks";
 import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js";
@@ -173,10 +178,8 @@ function exchangeSelectionState(
     const [ageRestricted, setAgeRestricted] = useState(0);
     const currentExchange = selectedExchange.selected;
     const tosNeedToBeAccepted =
-      !currentExchange.tos.acceptedVersion ||
-      currentExchange.tos.currentVersion !==
-        currentExchange.tos.acceptedVersion;
-
+      currentExchange.tosStatus == ExchangeTosStatus.New ||
+      currentExchange.tosStatus == ExchangeTosStatus.Changed;
     /**
      * With the exchange and amount, ask the wallet the information
      * about the withdrawal
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts 
b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts
index d86771208..2b0690800 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts
@@ -22,6 +22,7 @@
 import {
   Amounts,
   ExchangeFullDetails,
+  ExchangeTosStatus,
   GetExchangeTosResult,
 } from "@gnu-taler/taler-util";
 import { expect } from "chai";
@@ -169,6 +170,7 @@ describe("Withdraw CTA states", () => {
               content: "just accept",
               acceptedEtag: "v1",
               currentEtag: "v1",
+              tosStatus: ExchangeTosStatus.Accepted,
             }),
           } as any,
         ),
@@ -254,6 +256,7 @@ describe("Withdraw CTA states", () => {
               content: "just accept",
               acceptedEtag: "v1",
               currentEtag: "v2",
+              tosStatus: ExchangeTosStatus.Changed,
             }),
             setExchangeTosAccepted: async () => ({}),
           } as any,
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx 
b/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx
index 468d22d54..5c35151c8 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw/views.tsx
@@ -37,6 +37,7 @@ import editIcon from "../../svg/edit_24px.svg";
 import { ExchangeDetails, WithdrawDetails } from "../../wallet/Transaction.js";
 import { TermsOfService } from "../../components/TermsOfService/index.js";
 import { State } from "./index.js";
+import { ExchangeTosStatus } from "@gnu-taler/taler-util";
 
 export function LoadingUriView({ error }: State.LoadingUriError): VNode {
   const { i18n } = useTranslationContext();
@@ -65,8 +66,7 @@ export function LoadingInfoView({ error }: 
State.LoadingInfoError): VNode {
 export function SuccessView(state: State.Success): VNode {
   const { i18n } = useTranslationContext();
   const currentTosVersionIsAccepted =
-    state.currentExchange.tos.acceptedVersion ===
-    state.currentExchange.tos.currentVersion;
+    state.currentExchange.tosStatus === ExchangeTosStatus.Accepted;
   return (
     <WalletAction>
       <LogoHeader />
diff --git a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx 
b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
index c6f016e00..c0e35b17b 100644
--- a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx
@@ -17,6 +17,7 @@
 import {
   Amounts,
   CoinDumpJson,
+  CoinStatus,
   ExchangeListItem,
   NotificationType,
 } from "@gnu-taler/taler-util";
@@ -86,7 +87,7 @@ type CoinsInfo = CoinDumpJson["coins"];
 type CalculatedCoinfInfo = {
   ageKeysCount: number | undefined;
   denom_value: number;
-  remain_value: number;
+  //remain_value: number;
   status: string;
   from_refresh: boolean;
   id: string;
@@ -143,10 +144,10 @@ export function View({
       prev[cur.exchange_base_url].push({
         ageKeysCount: cur.ageCommitmentProof?.proof.privateKeys.length,
         denom_value: parseFloat(Amounts.stringifyValue(denom)),
-        remain_value: parseFloat(
-          Amounts.stringifyValue(Amounts.parseOrThrow(cur.remaining_value)),
-        ),
-        status: cur.coin_suspended ? "suspended" : "ok",
+        // remain_value: parseFloat(
+        //   Amounts.stringifyValue(Amounts.parseOrThrow(cur.remaining_value)),
+        // ),
+        status: cur.coin_status,
         from_refresh: cur.refresh_parent_coin_pub !== undefined,
         id: cur.coin_pub,
       });
@@ -254,8 +255,8 @@ export function View({
 
         const coins = allcoins.reduce(
           (prev, cur) => {
-            if (cur.remain_value > 0) prev.usable.push(cur);
-            if (cur.remain_value === 0) prev.spent.push(cur);
+            if (cur.status === CoinStatus.Fresh) prev.usable.push(cur);
+            if (cur.status === CoinStatus.Dormant) prev.spent.push(cur);
             return prev;
           },
           {
@@ -356,7 +357,6 @@ function ShowAllCoins({
               <tr key={idx}>
                 <td>{c.id.substring(0, 5)}</td>
                 <td>{c.denom_value}</td>
-                <td>{c.remain_value}</td>
                 <td>{c.status}</td>
                 <td>{c.from_refresh ? "true" : "false"}</td>
                 <td>{String(c.ageKeysCount)}</td>
@@ -396,7 +396,6 @@ function ShowAllCoins({
               <tr key={idx}>
                 <td>{c.id.substring(0, 5)}</td>
                 <td>{c.denom_value}</td>
-                <td>{c.remain_value}</td>
                 <td>{c.status}</td>
                 <td>{c.from_refresh ? "true" : "false"}</td>
               </tr>
diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.tsx 
b/packages/taler-wallet-webextension/src/wallet/Settings.tsx
index 80843ac27..8412c4a12 100644
--- a/packages/taler-wallet-webextension/src/wallet/Settings.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Settings.tsx
@@ -14,7 +14,11 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { ExchangeListItem, WalletCoreVersion } from "@gnu-taler/taler-util";
+import {
+  ExchangeListItem,
+  ExchangeTosStatus,
+  WalletCoreVersion,
+} from "@gnu-taler/taler-util";
 import { Fragment, h, VNode } from "preact";
 import { Checkbox } from "../components/Checkbox.js";
 import { ErrorTalerOperation } from "../components/ErrorTalerOperation.js";
@@ -36,7 +40,6 @@ import { useBackupDeviceName } from 
"../hooks/useBackupDeviceName.js";
 import { useAutoOpenPermissions } from "../hooks/useAutoOpenPermissions.js";
 import { ToggleHandler } from "../mui/handlers.js";
 import { Pages } from "../NavigationBar.js";
-import { buildTermsOfServiceStatus } from 
"../components/TermsOfService/utils.js";
 import * as wxApi from "../wxApi.js";
 import { platform } from "../platform/api.js";
 import { useClipboardPermissions } from "../hooks/useClipboardPermissions.js";
@@ -181,26 +184,21 @@ export function SettingsView({
               <tbody>
                 {knownExchanges.map((e, idx) => {
                   function Status(): VNode {
-                    const status = buildTermsOfServiceStatus(
-                      e.tos.content,
-                      e.tos.acceptedVersion,
-                      e.tos.currentVersion,
-                    );
-                    switch (status) {
-                      case "accepted":
+                    switch (e.tosStatus) {
+                      case ExchangeTosStatus.Accepted:
                         return (
                           <SuccessText>
                             <i18n.Translate>ok</i18n.Translate>
                           </SuccessText>
                         );
-                      case "changed":
+                      case ExchangeTosStatus.Changed:
                         return (
                           <WarningText>
                             <i18n.Translate>changed</i18n.Translate>
                           </WarningText>
                         );
-                      case "new":
-                      case "notfound":
+                      case ExchangeTosStatus.New:
+                      case ExchangeTosStatus.NotFound:
                         return (
                           <DestructiveText>
                             <i18n.Translate>not accepted</i18n.Translate>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]