UNPKG

@lesnoypudge/utils-react

Version:

lesnoypudge's utils-react

50 lines (49 loc) 1.77 kB
import { useConst } from "../../hooks/useConst/useConst.js"; import { useFunction } from "../../hooks/useFunction/useFunction.js"; import { useLatest } from "../../hooks/useLatest/useLatest.js"; import { useStateWithRef } from "../../hooks/useStateWithRef/useStateWithRef.js"; import { isCallable } from "@lesnoypudge/utils"; import { LocalStorage } from "@lesnoypudge/utils-web"; import { useEffect } from "react"; const createLocalStorageHook = () => { const _localStorage = new LocalStorage(); const useLocalStorage = (key, defaultValue) => { const _key = useConst(() => key); const defaultValueRef = useLatest(defaultValue); const [state, stateRef, setState] = useStateWithRef(_localStorage.get(_key, defaultValue)); useEffect(() => { return _localStorage.onChange(_key, (newValue) => { const value = ( // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing newValue === void 0 ? defaultValueRef.current : newValue ); setState(value); }); }, [_key, defaultValueRef, setState]); const setStorageState = useFunction((newValue) => { const value = (isCallable(newValue) ? newValue(stateRef.current) : newValue) ?? defaultValueRef.current; if (value === void 0) return; _localStorage.set(_key, value); }); const clear = useFunction(() => { _localStorage.clear(); }); const remove = useFunction(() => { _localStorage.remove(_key); }); const resultObject = { value: state, setValue: setStorageState, clear, remove }; return { [_key]: resultObject }; }; return useLocalStorage; }; export { createLocalStorageHook }; //# sourceMappingURL=createLocalStorageHook.js.map