From e89d2098041d265131915c4e006a51478ff664bb Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 6 Mar 2024 11:07:42 -0300 Subject: fix #8564 --- packages/merchant-backend-ui/build.mjs | 4 +- packages/merchant-backend-ui/tsconfig.json | 2 +- packages/taler-wallet-cli/tsconfig.json | 2 +- .../src/components/Checkbox.tsx | 1 + .../src/hooks/useSettings.ts | 8 +-- .../src/wallet/AddBackupProvider/state.ts | 71 +++++++++++----------- .../src/wallet/AddBackupProvider/test.ts | 6 ++ packages/web-util/build.mjs | 2 +- packages/web-util/src/hooks/useLocalStorage.ts | 51 ++++++++++------ packages/web-util/src/index.build.ts | 2 +- packages/web-util/src/utils/observable.ts | 10 +-- 11 files changed, 90 insertions(+), 69 deletions(-) (limited to 'packages') diff --git a/packages/merchant-backend-ui/build.mjs b/packages/merchant-backend-ui/build.mjs index bb1dd3ebf..e72113dc5 100755 --- a/packages/merchant-backend-ui/build.mjs +++ b/packages/merchant-backend-ui/build.mjs @@ -135,7 +135,7 @@ export const buildConfig = { '.woff2': 'file', '.eot': 'file', }, - target: ["es6"], + target: ["es2020"], format: "iife", platform: "browser", sourcemap: false, @@ -175,7 +175,7 @@ export const testingConfig = { '.woff2': 'file', '.eot': 'file', }, - target: ["es6"], + target: ["es2020"], format: "iife", platform: "node", sourcemap: true, diff --git a/packages/merchant-backend-ui/tsconfig.json b/packages/merchant-backend-ui/tsconfig.json index 7a4d70a17..d9cd57c4e 100644 --- a/packages/merchant-backend-ui/tsconfig.json +++ b/packages/merchant-backend-ui/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { /* Basic Options */ - "target": "ES6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ + "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ "module": "ESNext", /* Specify module code generation: 'none', commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ // "lib": [], /* Specify library files to be included in the compilation: */ "allowJs": true, /* Allow javascript files to be compiled. */ diff --git a/packages/taler-wallet-cli/tsconfig.json b/packages/taler-wallet-cli/tsconfig.json index 42f0d88a8..4b46790c8 100644 --- a/packages/taler-wallet-cli/tsconfig.json +++ b/packages/taler-wallet-cli/tsconfig.json @@ -2,7 +2,7 @@ "compileOnSave": true, "compilerOptions": { "composite": true, - "target": "ES2018", + "target": "ES2020", "module": "Node16", "moduleResolution": "Node16", "sourceMap": true, diff --git a/packages/taler-wallet-webextension/src/components/Checkbox.tsx b/packages/taler-wallet-webextension/src/components/Checkbox.tsx index 70dfab597..ec1b93a01 100644 --- a/packages/taler-wallet-webextension/src/components/Checkbox.tsx +++ b/packages/taler-wallet-webextension/src/components/Checkbox.tsx @@ -31,6 +31,7 @@ export function Checkbox({ label, description, }: Props): VNode { + return (
, (key: T, value: Settings[T]) => void, ] { - const { value, update } = useLocalStorage(SETTINGS_KEY); + const { value, update } = useLocalStorage(SETTINGS_KEY, defaultSettings); - const parsed: Settings = value ?? defaultSettings; function updateField(k: T, v: Settings[T]) { - update({ ...parsed, [k]: v }); + update({ ...value, [k]: v }); } - return [parsed, updateField]; + console.log("ASDeeeeASD") + return [value, updateField]; } diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts index e6d46a626..75b8e53c0 100644 --- a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts @@ -99,42 +99,45 @@ function useUrlState( } const constHref = href; - useDebounceEffect( - 500, - constHref == undefined - ? undefined - : async () => { - const req = await fetch(constHref).catch((e) => { - return setState({ - status: "network-error", - href: constHref, - }); - }); - if (!req) return; + async function checkURL() { + if (!constHref) { + return; + } + const req = await fetch(constHref).catch((e) => { + return setState({ + status: "network-error", + href: constHref, + }); + }); + if (!req) return; + + if (req.status >= 400 && req.status < 500) { + setState({ + status: "client-error", + code: req.status, + }); + return; + } + if (req.status > 500) { + setState({ + status: "server-error", + code: req.status, + }); + return; + } - if (req.status >= 400 && req.status < 500) { - setState({ - status: "client-error", - code: req.status, - }); - return; - } - if (req.status > 500) { - setState({ - status: "server-error", - code: req.status, - }); - return; - } + const json = await req.json(); + try { + const result = codec.decode(json); + setState({ status: "ok", result }); + } catch (e: any) { + setState({ status: "parsing-error", json }); + } + } - const json = await req.json(); - try { - const result = codec.decode(json); - setState({ status: "ok", result }); - } catch (e: any) { - setState({ status: "parsing-error", json }); - } - }, + useDebounceEffect( + 500, + constHref == undefined ? undefined : checkURL, [host, path], ); diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts index 598ca9369..66f64d82e 100644 --- a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts @@ -45,6 +45,12 @@ describe("AddBackupProvider states", () => { expect(state.name.value).eq(""); expect(state.url.value).eq(""); }, + (state) => { + expect(state.status).equal("select-provider"); + if (state.status !== "select-provider") return; + expect(state.name.value).eq(""); + expect(state.url.value).eq(""); + }, ], TestingContext, ); diff --git a/packages/web-util/build.mjs b/packages/web-util/build.mjs index efcf750bf..02d077571 100755 --- a/packages/web-util/build.mjs +++ b/packages/web-util/build.mjs @@ -99,7 +99,7 @@ const buildConfigBase = { outdir: "lib", bundle: true, minify: false, - target: ["es2021"], + target: ["es2020"], loader: { ".key": "text", ".crt": "text", diff --git a/packages/web-util/src/hooks/useLocalStorage.ts b/packages/web-util/src/hooks/useLocalStorage.ts index b460144a6..7c41f98be 100644 --- a/packages/web-util/src/hooks/useLocalStorage.ts +++ b/packages/web-util/src/hooks/useLocalStorage.ts @@ -19,7 +19,7 @@ * @author Sebastian Javier Marchano (sebasjm) */ -import { Codec, codecForString } from "@gnu-taler/taler-util"; +import { AbsoluteTime, Codec, codecForString } from "@gnu-taler/taler-util"; import { useEffect, useState } from "preact/hooks"; import { ObservableMap, @@ -61,12 +61,25 @@ const supportLocalStorage = typeof window !== "undefined"; const supportBrowserStorage = typeof chrome !== "undefined" && typeof chrome.storage !== "undefined"; + /** + * Build setting storage + */ const storage: ObservableMap = (function buildStorage() { if (supportBrowserStorage) { - return browserStorageMap(memoryMap()); + //browser storage is like local storage but + //with app sync. + //Works for almost every browser + if (supportLocalStorage) { + return browserStorageMap(localStorageMap()); + } else { + // service worker doesn't have local storage + return browserStorageMap(memoryMap()); + } } else if (supportLocalStorage) { + // fallback if browser is too old return localStorageMap(); } else { + // new need to save settings somewhere return memoryMap(); } })(); @@ -85,26 +98,14 @@ export function useLocalStorage( key: StorageKey, defaultValue?: Type, ): StorageState { - function convert(updated: string | undefined): Type | undefined { - if (updated === undefined) return defaultValue; //optional - try { - return key.codec.decode(JSON.parse(updated)); - } catch (e) { - //decode error - return defaultValue; - } - } - const [storedValue, setStoredValue] = useState( - (): Type | undefined => { - const prev = storage.get(key.id); - return convert(prev); - }, - ); + const current = convert(storage.get(key.id), key, defaultValue); + + const [_, setStoredValue] = useState(AbsoluteTime.now().t_ms); useEffect(() => { return storage.onUpdate(key.id, () => { - const newValue = storage.get(key.id); - setStoredValue(convert(newValue)); + // const newValue = storage.get(key.id); + setStoredValue(AbsoluteTime.now().t_ms); }); }, [key.id]); @@ -120,10 +121,20 @@ export function useLocalStorage( }; return { - value: storedValue, + value: current, update: setValue, reset: () => { setValue(defaultValue); }, }; } + +function convert(updated: string | undefined, key: StorageKey, defaultValue?: Type): Type | undefined { + if (updated === undefined) return defaultValue; //optional + try { + return key.codec.decode(JSON.parse(updated)); + } catch (e) { + //decode error + return defaultValue; + } +} diff --git a/packages/web-util/src/index.build.ts b/packages/web-util/src/index.build.ts index 4a52d1177..c0c5fc179 100644 --- a/packages/web-util/src/index.build.ts +++ b/packages/web-util/src/index.build.ts @@ -218,7 +218,7 @@ const defaultEsBuildConfig: esbuild.BuildOptions = { ".woff2": "file", ".eot": "file", }, - target: ["es6"], + target: ["es2020"], format: "esm", platform: "browser", jsxFactory: "h", diff --git a/packages/web-util/src/utils/observable.ts b/packages/web-util/src/utils/observable.ts index 01e655eaa..16a33ae72 100644 --- a/packages/web-util/src/utils/observable.ts +++ b/packages/web-util/src/utils/observable.ts @@ -118,6 +118,7 @@ export function localStorageMap(): ObservableMap { const total = localStorage.length; return { next() { + if (index === total) return { done: true, value: undefined }; const key = localStorage.key(index); if (key === null) { //we are going from 0 until last, this should not happen @@ -128,7 +129,6 @@ export function localStorageMap(): ObservableMap { //the key exist, this should not happen throw Error("value cant be null"); } - if (index == total) return { done: true, value: [key, item] }; index = index + 1; return { done: false, value: [key, item] }; }, @@ -165,12 +165,12 @@ export function localStorageMap(): ObservableMap { const total = localStorage.length; return { next() { + if (index === total) return { done: true, value: undefined }; const key = localStorage.key(index); if (key === null) { //we are going from 0 until last, this should not happen throw Error("key cant be null"); } - if (index == total) return { done: true, value: key }; index = index + 1; return { done: false, value: key }; }, @@ -185,6 +185,7 @@ export function localStorageMap(): ObservableMap { const total = localStorage.length; return { next() { + if (index === total) return { done: true, value: undefined }; const key = localStorage.key(index); if (key === null) { //we are going from 0 until last, this should not happen @@ -195,7 +196,6 @@ export function localStorageMap(): ObservableMap { //the key exist, this should not happen throw Error("value cant be null"); } - if (index == total) return { done: true, value: item }; index = index + 1; return { done: false, value: item }; }, @@ -247,11 +247,11 @@ function onBrowserStorageUpdate(cb: (changes: Changes) => void): void { export function browserStorageMap( backend: ObservableMap, ): ObservableMap { - getAllContent().then((content) => { + getAllContent().then(content => { Object.entries(content ?? {}).forEach(([k, v]) => { backend.set(k, v as string); }); - }); + }) backend.onAnyUpdate(async () => { const result: Record = {}; -- cgit v1.2.3