diff options
Diffstat (limited to 'packages/web-util/src/hooks/useMemoryStorage.ts')
-rw-r--r-- | packages/web-util/src/hooks/useMemoryStorage.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/web-util/src/hooks/useMemoryStorage.ts b/packages/web-util/src/hooks/useMemoryStorage.ts new file mode 100644 index 000000000..7160b035e --- /dev/null +++ b/packages/web-util/src/hooks/useMemoryStorage.ts @@ -0,0 +1,75 @@ +/* + This file is part of GNU Anastasis + (C) 2021-2022 Anastasis SARL + + GNU Anastasis is free software; you can redistribute it and/or modify it under the + terms of the GNU Affero General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License along with + GNU Anastasis; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { useEffect, useState } from "preact/hooks"; +import { + ObservableMap, + browserStorageMap, + localStorageMap, + memoryMap, +} from "../utils/observable.js"; + +export interface LocalStorageState { + value?: string; + update: (s: string) => void; + reset: () => void; +} + +const storage: ObservableMap<string, string> = memoryMap<string>(); + +export function useMemoryStorage( + key: string, + initialValue: string, +): Required<LocalStorageState>; +export function useMemoryStorage(key: string): LocalStorageState; +export function useMemoryStorage( + key: string, + initialValue?: string, +): LocalStorageState { + const [storedValue, setStoredValue] = useState<string | undefined>( + (): string | undefined => { + return storage.get(key) ?? initialValue; + }, + ); + + useEffect(() => { + return storage.onUpdate(key, () => { + const newValue = storage.get(key); + setStoredValue(newValue ?? initialValue); + }); + }, []); + + const setValue = (value?: string): void => { + if (value === undefined) { + storage.delete(key); + } else { + storage.set(key, value); + } + }; + + return { + value: storedValue, + update: setValue, + reset: () => { + setValue(initialValue); + }, + }; +} |