ahooks
Version:
react hooks library
81 lines (79 loc) • 2.87 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createUseStorageState = createUseStorageState;
var _tslib = require("tslib");
var _react = require("react");
var _useMemoizedFn = _interopRequireDefault(require("../useMemoizedFn"));
var _useUpdateEffect = _interopRequireDefault(require("../useUpdateEffect"));
var _utils = require("../utils");
/* eslint-disable no-empty */
function createUseStorageState(getStorage) {
function useStorageState(key, options) {
if (options === void 0) {
options = {};
}
var storage;
var _a = options.onError,
onError = _a === void 0 ? function (e) {
console.error(e);
} : _a;
// https://github.com/alibaba/hooks/issues/800
try {
storage = getStorage();
} catch (err) {
onError(err);
}
var serializer = function serializer(value) {
if (options === null || options === void 0 ? void 0 : options.serializer) {
return options === null || options === void 0 ? void 0 : options.serializer(value);
}
return JSON.stringify(value);
};
var deserializer = function deserializer(value) {
if (options === null || options === void 0 ? void 0 : options.deserializer) {
return options === null || options === void 0 ? void 0 : options.deserializer(value);
}
return JSON.parse(value);
};
function getStoredValue() {
try {
var raw = storage === null || storage === void 0 ? void 0 : storage.getItem(key);
if (raw) {
return deserializer(raw);
}
} catch (e) {
onError(e);
}
if ((0, _utils.isFunction)(options === null || options === void 0 ? void 0 : options.defaultValue)) {
return options === null || options === void 0 ? void 0 : options.defaultValue();
}
return options === null || options === void 0 ? void 0 : options.defaultValue;
}
var _b = (0, _tslib.__read)((0, _react.useState)(function () {
return getStoredValue();
}), 2),
state = _b[0],
setState = _b[1];
(0, _useUpdateEffect["default"])(function () {
setState(getStoredValue());
}, [key]);
var updateState = function updateState(value) {
var currentState = (0, _utils.isFunction)(value) ? value(state) : value;
setState(currentState);
if ((0, _utils.isUndef)(currentState)) {
storage === null || storage === void 0 ? void 0 : storage.removeItem(key);
} else {
try {
storage === null || storage === void 0 ? void 0 : storage.setItem(key, serializer(currentState));
} catch (e) {
console.error(e);
}
}
};
return [state, (0, _useMemoizedFn["default"])(updateState)];
}
return useStorageState;
}
;