ahooks
Version:
react hooks library
148 lines (147 loc) • 6.17 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _tslib = require("tslib");
var _react = require("react");
var _useCreation = _interopRequireDefault(require("../../../useCreation"));
var _useUnmount = _interopRequireDefault(require("../../../useUnmount"));
var cache = _interopRequireWildcard(require("../utils/cache"));
var cachePromise = _interopRequireWildcard(require("../utils/cachePromise"));
var cacheSubscribe = _interopRequireWildcard(require("../utils/cacheSubscribe"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var useCachePlugin = function useCachePlugin(fetchInstance, _a) {
var cacheKey = _a.cacheKey,
_b = _a.cacheTime,
cacheTime = _b === void 0 ? 5 * 60 * 1000 : _b,
_c = _a.staleTime,
staleTime = _c === void 0 ? 0 : _c,
customSetCache = _a.setCache,
customGetCache = _a.getCache;
var unSubscribeRef = (0, _react.useRef)();
var currentPromiseRef = (0, _react.useRef)();
var _setCache = function _setCache(key, cachedData) {
if (customSetCache) {
customSetCache(cachedData);
} else {
cache.setCache(key, cacheTime, cachedData);
}
cacheSubscribe.trigger(key, cachedData.data);
};
var _getCache = function _getCache(key, params) {
if (params === void 0) {
params = [];
}
if (customGetCache) {
return customGetCache(params);
}
return cache.getCache(key);
};
(0, _useCreation["default"])(function () {
if (!cacheKey) {
return;
}
// get data from cache when init
var cacheData = _getCache(cacheKey);
if (cacheData && Object.hasOwnProperty.call(cacheData, 'data')) {
fetchInstance.state.data = cacheData.data;
fetchInstance.state.params = cacheData.params;
if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {
fetchInstance.state.loading = false;
}
}
// subscribe same cachekey update, trigger update
unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, function (data) {
fetchInstance.setState({
data: data
});
});
}, []);
(0, _useUnmount["default"])(function () {
var _a;
(_a = unSubscribeRef.current) === null || _a === void 0 ? void 0 : _a.call(unSubscribeRef);
});
if (!cacheKey) {
return {};
}
return {
onBefore: function onBefore(params) {
var cacheData = _getCache(cacheKey, params);
if (!cacheData || !Object.hasOwnProperty.call(cacheData, 'data')) {
return {};
}
// If the data is fresh, stop request
if (staleTime === -1 || new Date().getTime() - cacheData.time <= staleTime) {
return {
loading: false,
data: cacheData === null || cacheData === void 0 ? void 0 : cacheData.data,
error: undefined,
returnNow: true
};
} else {
// If the data is stale, return data, and request continue
return {
data: cacheData === null || cacheData === void 0 ? void 0 : cacheData.data,
error: undefined
};
}
},
onRequest: function onRequest(service, args) {
var servicePromise = cachePromise.getCachePromise(cacheKey);
// If has servicePromise, and is not trigger by self, then use it
if (servicePromise && servicePromise !== currentPromiseRef.current) {
return {
servicePromise: servicePromise
};
}
servicePromise = service.apply(void 0, (0, _tslib.__spreadArray)([], (0, _tslib.__read)(args), false));
currentPromiseRef.current = servicePromise;
cachePromise.setCachePromise(cacheKey, servicePromise);
return {
servicePromise: servicePromise
};
},
onSuccess: function onSuccess(data, params) {
var _a;
if (cacheKey) {
// cancel subscribe, avoid trgger self
(_a = unSubscribeRef.current) === null || _a === void 0 ? void 0 : _a.call(unSubscribeRef);
_setCache(cacheKey, {
data: data,
params: params,
time: new Date().getTime()
});
// resubscribe
unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, function (d) {
fetchInstance.setState({
data: d
});
});
}
},
onMutate: function onMutate(data) {
var _a;
if (cacheKey) {
// cancel subscribe, avoid trigger self
(_a = unSubscribeRef.current) === null || _a === void 0 ? void 0 : _a.call(unSubscribeRef);
_setCache(cacheKey, {
data: data,
params: fetchInstance.state.params,
time: new Date().getTime()
});
// resubscribe
unSubscribeRef.current = cacheSubscribe.subscribe(cacheKey, function (d) {
fetchInstance.setState({
data: d
});
});
}
}
};
};
var _default = useCachePlugin;
exports["default"] = _default;
;