UNPKG

taro-hooks

Version:
170 lines 4.87 kB
function _call(body, then, direct) { if (direct) { return then ? then(body()) : body(); } try { var result = Promise.resolve(body()); return then ? result.then(then) : result; } catch (e) { return Promise.reject(e); } } function _catch(body, recover) { try { var result = body(); } catch (e) { return recover(e); } if (result && result.then) { return result.then(void 0, recover); } return result; } function _empty() {} function _continueIgnored(value) { if (value && value.then) { return value.then(_empty); } } function _async(f) { return function () { for (var args = [], i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } try { return Promise.resolve(f.apply(this, args)); } catch (e) { return Promise.reject(e); } }; } function _await(value, then, direct) { if (direct) { return then ? then(value) : value; } if (!value || !value.then) { value = Promise.resolve(value); } return then ? value.then(then) : value; } function _invoke(body, then) { var result = body(); if (result && result.then) { return result.then(then); } return then(result); } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } import { setStorage, getStorage, getStorageInfo, removeStorage, clearStorage } from '@tarojs/taro'; import { useEffect, useState } from '@taro-hooks/core'; import { logError, escapeState, isString } from '@taro-hooks/shared'; import usePromise from '../usePromise'; import getStorageSpaceInfo from './utils/index'; import { generateGeneralFail } from '../utils/tool'; var initStorageInfo = { currentSize: 0, limitSize: 0, keys: [], storage: {} }; function useStorage() { var get = _async(function (key) { var _exit = false; return _catch(function () { var getKeys = []; return _invoke(function () { if (!key) { return _call(getStorageInfo, function (_ref2) { var keys = _ref2.keys; if (!(keys != null && keys.length)) { var _temp = {}; _exit = true; return _temp; } getKeys = keys; }); } else { getKeys = [key].flat(); } }, function (_result) { return _exit ? _result : _await(Promise.all(getKeys.map(function (payload) { return getStorage({ key: payload }); })), function (storageGroup) { var storageMap = Object.fromEntries(storageGroup.map(function (storage, index) { var data = storage == null ? void 0 : storage.data; try { data = JSON.parse(data); } catch (e) { logError('parse storage data failed', e); } return [getKeys[index], data]; })); return isString(key) ? storageMap[key] : storageMap; }); }); }, function (e) { return generateGeneralFail('getStorage', e.errMsg || e.message); }); }); var _useState = useState(initStorageInfo), storageInfo = _useState[0], setStorageInfo = _useState[1]; var setAsync = usePromise(setStorage); function set(key, data) { var setStorageData = data; try { setStorageData = JSON.stringify(data); } catch (e) { logError('can not convert json, use empty string instaned', e); } return setAsync({ key: key, data: setStorageData }).then(function (res) { generateStorageInfo(); return res; }); } var removeAsync = usePromise(removeStorage); var clearAsync = usePromise(clearStorage); var remove = function remove(key) { var removeHandler = key ? removeAsync({ key: key }) : clearAsync(); return removeHandler.then(function (res) { setStorageInfo(_extends({}, escapeState(storageInfo), { keys: [], storage: {} })); return res; }); }; var generateStorageInfo = _async(function () { return _continueIgnored(_catch(function () { return _call(getStorageInfo, function (_ref) { var keys = _ref.keys; return _call(getStorageSpaceInfo, function (spaceInfo) { return _call(get, function (storage) { setStorageInfo(_extends({}, spaceInfo, { keys: keys, storage: storage })); }); }); }); }, function (e) { logError('generateStorageInfo failed', e); })); }); useEffect(function () { generateStorageInfo(); }, []); return [storageInfo, { set: set, get: get, remove: remove }]; } export default useStorage;