diff options
author | eug-vs <eugene@eug-vs.xyz> | 2022-05-06 18:25:20 +0400 |
---|---|---|
committer | eug-vs <eugene@eug-vs.xyz> | 2022-05-06 18:25:20 +0400 |
commit | 0e06183ee46edaca44a4b2f74ef1ea0e8174c8a3 (patch) | |
tree | 8f5e2b7f83bf5d30fab5dcdca3de3a21f3a6a974 /src/hooks/useLocalStorage.ts | |
parent | 29007c89c6cd725f69ff800c720faf89e5aa77ee (diff) | |
download | chrono-cube-ui-0e06183ee46edaca44a4b2f74ef1ea0e8174c8a3.tar.gz |
feat: persist solutions to localStorage
Diffstat (limited to 'src/hooks/useLocalStorage.ts')
-rw-r--r-- | src/hooks/useLocalStorage.ts | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..5893317 --- /dev/null +++ b/src/hooks/useLocalStorage.ts @@ -0,0 +1,30 @@ +import { useState, useCallback } from 'react'; + +function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T) => void] { + const [storedValue, setStoredValue] = useState<T>(() => { + try { + const item = window.localStorage.getItem(key); + return item ? JSON.parse(item) : initialValue; + } catch (error) { + console.log(error); + return initialValue; + } + }); + + const setValue = useCallback((value: T) => { + setStoredValue((originalValue: T) => { + try { + const valueToStore = value instanceof Function ? value(originalValue) : value; + window.localStorage.setItem(key, JSON.stringify(valueToStore)); + return valueToStore; + } catch (error) { + console.log(error); + } + }); + }, [key]); + + return [storedValue, setValue]; +} + +export default useLocalStorage; + |