taro-hooks
Version:
为 Taro 而设计的 Hooks Library
170 lines • 4.87 kB
JavaScript
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;