File size: 703 Bytes
05c5ed5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"use client";

import { getStorageManager } from "lib/browser-stroage";
import { isFunction } from "lib/utils";
import {
  Dispatch,
  SetStateAction,
  useCallback,
  useMemo,
  useState,
} from "react";

export const useStateWithBrowserStorage = <T>(
  key: string,
  fallbackValue?: T,
) => {
  const storage = useMemo(() => getStorageManager<T>(key), [key]);
  const [state, _setState] = useState<T>(storage.get(fallbackValue!));

  const setState = useCallback<Dispatch<SetStateAction<T>>>(
    (value) => {
      const nextValue = isFunction(value) ? value(state) : value;
      storage.set(nextValue);
      _setState(nextValue);
    },
    [state],
  );

  return [state, setState] as const;
};