@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
JavaScript
"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