mirror of https://github.com/vector-im/riot-web
Rewrite useLocalStorageState hook
parent
dc08fee635
commit
89ec90cf04
|
@ -32,7 +32,7 @@ import {IntegrationManagers} from "../../../integrations/IntegrationManagers";
|
||||||
import SettingsStore from "../../../settings/SettingsStore";
|
import SettingsStore from "../../../settings/SettingsStore";
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import {Resizable} from "re-resizable";
|
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
|
// The maximum number of widgets that can be added in a room
|
||||||
const MAX_WIDGETS = 2;
|
const MAX_WIDGETS = 2;
|
||||||
|
|
|
@ -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];
|
|
||||||
};
|
|
|
@ -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 = <T>(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 = <T>(key: string, initialValue: T) => {
|
||||||
|
const lsKey = "mx_" + key;
|
||||||
|
|
||||||
|
const [value, setValue] = useState<T>(getValue(lsKey, initialValue));
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setValue(getValue(lsKey, initialValue));
|
||||||
|
}, [lsKey, initialValue]);
|
||||||
|
|
||||||
|
const _setValue: Dispatch<SetStateAction<T>> = useCallback((v: T) => {
|
||||||
|
window.localStorage.setItem(lsKey, JSON.stringify(v));
|
||||||
|
setValue(v);
|
||||||
|
}, [lsKey]);
|
||||||
|
|
||||||
|
return [value, _setValue];
|
||||||
|
};
|
Loading…
Reference in New Issue