summaryrefslogtreecommitdiff
path: root/front/src/hooks/useLocalStorage.js
blob: f00a11b36947e1ab90763fff4994a568f5573f54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
);