aboutsummaryrefslogtreecommitdiff
path: root/packages/web-util/src
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2024-03-06 11:07:42 -0300
committerSebastian <sebasjm@gmail.com>2024-03-06 11:07:42 -0300
commite89d2098041d265131915c4e006a51478ff664bb (patch)
tree45c4433147eb989efce148a8d9c00b541872cbe3 /packages/web-util/src
parent541886750eb1bc32b9aa0323868dd24776baf0eb (diff)
downloadwallet-core-e89d2098041d265131915c4e006a51478ff664bb.tar.xz
fix #8564
Diffstat (limited to 'packages/web-util/src')
-rw-r--r--packages/web-util/src/hooks/useLocalStorage.ts51
-rw-r--r--packages/web-util/src/index.build.ts2
-rw-r--r--packages/web-util/src/utils/observable.ts10
3 files changed, 37 insertions, 26 deletions
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<string, string> = (function buildStorage() {
if (supportBrowserStorage) {
- return browserStorageMap(memoryMap<string>());
+ //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<string>());
+ }
} else if (supportLocalStorage) {
+ // fallback if browser is too old
return localStorageMap();
} else {
+ // new need to save settings somewhere
return memoryMap<string>();
}
})();
@@ -85,26 +98,14 @@ export function useLocalStorage<Type = string>(
key: StorageKey<Type>,
defaultValue?: Type,
): StorageState<Type> {
- 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>(
- (): 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<Type = string>(
};
return {
- value: storedValue,
+ value: current,
update: setValue,
reset: () => {
setValue(defaultValue);
},
};
}
+
+function convert<Type>(updated: string | undefined, key: StorageKey<Type>, 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<string, string> {
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<string, string> {
//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<string, string> {
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<string, string> {
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<string, string> {
//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<string, string>,
): ObservableMap<string, string> {
- getAllContent().then((content) => {
+ getAllContent().then(content => {
Object.entries(content ?? {}).forEach(([k, v]) => {
backend.set(k, v as string);
});
- });
+ })
backend.onAnyUpdate(async () => {
const result: Record<string, string> = {};