@lesnoypudge/utils-react
Version:
lesnoypudge's utils-react
50 lines (49 loc) • 1.77 kB
JavaScript
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