UNPKG

@yamada-ui/react

Version:

React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion

95 lines (91 loc) 3.32 kB
"use client"; const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs'); const require_utils_index = require('../../utils/index.cjs'); const require_hooks_use_window_event_index = require('../use-window-event/index.cjs'); let react = require("react"); react = require_rolldown_runtime.__toESM(react); //#region src/hooks/use-local-storage/index.ts const serializeJSON = (value, name) => { try { return JSON.stringify(value); } catch { throw new Error(`useLocalStorage ${name}: Failed to serialize the value`); } }; const deserializeJSON = (value) => { if (!value) return value; try { return JSON.parse(value); } catch { return value; } }; const createStorage = (type, name) => { const eventName = type === "localStorage" ? "local-storage" : "session-storage"; return ({ key, defaultValue = void 0, deserialize = deserializeJSON, getInitialValueInEffect = true, serialize = (value$1) => serializeJSON(value$1, name) }) => { const readStorageValue = (0, react.useCallback)((skipStorage) => { if (typeof window === "undefined" || !(type in window) || window[type] == null || skipStorage) return defaultValue ?? ""; const storageValue = window[type].getItem(key); return storageValue !== null ? deserialize(storageValue) : defaultValue ?? ""; }, [ key, deserialize, defaultValue ]); const [value, setValue] = (0, react.useState)(readStorageValue(getInitialValueInEffect)); const setStorageValue = (0, react.useCallback)((valOrFn) => { if ((0, require_utils_index.utils_exports.isFunction)(valOrFn)) setValue((current) => { const result = valOrFn(current); window[type].setItem(key, serialize(result)); window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: valOrFn(current) } })); return result; }); else { window[type].setItem(key, serialize(valOrFn)); window.dispatchEvent(new CustomEvent(eventName, { detail: { key, value: valOrFn } })); setValue(valOrFn); } }, [key, serialize]); const removeStorageValue = (0, react.useCallback)(() => { window[type].removeItem(key); setValue(defaultValue); }, [defaultValue, key]); require_hooks_use_window_event_index.useWindowEvent("storage", (ev) => { if (ev.storageArea === window[type] && ev.key === key) setValue(deserialize(ev.newValue ?? void 0)); }); require_hooks_use_window_event_index.useWindowEvent(eventName, (ev) => { if (ev.detail.key === key) setValue(ev.detail.value); }); (0, react.useEffect)(() => { if (defaultValue !== void 0 && value === void 0) setStorageValue(defaultValue); }, [ defaultValue, value, setStorageValue ]); (0, react.useEffect)(() => { if (getInitialValueInEffect) setValue(readStorageValue()); }, [getInitialValueInEffect, readStorageValue]); return [ value === void 0 ? defaultValue : value, setStorageValue, removeStorageValue ]; }; }; /** * `useLocalStorage` is a custom hook for storing, updating, and retrieving values in local storage. * * @see https://yamada-ui.com/docs/hooks/use-local-storage */ const useLocalStorage = (props) => createStorage("localStorage", "use-local-storage")(props); //#endregion exports.createStorage = createStorage; exports.useLocalStorage = useLocalStorage; //# sourceMappingURL=index.cjs.map