From 89ec90cf043d753baa4a15821dae0d758cabd3be Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 27 Aug 2020 10:27:27 +0100 Subject: [PATCH] Rewrite useLocalStorageState hook --- src/components/views/rooms/AppsDrawer.js | 2 +- src/hooks/useLocalStorage.ts | 37 -------------------- src/hooks/useLocalStorageState.ts | 44 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 38 deletions(-) delete mode 100644 src/hooks/useLocalStorage.ts create mode 100644 src/hooks/useLocalStorageState.ts diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 9b37dd3f4f..f58e0cc8e3 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -32,7 +32,7 @@ import {IntegrationManagers} from "../../../integrations/IntegrationManagers"; import SettingsStore from "../../../settings/SettingsStore"; import classNames from 'classnames'; import {Resizable} from "re-resizable"; -import {useLocalStorageState} from "../../../hooks/useLocalStorage"; +import {useLocalStorageState} from "../../../hooks/useLocalStorageState"; // The maximum number of widgets that can be added in a room const MAX_WIDGETS = 2; diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts deleted file mode 100644 index 2f110c58f2..0000000000 --- a/src/hooks/useLocalStorage.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import {useEffect, useRef, useState} from "react"; - -// Hook behaving like useState but persisting the value to localStorage. Returns same as useState -export const useLocalStorageState = (key: string, initialValue: boolean) => { - const lsKey = useRef("useLocalStorageState_" + key).current; - - const [value, setValue] = useState(() => { - try { - const item = window.localStorage.getItem(lsKey); - return item ? JSON.parse(item) : initialValue; - } catch (error) { - return initialValue; - } - }); - - useEffect(() => { - window.localStorage.setItem(lsKey, JSON.stringify(value)); - }, [lsKey, value]); - - return [value, setValue]; -}; diff --git a/src/hooks/useLocalStorageState.ts b/src/hooks/useLocalStorageState.ts new file mode 100644 index 0000000000..a75ab55402 --- /dev/null +++ b/src/hooks/useLocalStorageState.ts @@ -0,0 +1,44 @@ +/* +Copyright 2019 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {Dispatch, SetStateAction, useCallback, useEffect, useState} from "react"; + +const getValue = (key: string, initialValue: T): T => { + try { + const item = window.localStorage.getItem(key); + return item ? JSON.parse(item) : initialValue; + } catch (error) { + return initialValue; + } +}; + +// Hook behaving like useState but persisting the value to localStorage. Returns same as useState +export const useLocalStorageState = (key: string, initialValue: T) => { + const lsKey = "mx_" + key; + + const [value, setValue] = useState(getValue(lsKey, initialValue)); + + useEffect(() => { + setValue(getValue(lsKey, initialValue)); + }, [lsKey, initialValue]); + + const _setValue: Dispatch> = useCallback((v: T) => { + window.localStorage.setItem(lsKey, JSON.stringify(v)); + setValue(v); + }, [lsKey]); + + return [value, _setValue]; +};