2023-07-25 20:27:29 +03:00
|
|
|
import { useEffect, useState } from 'react';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-10-23 18:22:55 +03:00
|
|
|
function useLocalStorage<ValueType>(
|
|
|
|
key: string,
|
|
|
|
defaultValue: ValueType | (() => ValueType)
|
|
|
|
) {
|
|
|
|
const [value, setValue] = useState<ValueType>(
|
|
|
|
() => {
|
|
|
|
const loadedJson = localStorage.getItem(key);
|
|
|
|
if (loadedJson != null) {
|
|
|
|
return JSON.parse(loadedJson) as ValueType;
|
|
|
|
} else if (typeof defaultValue === 'function') {
|
|
|
|
return (defaultValue as () => ValueType)();
|
|
|
|
} else {
|
|
|
|
return defaultValue;
|
|
|
|
}
|
2023-07-15 17:46:19 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-25 20:27:29 +03:00
|
|
|
if (value === undefined) {
|
2023-07-15 17:46:19 +03:00
|
|
|
localStorage.removeItem(key)
|
|
|
|
} else {
|
|
|
|
localStorage.setItem(key, JSON.stringify(value));
|
|
|
|
}
|
|
|
|
}, [key, value]);
|
|
|
|
|
2023-10-23 18:22:55 +03:00
|
|
|
return [value, setValue] as [ValueType, typeof setValue];
|
|
|
|
}
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-07-25 20:27:29 +03:00
|
|
|
export default useLocalStorage;
|