UNPKG

ahooks

Version:
81 lines (79 loc) 2.87 kB
"use strict"; 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; }