gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-core] branch master updated: use new local storage api


From: gnunet
Subject: [taler-wallet-core] branch master updated: use new local storage api
Date: Mon, 29 May 2023 19:53:14 +0200

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

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

The following commit(s) were added to refs/heads/master by this push:
     new be9d3dad8 use new local storage api
be9d3dad8 is described below

commit be9d3dad83801806c9a7d99c925aa2b86571a70b
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Mon May 29 14:53:06 2023 -0300

    use new local storage api
---
 packages/demobank-ui/src/hooks/backend.ts  | 55 ++++++++++++++++++++++--------
 packages/demobank-ui/src/hooks/index.ts    | 12 ++++---
 packages/demobank-ui/src/hooks/settings.ts | 38 +++++++++++++--------
 3 files changed, 72 insertions(+), 33 deletions(-)

diff --git a/packages/demobank-ui/src/hooks/backend.ts 
b/packages/demobank-ui/src/hooks/backend.ts
index 83df53a1a..f7c255ead 100644
--- a/packages/demobank-ui/src/hooks/backend.ts
+++ b/packages/demobank-ui/src/hooks/backend.ts
@@ -14,11 +14,20 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { canonicalizeBaseUrl } from "@gnu-taler/taler-util";
+import {
+  Codec,
+  buildCodecForObject,
+  buildCodecForUnion,
+  canonicalizeBaseUrl,
+  codecForBoolean,
+  codecForConstString,
+  codecForString,
+} from "@gnu-taler/taler-util";
 import {
   ErrorType,
   HttpError,
   RequestError,
+  buildStorageKey,
   useLocalStorage,
 } from "@gnu-taler/web-util/browser";
 import {
@@ -51,6 +60,26 @@ interface LoggedOut {
   status: "loggedOut";
 }
 
+export const codecForBackendStateLoggedIn = (): Codec<LoggedIn> =>
+  buildCodecForObject<LoggedIn>()
+    .property("status", codecForConstString("loggedIn"))
+    .property("username", codecForString())
+    .property("password", codecForString())
+    .property("isUserAdministrator", codecForBoolean())
+    .build("BackendState.LoggedIn");
+
+export const codecForBackendStateLoggedOut = (): Codec<LoggedOut> =>
+  buildCodecForObject<LoggedOut>()
+    .property("status", codecForConstString("loggedOut"))
+    .build("BackendState.LoggedOut");
+
+export const codecForBackendState = (): Codec<BackendState> =>
+  buildCodecForUnion<BackendState>()
+    .discriminateOn("status")
+    .alternative("loggedIn", codecForBackendStateLoggedIn())
+    .alternative("loggedOut", codecForBackendStateLoggedOut())
+    .build("BackendState");
+
 export function getInitialBackendBaseURL(): string {
   const overrideUrl =
     typeof localStorage !== "undefined"
@@ -79,29 +108,27 @@ export interface BackendStateHandler {
   logOut(): void;
   logIn(info: BackendCredentials): void;
 }
+
+const BACKEND_STATE_KEY = buildStorageKey(
+  "backend-state",
+  codecForBackendState(),
+);
+
 /**
  * Return getters and setters for
  * login credentials and backend's
  * base URL.
  */
 export function useBackendState(): BackendStateHandler {
-  const { value, update } = useLocalStorage(
-    "backend-state",
-    JSON.stringify(defaultState),
+  const { value: state, update } = useLocalStorage(
+    BACKEND_STATE_KEY,
+    defaultState,
   );
 
-  let parsed;
-  try {
-    parsed = JSON.parse(value!);
-  } catch {
-    parsed = undefined;
-  }
-  const state: BackendState = !parsed?.status ? defaultState : parsed;
-
   return {
     state,
     logOut() {
-      update(JSON.stringify({ ...defaultState }));
+      update(defaultState);
     },
     logIn(info) {
       //admin is defined by the username
@@ -110,7 +137,7 @@ export function useBackendState(): BackendStateHandler {
         ...info,
         isUserAdministrator: info.username === "admin",
       };
-      update(JSON.stringify(nextState));
+      update(nextState);
     },
   };
 }
diff --git a/packages/demobank-ui/src/hooks/index.ts 
b/packages/demobank-ui/src/hooks/index.ts
index 44b0598e6..e9c68812c 100644
--- a/packages/demobank-ui/src/hooks/index.ts
+++ b/packages/demobank-ui/src/hooks/index.ts
@@ -20,7 +20,8 @@
  */
 
 import { StateUpdater } from "preact/hooks";
-import { useLocalStorage } from "@gnu-taler/web-util/browser";
+import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser";
+import { codecForBoolean } from "@gnu-taler/taler-util";
 export type ValueOrFunction<T> = T | ((p: T) => T);
 
 const calculateRootPath = () => {
@@ -31,11 +32,14 @@ const calculateRootPath = () => {
   return rootPath;
 };
 
+const BACKEND_URL_KEY = buildStorageKey("backend-url");
+const TRIED_LOGIN_KEY = buildStorageKey("tried-login", codecForBoolean());
+
 export function useBackendURL(
   url?: string,
 ): [string, boolean, StateUpdater<string>, () => void] {
   const { value, update: setter } = useLocalStorage(
-    "backend-url",
+    BACKEND_URL_KEY,
     url || calculateRootPath(),
   );
 
@@ -43,10 +47,10 @@ export function useBackendURL(
     value: triedToLog,
     update: setTriedToLog,
     reset: resetBackend,
-  } = useLocalStorage("tried-login");
+  } = useLocalStorage(TRIED_LOGIN_KEY);
 
   const checkedSetter = (v: ValueOrFunction<string>) => {
-    setTriedToLog("yes");
+    setTriedToLog(true);
     const computedValue =
       v instanceof Function ? v(value) : v.replace(/\/$/, "");
     return setter(computedValue);
diff --git a/packages/demobank-ui/src/hooks/settings.ts 
b/packages/demobank-ui/src/hooks/settings.ts
index 325b583f9..46b31bf2a 100644
--- a/packages/demobank-ui/src/hooks/settings.ts
+++ b/packages/demobank-ui/src/hooks/settings.ts
@@ -14,36 +14,44 @@
  GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-import { useLocalStorage } from "@gnu-taler/web-util/browser";
+import {
+  Codec,
+  buildCodecForObject,
+  codecForString,
+  codecOptional,
+} from "@gnu-taler/taler-util";
+import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser";
 
 interface Settings {
   currentWithdrawalOperationId: string | undefined;
 }
 
+export const codecForSettings = (): Codec<Settings> =>
+  buildCodecForObject<Settings>()
+    .property("currentWithdrawalOperationId", codecOptional(codecForString()))
+    .build("Settings");
+
 const defaultSettings: Settings = {
   currentWithdrawalOperationId: undefined,
 };
 
-function parse_json_or_undefined<T>(str: string | undefined): T | undefined {
-  if (str === undefined) return undefined;
-  try {
-    return JSON.parse(str);
-  } catch {
-    return undefined;
-  }
-}
+const DEMOBANK_SETTINGS_KEY = buildStorageKey(
+  "demobank-settings",
+  codecForSettings(),
+);
 
 export function useSettings(): [
   Readonly<Settings>,
   <T extends keyof Settings>(key: T, value: Settings[T]) => void,
 ] {
-  const { value, update } = useLocalStorage("demobank-settings");
+  const { value, update } = useLocalStorage(
+    DEMOBANK_SETTINGS_KEY,
+    defaultSettings,
+  );
 
-  const parsed: Settings = parse_json_or_undefined(value) ?? defaultSettings;
   function updateField<T extends keyof Settings>(k: T, v: Settings[T]) {
-    const newValue = { ...parsed, [k]: v };
-    const json = JSON.stringify(newValue);
-    update(json);
+    const newValue = { ...value, [k]: v };
+    update(newValue);
   }
-  return [parsed, updateField];
+  return [value, updateField];
 }

-- 
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]