summaryrefslogtreecommitdiff
path: root/front/src/hooks/useLocalStorage.js
diff options
context:
space:
mode:
Diffstat (limited to 'front/src/hooks/useLocalStorage.js')
-rw-r--r--front/src/hooks/useLocalStorage.js31
1 files changed, 31 insertions, 0 deletions
diff --git a/front/src/hooks/useLocalStorage.js b/front/src/hooks/useLocalStorage.js
new file mode 100644
index 0000000..f00a11b
--- /dev/null
+++ b/front/src/hooks/useLocalStorage.js
@@ -0,0 +1,31 @@
+import { useState, useEffect } from "react";
+
+const STORAGE_KEYS_PREFIX = "chessh-";
+
+const useStorage = (storage, keyPrefix) => (storageKey, fallbackState) => {
+ if (!storageKey)
+ throw new Error(
+ `"storageKey" must be a nonempty string, but "${storageKey}" was passed.`
+ );
+
+ const storedString = storage.getItem(keyPrefix + storageKey);
+ let parsedObject = null;
+
+ if (storedString !== null) parsedObject = JSON.parse(storedString);
+
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ const [value, setValue] = useState(parsedObject ?? fallbackState);
+
+ // eslint-disable-next-line react-hooks/rules-of-hooks
+ useEffect(() => {
+ storage.setItem(keyPrefix + storageKey, JSON.stringify(value));
+ }, [value, storageKey]);
+
+ return [value, setValue];
+};
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+export const useLocalStorage = useStorage(
+ window.localStorage,
+ STORAGE_KEYS_PREFIX
+);